通過MySQL relaylog + SQL_Thread 增量恢復binlog
資料回檔常常是使用全量備份+binlog增量實現的。
而資料量很大的情況下,增量恢復binlog一直是一個苦惱的問題,因為恢復binlog速度十分慢,並且容易出錯。
恢復binlog檔案一般有兩種方法:
〇 先解析成sql檔案,再匯入MySQL
〇 直接管道到MySQL中
關於這種方式的更多info,可以參考:
https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html
然而這兩種方式原理都是一樣的,通過mysqlbinlog解析成sql並匯入到MySQL中。
〇 優點:
操作方便,邏輯簡單。
無需關閉mysqld。
〇 缺點:
遇到ERROR難以定位位置,難以“斷點恢復”。
特殊字元或字符集的問題。
max_allowed_packet問題。
恢復速度慢。
因為relaylog和binlog本質實際上是一樣的,所以是否可以利用MySQL自身的sql_thread來增量binlog呢?
〇 處理思路:
1)重新初始化一個例項,恢復全量備份檔案。
2)找到第一個binlog檔案的position,和剩下所有的binlog。
3)將binlog偽裝成relaylog,通過sql thread增量恢復。
這裡只介紹核心部分,即偽裝成relaylog的過程。
① 將relay log info的repository改到file中,並生成這個檔案。
通過change命令,是為了告訴MySQL自己為一個slave例項,因為無需用到IO_Thread,故host,password,user等可以隨意填寫。
並且通過該步驟,生成relay.info檔案。
② 關閉例項,將需要增量的binlog檔案偽裝成relaylog。
通過cp命令將binlog移動到$relaylogdir裡,該變數取決於例項的選項引數,預設放在datadir下。
再將binlog批量改名成relaylog,並且給予對應的許可權,否則會報錯OS error code 13: Permission denied。
③ 修改relay.info檔案和relay-log.index檔案
將relay.info的第二三行改成需要執行的第一個binlog(現在是relaylog)的檔名和position:
第二三行對應Relay_log_name和Relay_log_pos,等同於:
mysqlbinlog mysql-relay.000003 --start-position=1276895 | mysql -u -p -S
修改該檔案是為了告訴SQL_Thread從哪一個檔案和哪一個position開始執行事務
再修改relay-log.index,清空原有資訊,新增以下資訊,為的是告訴SQL_Thread還有哪些relaylog是需要執行的。
④ 啟動例項,開啟SQL_Thread:
只需要開啟SQL_Thread即可
⑤ 檢查複製狀態:
該測試使用的版本為:MySQL 5.7.16
效果:恢復全備檔案+binlog恢復到故障前的最後一個position。
其他場景也適用,比如在某一時刻執行了錯誤的sql,如truncate等操作,同樣也可以通過該辦法。
只需要將START SLAVE sql_thread後新增一個 UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos 即可。
該選項用於控制SQL_Thread執行到的最後的position,類似於mysqlbinlog mysql-bin.n --stop-position=$log_pos 。
除了更準確的能夠恢復錯誤之外,還有一個最大的好處是加快了binlog增量的速度。
補充一個額外的測試資料
對於同一組binlog檔案增量:
通過mysqlbinlog解析+匯入的時間為69min。
而通過SQL_Thread的執行時間為41min。
並且在需要增量的binlog檔案越大的情況下,效果越明顯。
〇 優點:
可以斷點恢復,人為控制進度,比如stop slave或者遇到錯誤時,可以斷點恢復。
效能好,在大量binlog的情況下,可以加快恢復速度。
在某些版本可以利用多執行緒複製來加快增量速度,時恢復更快。
〇 缺點:
需要關閉mysqld。
手動執行過程較mysqlbinlog方式更為複雜。
〇 總結:
mysqlbinlog --start-position 與 通過修改relay.info的第三行等效:
用途都是指定開始執行的第一個position。
mysqlbinlog --stop-position 與 通過在啟動SQL_Thread時指定UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos等效:
用途都是指定結束執行的最後一個position。
作者微信公眾號(持續更新)
而資料量很大的情況下,增量恢復binlog一直是一個苦惱的問題,因為恢復binlog速度十分慢,並且容易出錯。
恢復binlog檔案一般有兩種方法:
〇 先解析成sql檔案,再匯入MySQL
-
mysqlbinlog mysql-bin.000001 --start-position=n > /data/add.sql
-
mysqlbinlog mysql-bin.000002 ... mysql-bin.n >> /data/add.sql
- mysql -u -p -S < /data/add.sql
〇 直接管道到MySQL中
- mysqlbinlog mysql-bin.000001 --start-position=n | mysql -u -p -S
- mysqlbinlog mysql-bin.000002 ... mysql-bin.n | mysql -u -p -S
https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html
然而這兩種方式原理都是一樣的,通過mysqlbinlog解析成sql並匯入到MySQL中。
〇 優點:
操作方便,邏輯簡單。
無需關閉mysqld。
〇 缺點:
遇到ERROR難以定位位置,難以“斷點恢復”。
特殊字元或字符集的問題。
max_allowed_packet問題。
恢復速度慢。
因為relaylog和binlog本質實際上是一樣的,所以是否可以利用MySQL自身的sql_thread來增量binlog呢?
〇 處理思路:
1)重新初始化一個例項,恢復全量備份檔案。
2)找到第一個binlog檔案的position,和剩下所有的binlog。
3)將binlog偽裝成relaylog,通過sql thread增量恢復。
這裡只介紹核心部分,即偽裝成relaylog的過程。
① 將relay log info的repository改到file中,並生成這個檔案。
- SET GLOBAL relay_log_info_repository='FILE';
- CHANGE MASTER TO master_host='1',master_password='1',master_user='1',master_log_file='1',master_log_pos=4;
並且通過該步驟,生成relay.info檔案。
② 關閉例項,將需要增量的binlog檔案偽裝成relaylog。
- cp mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007 mysql-bin.000008 mysql-bin.000009 mysql-bin.000010 $relaylogdir
- cd $relaylogdir
- rename mysql-bin. mysql-relay. mysql-bin.0000*
- chown mysql:mysql -R .
再將binlog批量改名成relaylog,並且給予對應的許可權,否則會報錯OS error code 13: Permission denied。
③ 修改relay.info檔案和relay-log.index檔案
將relay.info的第二三行改成需要執行的第一個binlog(現在是relaylog)的檔名和position:
-
/data/mysql57/relaylog/mysql-relay.000003
- 1276895
mysqlbinlog mysql-relay.000003 --start-position=1276895 | mysql -u -p -S
修改該檔案是為了告訴SQL_Thread從哪一個檔案和哪一個position開始執行事務
再修改relay-log.index,清空原有資訊,新增以下資訊,為的是告訴SQL_Thread還有哪些relaylog是需要執行的。
- /data/mysql57/relaylog/mysql-relay.000003
- /data/mysql57/relaylog/mysql-relay.000004
- /data/mysql57/relaylog/mysql-relay.000005
- /data/mysql57/relaylog/mysql-relay.000006
- /data/mysql57/relaylog/mysql-relay.000007
- /data/mysql57/relaylog/mysql-relay.000008
- /data/mysql57/relaylog/mysql-relay.000009
- /data/mysql57/relaylog/mysql-relay.000010
④ 啟動例項,開啟SQL_Thread:
- START SLAVE sql_thread ;
⑤ 檢查複製狀態:
- mysql> SHOW SLAVE STATUS\G
- *************************** 1. row ***************************
- Slave_IO_State:
- Master_Host: 1
- Master_User: 1
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: 1
- Read_Master_Log_Pos: 4
- Relay_Log_File: mysql-relay.000003 -- 已經執行到的日誌名
- Relay_Log_Pos: 11529982 -- 已經執行到日誌的位置
- Relay_Master_Log_File: 1
- Slave_IO_Running: No
- Slave_SQL_Running: Yes
- 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: 11529982
- Relay_Log_Space: 5347038913
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 274354 -- 若變為0,則表示已經增量完畢
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 0
- Master_UUID:
- Master_Info_File: /data/mysql57/master.info
- SQL_Delay: 0
- SQL_Remaining_Delay: NULL
- Slave_SQL_Running_State: Reading event from the relay log
- Master_Retry_Count: 86400
- ………………………………
該測試使用的版本為:MySQL 5.7.16
效果:恢復全備檔案+binlog恢復到故障前的最後一個position。
其他場景也適用,比如在某一時刻執行了錯誤的sql,如truncate等操作,同樣也可以通過該辦法。
只需要將START SLAVE sql_thread後新增一個 UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos 即可。
該選項用於控制SQL_Thread執行到的最後的position,類似於mysqlbinlog mysql-bin.n --stop-position=$log_pos 。
除了更準確的能夠恢復錯誤之外,還有一個最大的好處是加快了binlog增量的速度。
補充一個額外的測試資料
對於同一組binlog檔案增量:
通過mysqlbinlog解析+匯入的時間為69min。
而通過SQL_Thread的執行時間為41min。
並且在需要增量的binlog檔案越大的情況下,效果越明顯。
〇 優點:
可以斷點恢復,人為控制進度,比如stop slave或者遇到錯誤時,可以斷點恢復。
效能好,在大量binlog的情況下,可以加快恢復速度。
在某些版本可以利用多執行緒複製來加快增量速度,時恢復更快。
〇 缺點:
需要關閉mysqld。
手動執行過程較mysqlbinlog方式更為複雜。
〇 總結:
mysqlbinlog --start-position 與 通過修改relay.info的第三行等效:
用途都是指定開始執行的第一個position。
mysqlbinlog --stop-position 與 通過在啟動SQL_Thread時指定UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos等效:
用途都是指定結束執行的最後一個position。
作者微信公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2143726/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql point in time recovery using sql_thread SQL_Thread增量恢復binlog 要點MySqlthread
- MySQL 通過 binlog 恢復資料MySql
- mysql 利用binlog增量備份、恢復MySql
- 通過binlog恢復mysql資料庫MySql資料庫
- MySQL通過Binlog恢復刪除的表MySql
- 通過binlog恢復mysql備份之前的資料MySql
- MySQL 透過 binlog 恢復資料MySql
- 【Mysql】如何透過binlog恢復資料MySql
- mysql增量恢復指令碼MySql指令碼
- mysql innobackupex增量備份恢復MySql
- 【MySql】innobackupex增量備份和恢復MySql
- 【MySql】innobackupex 增量備份和恢復MySql
- 05、MySQL Case-MySQL binlog誤清除恢復MySql
- MySQL增量備份與恢復例項MySql
- MySQL四種日誌binlog/redolog/relaylog/undologMySql
- Mysql效能壓測、Binlog恢復資料MySql
- 利用binlog日誌恢復mysql資料MySql
- mysql使用binlog進行資料恢復MySql資料恢復
- 使用MySQL自身複製來恢復binlogMySql
- MySQL--binlog日誌恢復資料MySql
- MySQL 資料庫增量資料恢復案例MySql資料庫資料恢復
- mysql之 Innobackupex(全備+增量)備份恢復MySql
- 【Mysql】xbackup全量與增量備份恢復MySql
- mysql 誤刪除表內資料,透過binlog日誌恢復MySql
- mysql通過percona xtrabackup全備和mysql binlog實現基於時間點的資料庫恢復MySql資料庫
- MySQL恢復過程MySql
- 基於mysql-binlog的恢復實驗MySql
- MySQL 5.6.26 通過frm & ibd 恢復資料過程MySql
- mysql通過frm、idb檔案恢復資料MySql
- linux下如何增量增量傳輸mysql binlog日誌LinuxMySql
- MySQL中的binlog相關命令和恢復技巧MySql
- MySQL閃回技術之binlog2sql恢復binlog中的SQLMySql
- Linux上透過binlog檔案恢復mysql資料庫詳細步驟LinuxMySql資料庫
- oracle基於SCN增量恢復Oracle
- 使用innobackupex線上增量備份和再增量備份及恢復mysql資料庫MySql資料庫
- MySQL 5.6 xtrabackup 全量和增量的備份和恢復MySql
- 通過duplicat恢復資料庫資料庫
- 通過Oracle來輔助MySQL資料問題的恢復OracleMySql