小生博客: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庫即可