MySQL二進位制日誌備份和恢復

2021-09-01 14:20:40 字數 3515 閱讀 5843

基本概念

定義:二進位制日誌包含了所有更新了資料或者已經潛在更新了資料(例如,沒有匹配任何行的乙個delete)的所有語句。

作用:

1。二進位制日誌的主要目的是在恢復使能夠最大可能地更新資料庫,因為二進位制日誌包含備份後進行的所有更新。

2。二進位制日誌還用於在主復**務器上記錄所有將傳送給從伺服器的語句。

不良影響:

執行伺服器時若啟用二進位制日誌則效能大約慢1%。

mysql預設二進位制日誌是關閉狀態,先手動改動配置檔案開啟二進位制日誌

在my.cnf(windows下是my.ini)中的mysqld下 新增

log-bin=mysql-bin

binlog_format=mixed //這行是來描述模式的,這兩行直接複製到mysqld下即可

重啟服務後便可以看到新增的日誌檔案了

日誌位置

>>如果沒有指定檔名,則mysql使用hostname-bin檔案.

>>如果指定了相對路徑,則假定該路徑相對於資料目錄

>>mysql在檔名後新增了數字索引.所以該檔案最後的形式為filename.number

如果你在日誌名中提供了副檔名(例如,–log-bin=file_name.extension),則副檔名被悄悄除掉並忽略。

更換策略:

使用索引來迴圈檔案,在以下條件將迴圈至下乙個索引

1。伺服器重啟

2。伺服器被更新

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

4。日誌被重新整理 mysql> flush logs;

工具介紹:

shell>>mysqlbinlog [option] binlogfile> newfile

如: d:\mysql\log>mysqlbinlog binlog.000001 > 1.txt

乙個例子:

log-bin=」d:/mysql/log/binlog」 那麼,在該資料夾下就會有檔案d:/mysql/log/binlog.000001等

常見問題

1.如何清除binlog

>>>使用下面的兩個命令

purge logs to 『log_name' //log_name不會被清除

purge logs before 『date' //date不會被清除

例項如下:

mysql> purge master logs to 『binlog.000004′;

query ok, 0 rows affected (0.01 sec)

mysql> purge master logs before '2009-09-22 00:00:00′;

query ok, 0 rows affected (0.05 sec)

>>>或使用命令

reset master

刪除之前所有的binlog,並重新生成新的binlog

字尾從000001開始

注:如果您有乙個活性的從屬伺服器,該伺服器當前正在讀取您正在試圖刪除的日誌之一,

則本語句不會起作用,而是會失敗,並伴隨乙個錯誤。

不過,如果從屬伺服器是休止的,並且您碰巧清理了其想要讀取的日誌之一,則從屬伺服器啟動後不能複製。

當從屬伺服器正在複製時,本語句可以安全執行。您不需要停止它們。

2.記錄到二進位制日誌知的內容配置

binlog-do-db=sales 只記錄sales庫

binlog-ignore-db=sales 除sales庫不記錄,其他都記錄

但是如果在運算元據庫之前,不使用use $dbname 那麼所有的sql都不會記錄

如果使用了use $dbname,那麼判斷規則取決於這裡的$dbname,而不是sql中操作的庫

3.二進位制日誌不準確的處理

預設情況下,並不是每次寫入時都將二進位制日誌與硬碟同步。因此如果作業系統或機器(不僅僅是mysql伺服器)崩潰,有可能二進位制日誌中最後的語句丟失。

要想防止這種情況,你可以使用sync_binlog全域性變數(1是最安全的值,但也是最慢的),使二進位制日誌在每n次二進位制日誌寫入後與硬碟同步。

即使sync_binlog設定為1,出現崩潰時,也有可能表內容和二進位制日誌內容之間存在不一致性。

如果崩潰恢復時mysql伺服器發現二進位制日誌變短了(即至少缺少乙個成功提交的innodb事務),

如果sync_binlog =1並且硬碟/檔案系統的確能根據需要進行同步(有些不需要)則不會發生,則輸出錯誤訊息 (「二進位制日誌《名》比期望的要小」)。

在這種情況下,二進位制日誌不準確,複製應從主伺服器的資料快照開始。

[color=red]

mysqldump --databases repltest --flush-logs --opt repltest>q:/repltest_full_01.sql[/color]

上面這句話可以在備份的同時重新整理日誌,生成新的日誌,這樣新日誌裡面的內容相當於這次備份之後的增量部分,可以用這種方式來實現mysql的增量備份,即先恢復資料庫到之前備份的某個資料備份節點上,然後執行之後的二進位制日誌,因為二進位制日誌實質上記錄的是所有資料變更的操作,可以來實現增量備份或者對某個時間點的還原

清理日誌

如果每天都會生成大量的二進位制日誌,這些日誌長時間不清理的話,將會對磁碟空間帶來很大的浪費,所以定期清理日誌是dba維護mysql的乙個重要工作

1)reset master

在上面檢視日誌存放的資料夾中,二進位制日誌命名的格式是以mysql-bin.*,*代表日誌的序號,序號是遞增的,其中還有mysql-bin.index是日誌的索引檔案,記錄了日誌的最大序號

我們執行reset master命名刪除全部日誌,新的日誌從頭開始

2)purge master logs to & purge master logs before

執行purge master logs to 'mysql-bin.******'命令,是將'******'編號之前的所有日誌進行刪除

執行purge master logs before 'yyyy-mm-dd hh:mm:ss'命令,是將在'yyyy-mm-dd hh:mm:ss'時間之前的所有日誌進行刪除

3)-expire_logs_days

此引數是設定日誌的過期天數,過期的日誌將會被自動刪除,這有利於減少我們管理日誌的工作量,需要修改my.cnf

expire_logs_days = 3 //即為日誌儲存三天,三天之後過期的日誌自動刪除

恢復bin-log是記錄著mysql所有事件的操作,當mysql發生災難性錯誤時,可以通過bin-log做完整恢復,基於時間點的恢復,和基於位置的恢復

完整恢復,假定我們每天凌晨2點都會使用mysqldump備份資料庫,但在第二天早上9點由於資料庫出現了故障,資料無法訪問,需要恢復資料,先使用昨天凌晨備份的檔案進行恢復到凌晨2點的狀態,在使用mysqlbinlog恢復自mysqldump備份以來的binlog

mysql localhost mysql-bin.000001 | mysql -uroot -p

這樣資料庫就可以完全的恢復到崩潰前的完全狀態

mysql 二進位制日誌(增量備份)

環境 centos6.4 32位 msyql5.1 二進位制日誌 記錄dml 語句,建立刪除語句,不記錄select 語句,常用作增量備份。開啟二進位制日誌 datadir var lib mysql socket var lib mysql mysql.sock user mysql disabl...

mysql 二進位制日誌

如果mysql 伺服器啟用了二進位制日誌,你可以使用mysqlbinlog工具來恢復從指定的時間點開始 例如,從你最後一次備份 直到現在或另乙個指定的時間點的資料。mysqlbinlog 用於處理二進位制日誌檔案的實用工具 要想從二進位制日誌恢復資料,你需要知道當前二進位制日誌檔案的路徑和檔名。一般...

mysql 二進位制日誌

1.日誌型別 二進位制日誌記錄了所有對mysql資料庫的修改事件,包括增刪改事件和對錶結構的修改事件。2.配置使用二進位制日誌 在my.ini 配置 log bin mysql bin 3.二進位制日誌格式 基於段的日誌格式 binlog format statement 記錄了操作的sql語句。優...