首頁  >  文章  >  資料庫  >  MySQL中基於mysqldump和二進位日誌log-bin進行邏輯備份以及基於時間點的還原

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

巴扎黑
巴扎黑原創
2017-06-26 09:12:381468瀏覽

 

本文來源: 

 

 

本文僅模擬使用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的參數,參考:

#另外,mysql

更多mysqldump的參數,參考:

#另外,mysql log-bin的更換策略:

使用索引來循環檔案​​,在下列條件將循環至下一個索引

1。伺服器重啟

2。伺服器被更新

3。日誌到達了最大日誌長度 max_binlog_size

4。日誌被刷新mysql> flush logs; 

#利用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   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進行邏輯備份以及基於時間點的還原的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn