MySQL主从数据恢复

发布时间 2023-08-29 14:31:05作者: lvguoliang(学无止境)

主要步骤: 导出主库数据,恢复到从库,重新开启主从同步。

 1. 先停止从库

从库上执行 stop slave;

 2  在从库mysql bin目录下导出主库数据

./mysqldump -h192.168.174.201 --port=3359 -uroot -p'pwd' --default-character-set=UTF8MB4 --single-transaction --events --triggers --routines --master-data=2 --all-databases > /data/bak.sql

-h192.168.174.201  指定主库的服务器地址(也可以不加这个参数,在主库上导出数据再scp到从库服务器)

--port=3359   数据库端口

--default-character-set 指定导出字符集

--single-transaction  开启单个事务,导出过程不加锁。确保导出的数据就是截止到执行导出命令的时间点。此选项会将隔离级别设置为:REPEATABLE READ。需没有下列语句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因为一致性读不能隔离上述语句。所以如果在dump过程中,使用上述语句,可能会导致dump出来的文件数据不一致或者不可用

--events --triggers --routines   导出所有的事件, 触发器,存储过程

--master-data=1   2以注释的形式写出导出时间点的binlog名字及位置。1不注释,恢复数据的时候会直接执行

--all-databases    导出所有库, 如果单个库直接最后面写库名字,如果是某个表在库名后面写表名, 如果是多个库则--databases后面写多个库,空格隔开

--set-gtid-purged=off   再介绍下这个参数,开启GTID时有用。如果是on会设置导出的数据库GTID和主库一致,导入的数据不会改变binlog。如果不是全库导出设成off,因为会导出所有GTID。如果导出的数据库有可能作为主库则必须设成off, 因为on不生成binlog, 从库无法同步导入的数据。如果作为从库恢复数据,建议设成on,off导入的数据会重新生成一套GTID。

 3.  恢复从库数据,mysql bin目录下执行

mysql -uroot -p'pwd' < /data/bak.sql

如果是恢复到某个库就在后面加上库名   mysql -uroot -p'pwd' databasenamexxx < /data/bak.sql

4.  重新开启主从同步

如果导出时--master-data=1则直接开启主从同步即可, start slave;

如果导出时--master-data=2则head -n 100 bak.sql   查看前几行有binlog文件名和位置。在从库上执行如下步骤

reset slave all;  //重置从库binlog等信息

change master to master_host='192.168.174.210', master_port=3306, master_user='root',master_password='bwt4567', master_log_file='mysql-bin.000006',master_log_pos=157; //指定主从同步

change master to master_host = '192.168.174.210', master_port = 3306, master_user = 'root',master_password='bwt4567',master_auto_position = 1; //如果开启GTID,则更简单,不需要指定binlog同步位置

start slave;

查看从库状态, 如果这俩个线程运行状态都是yes, 则代表主从启动成功。

show slave status;