小生博客:http://xsboke.blog.51cto.com

-------谢谢您的参考,如有疑问,欢迎交流


环境说明:

mysql主从复制,主库A宕机,将从库B提升为了主库(假设你这时候才开启了从库的binlog日志) 现在要新搞一个数据库C用来替代旧的主库A,那么C库的数据肯定要以B库为主, 所以我们使用B库的备份来恢复数据 将B作为主,C库作为从, 你需要将C库恢复到B库提升为主库时的数据,才可以将C库作为新的从库使用(才可以change master)

以A库的binlog日志为主,介绍当前的备份状态:

mysql-bin.00100 mysql-bin.00101 在mysql-bin.00101的时候从库做了备份并且保有slave status信息 mysql-bin.00102 mysql-bin.00103 mysql-bin.00104 主库是在mysql-bin.00104的时候宕机的 mysql-bin.00105

所以我打算这样做:

1. 用从库的全备恢复数据,2. 然后用主库的binlog恢复后来的数据,3. 再使用从库的中继日志恢复主库缺少的数据.

在这过程中我发现了问题(关于[3.]的解释): 主库宕机时,我发现有几条数据主库的binlog日志没有,但是从库的中继日志中却有, 所以我从中继日志中把主库没有但是从库有的sql复制了出来, 然后放到了文件名为addsql.sql中

我在mysql-bin.00101时的全备,备份时从库的slave status是这样的:

Master_Log_File: mysql-bin.00101 Read_Master_Log_Pos: 888301479 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 31921757 Relay_Master_Log_File: mysql-bin.00100 # 从库SQL线程已经执行到的binlog日志 Slave_IO_Running: No Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 31921467 # 从库SQL线程已经执行到的binlog日志的position Relay_Log_Space: 1962055058

注意:如果要使C库数据和B库一样,那么要以Relay_Master_Log_File和Exec_Master_Log_Pos这两个参数为准恢复数据

我的操作流程是这样的:

1. 首先在C库上导入,在mysql-bin.00101的时候从库的备份, 2. 根据从库做全备时保留的slave status,将mysql-bin.00100中还没有同步的数据导出为sql,(mysqlbinlog --start-position=31921467 /mysql-bin.00100 > ./100.sql). 3. 然后陆续将mysql-bin.00101之后和主库宕机时mysql-bin.00104的binlog日志转为sql. 4. 将这些sql导入. 5. 将addsql.sql导入. 6. B库授权replication slave,然后C库change master 到B库即可