這篇文章給大家介紹如何通過(guò)MySQL relaylog + SQL_Thread 增量恢復(fù)binlog,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括黎川網(wǎng)站建設(shè)、黎川網(wǎng)站制作、黎川網(wǎng)頁(yè)制作以及黎川網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,黎川網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到黎川省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
數(shù)據(jù)回檔常常是使用全量備份+binlog增量實(shí)現(xiàn)的。
而數(shù)據(jù)量很大的情況下,增量恢復(fù)binlog一直是一個(gè)苦惱的問(wèn)題,因?yàn)榛謴?fù)binlog速度十分慢,并且容易出錯(cuò)。
恢復(fù)binlog文件一般有兩種方法:
〇 先解析成sql文件,再導(dǎo)入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
關(guān)于這種方式的更多info,可以參考:
https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html
然而這兩種方式原理都是一樣的,通過(guò)mysqlbinlog解析成sql并導(dǎo)入到MySQL中。
〇 優(yōu)點(diǎn):
操作方便,邏輯簡(jiǎn)單。
無(wú)需關(guān)閉mysqld。
〇 缺點(diǎn):
遇到ERROR難以定位位置,難以“斷點(diǎn)恢復(fù)”。
特殊字符或字符集的問(wèn)題。
max_allowed_packet問(wèn)題。
恢復(fù)速度慢。
因?yàn)閞elaylog和binlog本質(zhì)實(shí)際上是一樣的,所以是否可以利用MySQL自身的sql_thread來(lái)增量binlog呢?
〇 處理思路:
1)重新初始化一個(gè)實(shí)例,恢復(fù)全量備份文件。
2)找到第一個(gè)binlog文件的position,和剩下所有的binlog。
3)將binlog偽裝成relaylog,通過(guò)sql thread增量恢復(fù)。
這里只介紹核心部分,即偽裝成relaylog的過(guò)程。
① 將relay log info的repository改到file中,并生成這個(gè)文件。
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;
通過(guò)change命令,是為了告訴MySQL自己為一個(gè)slave實(shí)例,因?yàn)闊o(wú)需用到IO_Thread,故host,password,user等可以隨意填寫(xiě)。
并且通過(guò)該步驟,生成relay.info文件。
② 關(guān)閉實(shí)例,將需要增量的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 .
通過(guò)cp命令將binlog移動(dòng)到$relaylogdir里,該變量取決于實(shí)例的選項(xiàng)參數(shù),默認(rèn)放在datadir下。
再將binlog批量改名成relaylog,并且給予對(duì)應(yīng)的權(quán)限,否則會(huì)報(bào)錯(cuò)OS error code 13: Permission denied。
③ 修改relay.info文件和relay-log.index文件
將relay.info的第二三行改成需要執(zhí)行的第一個(gè)binlog(現(xiàn)在是relaylog)的文件名和position:
/data/mysql57/relaylog/mysql-relay.000003
1276895
第二三行對(duì)應(yīng)Relay_log_name和Relay_log_pos,等同于:
mysqlbinlog mysql-relay.000003 --start-position=1276895 | mysql -u -p -S
修改該文件是為了告訴SQL_Thread從哪一個(gè)文件和哪一個(gè)position開(kāi)始執(zhí)行事務(wù)
再修改relay-log.index,清空原有信息,添加以下信息,為的是告訴SQL_Thread還有哪些relaylog是需要執(zhí)行的。
/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
④ 啟動(dòng)實(shí)例,開(kāi)啟SQL_Thread:
START SLAVE sql_thread ;
只需要開(kāi)啟SQL_Thread即可
⑤ 檢查復(fù)制狀態(tài):
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 -- 已經(jīng)執(zhí)行到的日志名
Relay_Log_Pos: 11529982 -- 已經(jīng)執(zhí)行到日志的位置
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 -- 若變?yōu)?,則表示已經(jīng)增量完畢
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
………………………………
該測(cè)試使用的版本為:MySQL 5.7.16
效果:恢復(fù)全備文件+binlog恢復(fù)到故障前的最后一個(gè)position。
其他場(chǎng)景也適用,比如在某一時(shí)刻執(zhí)行了錯(cuò)誤的sql,如truncate等操作,同樣也可以通過(guò)該辦法。
只需要將START SLAVE sql_thread后添加一個(gè) UNTILRELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos即可。
該選項(xiàng)用于控制SQL_Thread執(zhí)行到的最后的position,類似于mysqlbinlog mysql-bin.n --stop-position=$log_pos 。
除了更準(zhǔn)確的能夠恢復(fù)錯(cuò)誤之外,還有一個(gè)最大的好處是加快了binlog增量的速度。
補(bǔ)充一個(gè)額外的測(cè)試數(shù)據(jù)
對(duì)于同一組binlog文件增量:
通過(guò)mysqlbinlog解析+導(dǎo)入的時(shí)間為69min。
而通過(guò)SQL_Thread的執(zhí)行時(shí)間為41min。
并且在需要增量的binlog文件越大的情況下,效果越明顯。
〇 優(yōu)點(diǎn):
可以斷點(diǎn)恢復(fù),人為控制進(jìn)度,比如stop slave或者遇到錯(cuò)誤時(shí),可以斷點(diǎn)恢復(fù)。
性能好,在大量binlog的情況下,可以加快恢復(fù)速度。
在某些版本可以利用多線程復(fù)制來(lái)加快增量速度,時(shí)恢復(fù)更快。
〇 缺點(diǎn):
需要關(guān)閉mysqld。
手動(dòng)執(zhí)行過(guò)程較mysqlbinlog方式更為復(fù)雜。
〇 總結(jié):
mysqlbinlog --start-position 與 通過(guò)修改relay.info的第三行等效:
用途都是指定開(kāi)始執(zhí)行的第一個(gè)position。
mysqlbinlog --stop-position 與 通過(guò)在啟動(dòng)SQL_Thread時(shí)指定UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos等效:
用途都是指定結(jié)束執(zhí)行的最后一個(gè)position。
關(guān)于如何通過(guò)MySQL relaylog + SQL_Thread 增量恢復(fù)binlog就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
新聞標(biāo)題:如何通過(guò)MySQLrelaylog+SQL_Thread增量恢復(fù)binlog
文章網(wǎng)址:http://www.chinadenli.net/article26/jsiijg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣、品牌網(wǎng)站制作、App設(shè)計(jì)、小程序開(kāi)發(fā)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)