一般線上MySQL服務器,爲了數據存儲安全,都會默認開啓binlog功能,以便恢復日後服務器故障或者更改刪除等誤操作的數據,而壞處是binlog日誌文件增長速度快,很快會佔滿磁盤空間,所以對binlog日誌文件的處理顯得格外重要!
-
-
定義
二進制日誌包含了所有更新了數據或者已經潛在更新了數據(例如,沒有匹配任何行的一個DELETE)的所有語句。
-
my.cnf配置 binlog相關參數
- #設置此參數表示啓用binlog功能,並制定二進制日誌的存儲目錄,
- log-bin=/home/mysql/binlog/mysql-bin
- #mysql-bin.*日誌文件最大字節(單位:字節)
- #設置最大100MB
- max_binlog_size=104857600
- #設置了只保留7天BINLOG(單位:天)
- expire_logs_days = 7
- #binlog日誌只記錄指定庫的更新
- #binlog-do-db=db_name
- #binlog日誌不記錄指定庫的更新
- #binlog-ignore-db=db_name
-
-
NOTE:
max_binlog_size — Binlog最大和默認值是1GB,該設置並不能嚴格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個比較大事務時,爲了保證事務的完整性,不可能做切換日誌的動作,只能將該事務的所有SQL都記錄進當前日誌,直到事務結束。所以真實文件有時候會大於max_binlog_size設定值!
expire_logs_days — binlog過期刪除不是服務定時執行,是需要藉助事件觸發才執行,事件有a.服務器重啓 b.服務器被更新 c.日誌達到了最大日誌長度max_binlog_size d.日誌被刷新mysql> flush logs;
-
-
作用
-
二進制日誌的主要目的是在恢復使能夠最大可能地更新數據庫,因爲二進制日誌包含備份後進行的所有更新。
-
二進制日誌還用於在主服務器上記錄所有將發送給從服務器的語句。
不良影響:運行服務器時若啓用二進制日誌則性能大約慢1%。
-
-
基礎知識
-
二進制日誌的啓用
二進制日誌由配置文件的log-bin選項負責啓用,Mysql服務器將在數據根目錄創建兩個新文件XXX-bin.001和XXX-bin.index,若配置選項沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日誌文件的清單。
Mysql會把用戶對所有數據庫的內容和結構的修改情況記入XXX-bin.n文件,而不會記錄SELECT和沒有實際更新的UPDATE語句。 -
日誌文件的擴展(XXX-bin.000001,XXX-bin.000002 – - – -)
當停止或重啓時,服務器會把日誌文件記入下一個日誌文件,Mysql會在重啓時生成一個新的日誌文件,文件序號遞增,此外,如果日誌文件超過max_binlog_size系統變量配置的上限時,也會生成新的日誌文件。
-
日誌文件的查看
Mysql提供了mysqlbinlog命令來查看日誌文件,如mysqlbinlog mysql-bin.00001 | more。在記錄每條變更日誌的時候,日誌文件都會把當前時間給記錄下來,以便進行數據庫恢復。
-
日誌文件的停用
可以使用SET SQL_LOG_BIN=0命令停止使用日誌文件,然後可以通過SET SQL_LOG_BIN=1命令來啓用。
-
使用日誌進行數據庫恢復
如果遇到災難事件,應該用最近一次製作的完整備份恢復數據庫,然後使用備份之後的日誌文件把數據庫恢復到最接近現在的可用狀態。
使用日誌進行恢復時需要依次進行,即最早生成的日誌文件要最先恢復:
- /usr/local/mysql/bin/mysqlbinlog /home/mysql/binlog/mysql-bin.000001 | /usr/local/mysql/bin/mysql -uroot -proot
- /usr/local/mysql/bin/mysqlbinlog /home/mysql/binlog/mysql-bin.000002 | /usr/local/mysql/bin/mysql -uroot -proot
當只是需要恢復部分記錄的時候,你可以使用時間點或位置點來定位
- /usr/local/mysql/bin/mysqlbinlog --start-date="2015-04-1 9:01:00" --stop-date="2015-04-1 10:00:01" /home/mysql/binlog/mysql-bin.000001 |mysql -uroot -ppassword
- #意思是恢復4月1日早上9點到10點這一段時間的數據。
- /usr/local/mysql/bin/mysqlbinlog --start-position="368301" --stop-position="368312"/home/mysql/binlog/mysql-bin.000001 | mysql -uroot -pmypwd
- #意思是重做368301到368312位置點之間的操作。(位置點可以就是用mysqlbinlog看到的at xxx節點)
- /usr/local/mysql/bin/mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" /home/mysql/binlog/mysql-bin.000001 > /tmp/mysql_restore.sql
- #同樣的,如果我們只是想查看某段時間的操作,直接把它導到一個文件即可
-
-