一、MySQL备份恢复
常用工具:
- mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
- xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
1.1 mysqldump工具
语法:
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] –B DB1 [DB2 DB3...]
mysqldump [OPTIONS] –A [OPTIONS]
选项:
-A, --all-databases 备份所有数据库,含create database
-B , --databases db_name… 指定备份的数据库,包括create database语句
-E, --events 备份相关的所有event scheduler
-R, --routines 备份所有存储过程和自定义函数
--triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--default-character-set=utf8 指定字符集
--master-data[=#]: 此选项须启用二进制日志
1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
2:记录为注释的CHANGE MASTER TO语句
此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--single-transaction)
-F, --flush-logs 备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,--master-data 一起使用实现,此时只刷新一次日志
按存储引擎分类:
- MyISAM备份选项:
支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
锁定方法如下:
-x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能
注意:数据量大时,可能会导致长时间无法并发访问数据库
-l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致
注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
- InnoDB备份选项: 支持热备,可用温备但不建议用
--single-transaction
此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥
备份大型表时,建议将--single-transaction选项和--quick结合一起使用
示例1:完全备份Innodb存储引擎数据库
BACKUP_TIME=`date +%F-%H%M`
mysqldump –uroot -p -A --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
示例2:完全备份MyISAM存储引擎数据库
BACKUP_TIME=`date +%F-%H%M`
mysqldump –uroot -A -x --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
1.2 xtrabackup
备份语法:
xtrabackup [option] BACKUP-ROOT-DIR
选项:
--user 该选项表示备份账号
--password 该选项表示备份的密码
--host 该选项表示备份数据库的地址
--databases 该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file 该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental 该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir 该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir 该选项表示还原时增量备份的目录
--include=name 指定表名,格式:databasename.tablename
--apply-log 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
--use-memory 和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
--export 表示开启可导出单独的表之后再导入其他Mysql中
--redo-only 此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
还原语法:
xtrabackup --copy-back [选项] BACKUP-DIR
innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR
选项:
--copy-back 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back 这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
1.2.1 xtrabackup 备份相关文件
- 使用xtrabackup备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。
这些文件会被保存至一个以时间命名的目录中,在备份时,xtrabackup还会在备份目录中创建如下文件:
- xtrabackup_info:xtrabackup工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
- xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
- xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
- backup-my.cnf:备份命令用到的配置选项信息
- xtrabackup_logfile:备份生成的日志文件
示例1:xtrabackup完全备份及还原
1. 在原主机做完全备份到/backup
xtrabackup -uroot -p --backup --target-dir=/backup/
2. 目标主机
scp -r /backup/* root@172.16.77.132:/backups
xtrabackup --prepare --target-dir=/backups/ ##预准备:确保数据一致,提交完成的事务,回滚未完成的事务
/etc/init.d/mysqld stop
rm -rf /data/mysql-5.7/*
xtrabackup --copy-back --target-dir=/backups/ ##复制到数据库目录,确保原目录为空
chown -R mysql:mysql /data/mysql-5.7 ##还原属性
/etc/init.d/mysqld start ##启动服务
mysql -uroot -p000000 ##简单测试
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| hellodb |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
8 rows in set (0.01 sec)
mysql> exit
Bye
示例2:xtrabackup完全,增量备份及还原
1. 备份操作
1)完全备份
xtrabackup -uroot -p000000 --backup --target-dir=/backup/base
2)修改数据
mysql -uroot -p000000
UPDATE hellodb.students SET classid=+1;
Query OK, 0 rows affected (0.02 sec)
Rows matched: 25 Changed: 25 Warnings: 0
quit
3)增量备份
xtrabackup -uroot -p000000 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
scp -r /backup/* 172.16.77.132:/backups/ ##拷贝备份目录到目标主机
2. 还原操作
1)预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
xtrabackup --prepare --apply-log-only --target-dir=/backups/base
2)合并增量备份到完全备份
xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1
3)复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
xtrabackup --copy-back --target-dir=/backups/base
4)还原属性
chown -R mysql:mysql /data/mysql-5.7
5)启动服务
/etc/init.d/mysqld start
mysql -uroot -p000000 ##简单测试
mysql> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
| 1 | Shi Zhongyu | 22 | M | 1 | 3 |
| 2 | Shi Potian | 22 | M | 1 | 7 |
| 3 | Xie Yanke | 53 | M | 1 | 16 |
| 4 | Ding Dian | 32 | M | 1 | 4 |
| 5 | Yu Yutong | 26 | M | 1 | 1 |
| 6 | Shi Qing | 46 | M | 1 | NULL |
| 7 | Xi Ren | 19 | F | 1 | NULL |
| 8 | Lin Daiyu | 17 | F | 1 | NULL |
| 9 | Ren Yingying | 20 | F | 1 | NULL |
| 10 | Yue Lingshan | 19 | F | 1 | NULL |
| 11 | Yuan Chengzhi | 23 | M | 1 | NULL |
| 12 | Wen Qingqing | 19 | F | 1 | NULL |
| 13 | Tian Boguang | 33 | M | 1 | NULL |
| 14 | Lu Wushuang | 17 | F | 1 | NULL |
| 15 | Duan Yu | 19 | M | 1 | NULL |
| 16 | Xu Zhu | 21 | M | 1 | NULL |
| 17 | Lin Chong | 25 | M | 1 | NULL |
| 18 | Hua Rong | 23 | M | 1 | NULL |
| 19 | Xue Baochai | 18 | F | 1 | NULL |
| 20 | Diao Chan | 19 | F | 1 | NULL |
| 21 | Huang Yueying | 22 | F | 1 | NULL |
| 22 | Xiao Qiao | 20 | F | 1 | NULL |
| 23 | Ma Chao | 23 | M | 1 | NULL |
| 24 | Xu Xian | 27 | M | 1 | NULL |
| 25 | Sun Dasheng | 100 | M | 1 | NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)
1.3 生产环境实战备份策略
编写shell脚本,支持让用户自主选择,使用mysqldump还是xtrabackup全量备份。
cat mysql_backup.sh
#!/bin/bash
while true
do
read -p "Enter mysqldump or xtrabackup: " option
case $option in
mysqldump)
for db in `mysql -uroot -p000000 -e 'show databases'|grep -Ev '^(information_schema|performance_schema|Database)$'`;do mysqldump -uroot -p000000 -B $db --single-transaction --master-data=2 |gzip > /data/$db.sql.gz ;done
;;
xtrabackup)
xtrabackup -uroot -p000000 --backup --target-dir=/backup/`date +%F-%H%M`
;;
*)
echo "invalide selection,please try again"
break
;;
esac
done
二、MySQL集群
2.1 主从复制
每个节点都有相同的数据集,向外扩展;主要通过复制二进制日志实现,单向。
复制功用:
- 数据分布
- 负载均衡读
- 备份
- 高可用和故障切换
- MySQL升级测试
2.1.1 主从复制架构
常见部署架构:
2.1.2 主从复制工作原理
2.1.3 主从复制配置
1. 主节点配置
vi /etc/my.cnf
log-bin # 启用二进制日志
server_id=1 #为当前节点设置全局唯一的ID号
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY '000000'; ##创建一个具有复制权限的账号
2. 从节点配置
vi /etc/my.cnf
server_id=2 #为当前节点设置全局唯一的ID号
read_only=on #设置数据库只读
mysql -uroot -p000000
CHANGE MASTER TO MASTER_HOST='172.16.77.132',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='mariadb-bin.xxxxxx',
MASTER_LOG_POS=#;
start slave;
show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.77.132
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000004
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: localhost-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.2 高可用
2.2.1 MHA简介
Master High Availability(MHA),对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。
2.2.2 MHA集群架构
2.2.3 MHA工作原理
- 从宕机崩溃的master保存二进制日志事件(binlog events)
- 识别含有最新更新的slave
- 应用差异的中继日志(relay log)到其他的slave
- 应用从master保存的二进制日志事件(binlog events)
- 提升一个slave为新的master
- 使其他的slave连接新的master进行复制
2.3.4 MHA实现
管理节点:
1. 安装软件包
yum -y install mha4mysql*.rpm
2. 创建配置文件
mkdir /etc/mha
vim /etc/mha/app1.cnf
[server default]
user=mhauser
password=000000
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=000000
ping_interval=1
[server1]
hostname=172.16.77.131
candidate_master=1
[server2]
hostname=172.16.77.132
candidate_master=1
[server3]
hostname=172.16.77.133
3. 修改配置文件(主节点)
vim /etc/my.cnf
[mysqld]
log-bin ##启用二进制日志
server_id=2 #为当前节点设置全局唯一的ID号
skip_name_resolve=1
4. 在所有节点实现相互之间ssh key验证
ssh-keygen -t rsa -P ' '
scp -r .ssh 172.16.77.133:/root/
scp -r .ssh 172.16.77.132:/root/
scp -r .ssh 172.16.77.131:/root/
被管理节点:
1. 安装软件包
yum -y install mha*.rpm
2. 创建相应账号(主节点)
mysql -uroot -p000000
mysql> show master logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 177 |
| localhost-bin.000002 | 177 |
| localhost-bin.000003 | 177 |
| localhost-bin.000004 | 333 |
| localhost-bin.000005 | 177 |
| localhost-bin.000006 | 177 |
| localhost-bin.000007 | 154 |
+----------------------+-----------+
7 rows in set (0.00 sec)
grant replication slave on *.* to repluser@'172.16.77.%' identified by '000000';;
grant all on *.* to mhauser@'172.16.77.%' identified by '000000';
3. 编辑配置文件(从节点)
[mysqld]
server_id=1 #为当前节点设置全局唯一的ID号
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1
4. 指向主节点(从节点)
mysql -uroot -p000000
CHANGE MASTER TO MASTER_HOST='172.16.77.132',
MASTER_USER='repluser',
MASTER_PASSWORD='000000',
MASTER_LOG_FILE='localhost-bin.000007',
MASTER_LOG_POS=154;
管理节点:
1. 验证配置
masterha_check_ssh --conf=/etc/mha/app1.conf
masterha_check_repl --conf=/etc/mha/app1.conf
2. 启动进程
masterha_manager --conf=/etc/mha/app1.conf
测试:
1. 模拟主节点故障
/etc/init.d/mysqld stop ##主节点执行
2. 查看主从状态
[root@localhost ~]# mysql -uroot -p000000 -e "show slave status\G" ##从节点执行
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.77.131
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000017
Read_Master_Log_Pos: 194
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 375
Relay_Master_Log_File: localhost-bin.000017
Slave_IO_Running: Yes
Slave_SQL_Running: Yes