將數(shù)據(jù)庫回檔至指定時間點或位置,常常是使用全量備份+增量實現(xiàn)的。
而數(shù)據(jù)量很大的情況下,增量恢復(fù)一直是一個苦惱的問題。
因為恢復(fù)速度十分慢,并且容易出錯。
p.s. 以下所有框可左右滑動
建議橫屏閱讀
常見增量恢復(fù)方式
先解析成sql文件,再導(dǎo)入MySQL
1mysqlbinlog mysql-bin.000001 --start-position=n > /data/add.sql
2mysqlbinlog mysql-bin.000002 ... mysql-bin.n >> /data/add.sql
3mysql -u -p -S < /data/add.sql
直接管道到MySQL中
1mysqlbinlog mysql-bin.000001 --start-position=n | mysql -u -p -S
2mysqlbinlog mysql-bin.000002 ... mysql-bin.n | mysql -u -p -S
直接管道進(jìn)去的方式,并不一定安全,手冊上也有指明:
1If you have more than one binary log to execute on the MySQL server,
2the safe method is to process them all using a single connection to the server.
關(guān)于這種方式的更多內(nèi)容,可以參考:
然而這兩種方式原理都是一樣的,通過解析成sql并導(dǎo)入到MySQL中。
缺點:
因為和本質(zhì)實際上是一個東西
所以是否可以利用MySQL自身的來增量呢?
通過恢復(fù)
這里只介紹核心部分,即偽裝成的過程。
① 將relay log info的改到file中,并生成這個文件。(itor寫到配置文件中)
1SET GLOBAL relay_log_info_repository='FILE';
2CHANGE MASTER TO master_host='1', master_password='1', master_user='1', master_log_file='1', master_log_pos=4;
通過命令,是為了告訴MySQL自己為一個slave實例,因為無需用到mysql 批量還原數(shù)據(jù)庫,故host,,user等可以隨意填寫。
并且通過該步驟,生成文件。
② 關(guān)閉實例,將需要增量的文件偽裝成。
1cp 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
2cd $relaylogdir
3rename mysql-bin. mysql-relay. mysql-bin.0000*
4chown mysql:mysql -R .
通過cp命令將移動到$里,該變量取決于實例的選項參數(shù),默認(rèn)放在下。
再將批量改名成mysql 批量還原數(shù)據(jù)庫,并且給予對應(yīng)的權(quán)限,否則會報錯OS error code 13: 。
③ 修改文件和relay-log.index文件
將的第二三行改成需要執(zhí)行的第一個(現(xiàn)在是)的文件名和:
1/data/mysql57/relaylog/mysql-relay.000003
21276895
第二三行對應(yīng)和,等同于:
1mysqlbinlog mysql-relay.000003 --start-position=1276895 | mysql -u -p -S
修改該文件是為了告訴從哪一個file和哪一個開始執(zhí)行。
再修改relay-log.index,清空原有信息,添加以下信息,為的是告訴還有哪些是需要執(zhí)行的。
1/data/mysql57/relaylog/mysql-relay.000003
2/data/mysql57/relaylog/mysql-relay.000004
3/data/mysql57/relaylog/mysql-relay.000005
4/data/mysql57/relaylog/mysql-relay.000006
5/data/mysql57/relaylog/mysql-relay.000007
6/data/mysql57/relaylog/mysql-relay.000008
7/data/mysql57/relaylog/mysql-relay.000009
8/data/mysql57/relaylog/mysql-relay.000010
④ 啟動實例,開啟:
1START SLAVE sql_thread ;
⑤ 檢查復(fù)制狀態(tài):
1mysql> SHOW SLAVE STATUS\G
2*************************** 1. row ***************************
3Slave_IO_State:
4Master_Host: 1
5Master_User: 1
6Master_Port: 3306
7Connect_Retry: 60
8Master_Log_File: 1
9Read_Master_Log_Pos: 4
10Relay_Log_File: mysql-relay.000003 ? ?-- 已經(jīng)執(zhí)行到的日志名
11Relay_Log_Pos: 11529982 ? ? ? ?-- 已經(jīng)執(zhí)行到日志的位置
12Relay_Master_Log_File: 1
13Slave_IO_Running: No
14Slave_SQL_Running: Yes
15Replicate_Do_DB:
16Replicate_Ignore_DB:
17Replicate_Do_Table:
18Replicate_Ignore_Table:
19Replicate_Wild_Do_Table:
20Replicate_Wild_Ignore_Table:
21Last_Errno: 0
22Last_Error:
23Skip_Counter: 0
24Exec_Master_Log_Pos: 11529982
25Relay_Log_Space: 5347038913
26Until_Condition: None
27Until_Log_File:
28Until_Log_Pos: 0
29Master_SSL_Allowed: No
30Master_SSL_CA_File:
31Master_SSL_CA_Path:
32Master_SSL_Cert:
33Master_SSL_Cipher:
34Master_SSL_Key:
35Seconds_Behind_Master: 274354 ? ? ? ?-- 若變?yōu)?,則表示已經(jīng)增量完畢
36Master_SSL_Verify_Server_Cert: No
37Last_IO_Errno: 0
38Last_IO_Error:
39Last_SQL_Errno: 0
40Last_SQL_Error:
41Replicate_Ignore_Server_Ids:
42Master_Server_Id: 0
43Master_UUID:
44Master_Info_File: /data/mysql57/master.info
45SQL_Delay: 0
46SQL_Remaining_Delay: NULL
47Slave_SQL_Running_State: Reading event from the relay log
48Master_Retry_Count: 86400
49………………………………
至此,已經(jīng)可以通過來增量恢復(fù)了。
當(dāng)然,上述過程只針對于指定--start-的方式來恢復(fù),比如單點MySQL實例在y=6還無法啟動的情況下,就需要通過最近一次可用的全量備份+剩下的恢復(fù)。
該測試使用的版本為:MySQL 5.7.16
效果:
快速恢復(fù)到指定位置點,即通過全備文件+恢復(fù)到故障前的最后一個。
針對--stop-
比如在某一時刻執(zhí)行了錯誤的sql,如等操作,同樣也可以通過該辦法。
但與指定--start-的方法有些許不同:
只需要將START SLAVE 后添加一個UNTIL = '', = 即可。
該選項用于控制執(zhí)行到的最后的,類似于 mysql-bin.n --stop-=$ 。
當(dāng)然,這種數(shù)據(jù)回檔操作,也可以考慮帶有功能的工具。
性能對比
對于同一組文件增量:
通過解析+導(dǎo)入的時間為69min。
而通過的執(zhí)行時間為41min。
并且在需要增量的文件越大的情況下,效果越明顯。
總結(jié)
--start-與通過修改的第三行等效:
用途都是指定開始執(zhí)行的第一個。
--stop-與通過在啟動時指定UNTIL = '', = 等效:
用途都是指定結(jié)束執(zhí)行的最后一個。
全文完。
Enjoy MySQL :)