1. 程式人生 > >MySQL中基於mysqldump和二進制日誌log-bin二進制日誌進行邏輯備份以及基於時間點的還原

MySQL中基於mysqldump和二進制日誌log-bin二進制日誌進行邏輯備份以及基於時間點的還原

總結 mysql-bin lin .sql bin -h eat log-bin 之前

本文出處:http://www.cnblogs.com/wy123/p/6956464.html

本文僅模擬使用mysqldump和log-bin二進制日誌進行簡單測試,僅作為個人學習筆記,可能離實際應用還有很大差距,僅參考。

開啟MySQL的bin-log二進制日誌

  模擬還原是需要mysqldump出來的文件和log-bin,因此需要開始log-bin二進制日誌。
  mysql5.7.18在開啟二進制日誌的時候除了要設置log-bin的位置之外,另外需要設置一個server-id,MySQL之前的版本應該不需要這個設置。

  吐槽一下開源軟件,基本上每個版本都有一些跟之前版本不一樣的地方,網上查資料,不同版本的情況下不少東西都是不一樣的,這一點需要註意。

  技術分享

  重啟之後,查詢log_bin相關的變量

  技術分享

mysqldump備份(導出)數據的基本使用

mysqldump命令參數相當多,簡單記錄一下常用的命令,以及利用mysqldump備份(嚴格說是導出數據)和二進制日誌log-bin進行數據庫還原操作。


-- 備份testdb整個數據庫,-l表示給所有表上加一個讀鎖,-F(F要大寫,消協不報錯單頁無效)表示滾動生成一個新的日誌文件
mysqldump -u root -p -l -F -h localhost testdb > usr/local/mysqlbak/test20170607_data.sql

技術分享

備份出來的文件就是create table和insert into table的腳本

技術分享

-- 備份testdb數據庫中的test_table1 test_table2兩張表,加上--no-create-info就意味這個備份出來的文件不帶create table的腳本,僅僅是insert into table的信息
mysqldump -uroot -p -h localhost testdb test_table1 test_table2 --no-create-info> usr/local/mysqlbak/test20170606_1.sql

-- 備份testdb數據庫中的test2表中的一部分數據,也就是備份test_table1表中符合id<1000的數據
mysqldump -uroot -p -h localhost testdb test_table1 --where "id<1000"

> usr/local/mysqlbak/test20170606_2.sql

更多mysqldump的參數,參考:http://www.cnblogs.com/xuejie/archive/2013/01/11/2856911.html

利用mysqldump備份的文件和log-bin二進制日誌進行還原

  首先在以表中有數據的情況下進行備份

技術分享

  執行 mysqldump -u root -p -l -F -h localhost testdb --master-data=2 > usr/local/mysqlbak/test20170607_data.sql

  技術分享

  這裏加了一個--master-data=2的選項,目的是在備份文件中備註出來當前的log_bin的文件,
  至於為什麽要加這個命令,很多博客上都記錄的是用mysqldump備份出來一個文件之後,修改數據,然後模擬數據庫誤刪或者宕機還原怎麽的,然後在使用mysqldump出來的文件還原之後,接著使用log-bin還原
  雖然都是測試模擬,但是有一個明顯的問題啊,怎麽知道mysqldump之後日誌是否發生了滾動,滾動了幾次?
  如果日誌不滾動還要,按照時間點或者位置還原log-bin文件,如果滾動了,怎麽知道滾動了幾個日誌文件呢
  就需要在mysqldump執行的時候,記錄下來刷新日誌之後的新生成的log-bin文件,在使用日誌還原的時候,才能判斷使用哪些日誌進行還原。

  有了--master-data=2的選項,才知道mysqldump備份時候的log_file位置

技術分享

  然後繼續往表中插入10條數據

  技術分享

  然後模擬在某個時間點誤刪數據的情況,truncate測試表,測試表此時為空

  技術分享

  首先利用mysqldump出來的文件還原數據庫,mysqldump出來的文件備份是100行時候的數據
  因為備份文件中備份的時候的數據是100行,這裏還原之後是100行,沒有問題。

  技術分享

  然後接著利用log-bin按照時間點還原,上面說了,mysqldump出來的文件記錄了日誌刷新之後的log-bin的文件名稱,
  那麽就可以判斷日誌是否發生了滾動,如果沒有滾動,就按照下圖最新的log-bin進行按照時間點進行還原。

  技術分享

  進行一次mysqldump備份還原
  mysql -u root -p testdb < usr/local/mysqlbak/test20170607_data.sql
  進然後再行一次基於bin-log的時間點還原
  mysqlbinlog --stop-datetime="2017-6-7 21:45:00" /var/lib/mysql/mysql-bin.000022 | mysql -u root -p testdb
  然後數據就回來了。

  技術分享

  當然這裏僅僅是模擬操作,當然還有許多細節尚未確定,如果發生了日誌滾動,要做基於時間點的還原,還要追究到究竟是基於哪個日誌文件的時間點。

總結:

  本文僅僅以一個簡單的示例來模式數據庫的還原操作,
  mysqldump備份模式比較簡單粗暴,僅僅是將數據導出為insert腳本,在還原較大數據時候會有性能問題,可能mysqldump就不適合了,就需要更為高效的xtrabackup來做備份還原了。

  

  

  

MySQL中基於mysqldump和二進制日誌log-bin二進制日誌進行邏輯備份以及基於時間點的還原