MySQL 备份及主从恢复
环境信息
- Centos 7
- Mysql 5.7
- Percona-XtraBackup-2.4.4
恢复方法1:mysqldump 主库锁表备份恢复
前提 : 接受主库锁表操作,备份恢复过程中主库无法写入数据
从库停止slave进程
登录 mysql 从库,执行以下命令,停止 slave 进程
stop slave; |
主库锁表
登录 mysql 主库,执行以下命令,对主库进行锁表操作
FLUSH TABLES WITH READ LOCK; |
执行锁表操作后,不要退出 mysql 命令行,否则会自动解锁。
执行以下命令,查看主库锁表后的 binlog 位置信息
SHOW MASTER STATUS\G |
备份主库数据库数据
执行以下命令备份数据库 db1
mysqldump -uroot -p --master-data=2 --databases db1 > db1.sql |
--master-data=2
将日志名和位置写入到备份结果并注释,可以从备份文件中搜索change master to
查看binlog
文件名和position
主库备份完成后,可以解锁:
UNLOCK TABLES; |
从库恢复主库的备份数据
将主库的备份数据拷贝到从库,使用备份数据覆盖恢复从库
mysql -uroot -p db1 < db1.sql |
从库恢复备份完成后,和主库建立主从连接
change master to master_host='1.1.1.1',master_user='repl',master_password='pswd',master_port=3306,master_log_file='mysql-bin.000196',master_log_pos=1037640668; |
配置完成后,通过以下命令,查看主从状态
show slave status\G |
主要关注以下项:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
恢复方法2:mysqldump 主库不锁表备份恢复
从库停止 slave 进程
登录 mysql 从库,执行以下命令,停止 slave 进程
stop slave; |
备份主库数据库数据
mysqldump -uroot -p --master-data=2 --single-transaction -R --databases db01 > db01.sql |
--master-data=2
: 实现将日志名和位置写入到备份结果并注释,db01.sql
中会包含当前日志的文件名以及位置--routines, -R
:导出存储过程和函数
从库导入备份
将主库的备份数据拷贝到从库,并进行恢复
mysql -uroot -p db01 < db01.sql |
备份文件中查看binlog日志文件名和position
在备份文件(db01.sql
)中搜索 CHANGE MASTER TO
, 结果中可以获取到 binlog
日志文件名和 position
建立主从连接
根据上一步获取到的 binlog
文件名和 `position 信息,建立主从连接并启动
change master to master_host='1.1.1.1',master_user='repl',master_password='pswd',master_port=3306,master_log_file='mysql-bin.000196',master_log_pos=1037640668; |
通过命令 show slave status\G
检查主从同步状态
恢复方法3: xbackup 整库备份恢复
xbackup安装
yum install -y libaio-devel.x86_64 bzip2 |
主库整库备份
innobackupex --defaults-file=/etc/my.cnf --user=root --password=PASSWD --port=3306 --socket=/var/lib/mysql/mysql.sock [--databases "db1 db2 "] ${backup_data_dir} |
从库整库恢复
拷贝主库备份数据到从库,在从库上执行以下命令恢复数据
cd ${backup_data_dir} |
建立主从连接
备份数据中的 xtrabackup_binlog_info
文件包含了从库建立主从连接时需要的 binlog 信息,根据此文件中的信息,在从库执行命令,建立主从连接
change master to master_host='1.1.1.1',master_user='repl',master_password='pswd',master_port=3306,master_log_file='mysql-bin.000196',master_log_pos=1037640668; |
通过命令 show slave status\G
检查主从同步状态