您好,登錄后才能下訂單哦!
Mysql數據庫中怎么按時間點恢復,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1. 按時間點恢復的技術實現
如果客戶在某時間節點由于誤操作,導致數據丟失,RDS管控服務是如何進行恢復的呢?
按時間點恢復的整體思路如下:一次完整的數據恢復是由物理備份+binlog恢復+binlog裁剪構成的。
圖1
首先獲取到可用的備份集,將備份集應用到目標實例上,然后再目標實例重放需要恢復的binlog文件,最后通過binlog裁剪的形式應用sql文件,實現整體的恢復。
1. 創建用于恢復的目的實例
當我們需要整體恢復源數據庫數據時,我們首先需要創建一個與源實例同規格、同網絡環境的目標實例。
為什么要這樣做?
因為備份恢復屬于高危操作,如果直接還原到源實例,一旦出現備份集不可用、binlog缺失等等問題,那么不僅丟失數據無法找回,甚至原數據都無法完好保住,所以強烈建議使用新實例來進行恢復!
2. 明確備份恢復時間點
當客戶在執行了一系列數據庫操作之后,如誤刪除、誤修改等,操作之后無感知,等到業務受損、故障發生時,如何定位到當時操作的準確時間點用于數據恢復呢?
方式1:可以通過日志審計功能找到對應的誤操作時間點。
方式2:可以將binlog解析成文本,查詢對應的誤操作時間點。
一般情況下,基于業務的重要程度,客戶在云上會規劃好自己的數據庫備份周期,RDS管控會基于用戶選擇的恢復時間點自動尋找可用的物理備份集。
可見備份對于數據庫的高可用和災難恢復是重中之重的!
專有云的備份一般都基于xtrabackup工具進行備份。xtrabackup具有熱備份、恢復快等特點,同時會將備份結束時應用binlog的文件和點位寫入相應文件中。RDS管控會將該binlogfile和binlogpos等信息寫入數據庫,當需要備份恢復時,會直接獲取該點位進行恢復。
如下圖所示:
圖2
1-4步驟為準備工作,下面開始正式的恢復數據。恢復數據的第一步是將獲取的可用的全量物理備份集下載至目的實例上,并使用xtrabackup工具進行還原。
//首先要停止目的實例上的mysql進程 systemctl stop mysql //然后合并數據,假設備份解壓在/root/backup/目錄下,可以指定需要恢復的實例端口,需加--defaults-file參數指定,默認3306。 innobackupex --apply-log /root/backup/ //刪除原目錄文件 rm -rf /data/mysql //還原數據集,還原數據到哪個目錄是基于配置文件my.cnf的datadir決定的。該字段一定要檢查是否準確 innobackupex --copy-back /root/backup/ //目錄賦權 chown -R mysql:mysql /data/mysql
管控服務需要驗證還原是否成功,再決定是否需要向下操作,驗證步驟也很簡單粗暴,直接檢查備份恢復日志中是否有ERROR,并且最后一行是否為completed OK!
如下圖,為一次成功的備份恢復。
圖3
此步驟至關重要,關乎恢復是否成功,數據是否完整。
那么RDS管控服務如何獲取正確的binlog來進行恢復呢?我們來看下圖。
圖4
例如當前我們的備份中總共有8個binlog備份(000-008),首先通過物理備份記錄的binlog的filename和pos來獲取第一個binlog,如上圖中的binlog004;然后通過客戶設置的需要恢復的時間點的timestamp,來找到對應的最后一個binlog,如上圖中的binlog007;最后將binlog004,binlog005,binlog006,binlog007這四個binlog備份下載到目的實例上進行恢復。
如果獲取了錯誤的binlog日志用于恢復,比如誤將binlog003/binlog005設置成了第一個binlog,那么binlog003/binlog005上執行的dml語句會在新實例上重新執行一次,恢復的數據就會增多或缺失;比如誤將binlog0006或者binlog0008設置成了最后一個binlog,那么恢復的數據會缺失,且無法達到預期效果。
將下載的binlog復制到新實例的logdir中,并將除最后一個binlog(覆蓋恢復時間點的binlog)之外的binlog重命名為relaylog,然后使用新實例重放這些relaylog。
//將binlog重命名,relaylog文件名可在mysql實例中執行show variables like '%relay%'查看. rename mysql-bin MySQL2-relay-bin mysql-bin* //將relay信息初始化到index文件中 ls ./MySQL2-relay-bin.0000*>MySQL2-relay-bin.index //將這些文件復制到data文件中 cp MySQL2-relay-bin.*/data/mysql/ //文件賦權 chown -R mysql:mysql /data/mysql //啟動mysql實例 systemctl start mysql //change master to一個不存在的實例,模擬此實例為一個備庫,指定一個空的主庫,創建SQL線程,然后根據備份記錄的binlogfile和binlogpos來設置。并啟動slave的sql_thread CHANGE MASTER TO MASTER_HOST='1.1.1.1',RELAY_LOG_FILE='MySQL2-relay-bin.000011',RELAY_LOG_POS=160338; START SLAVE SQL_THREAD; show slave status\G
通過show slave status\G,來進行驗證,此步驟一般恢復較慢,取決于數據庫binlog個數及binlog大小。
驗證1:查看relay_log_file字段的值是否為我們在MySQL2-relay-bin.index文件中維護的最大的值,如果是的話,則證明所有的bilog已重放成功;
驗證2:查看Slave_SQL_Running字段是否為YES。
如下圖所示:
圖5
至此,1-9步驟已經恢復了絕大部分數據了,剩余了一個覆蓋我們恢復時間點的binlog未進行恢復。
那么我們如何來進行操作呢?
如下圖所示:
圖6
根據客戶的時間點(如需要恢復至15:00的數據),RDS管控需要將覆蓋我們恢復時間點的binlog根據恢復時間進行裁剪,也就是只應用12:00-15:00的數據,15:00至18:00的數據屬于誤操作時間,不應該拿來應用。
//使用mysqlbinlog工具的裁剪功能對該binlog進行裁剪 mysqlbinlog --start-position=4--stop-datetime='2021-04-23 15:00:00'-R -h227.0.0.1-uroot -pxxxx -P3306 mysql-bin.007>/tmp/mysql-bin.007.sql
在目的實例上執行該sql文件。
//賦權 chown mysql:mysql /tmp/mysql-bin.007.sql //恢復數據 mysql -uroot -pxxxx -h227.0.0.1-P3306 -f --max_allowed_packet=1073741824</root/mysql-bin.007.sql
關于Mysql數據庫中怎么按時間點恢復問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。