Mysql 二進制日誌管理
MySQL二進制日誌是以事務安全的方式包含更新日誌中可用的全部信息。它包含了全部更新了數據或者已經潛在更新了數據(例如,沒有匹配任何行的一個DELETE)的全部語句。語句以「事件」的形式保存,它描述數據更改。
運行服務器時若啓用二進制日誌則性能大約慢1%。可是,二進制日誌的好處,即用於恢復並容許設置複製超過了這個小小的性能損失。
編輯mysql配置文件:/etc/my.cnf(windows下是my.ini),將「bin-log」一行前面的註釋去掉,默認是:#log-bin=mysql-bin,(沒有的話,本身手動添加一行),等號後面的mysql-bin是生成日誌的路徑和文件名,這裏表示在mysql的data目錄下生成,你也能夠本身改路徑,如log-bin=/data/mysql/log/mysql-bin。
還能夠設置如下選項:
binlog-do-db= db_name #將db_name更新記錄到二進制日誌中
binlog-ignore-db=db_name #不將db_name更新保存到二進制日誌中
max_binlog_size= 104857600 #每一個日誌文件最大100M
保存,重啓mysql。
重啓後看到有生成相似mysql-bin.000001、mysql-bin.000002的文件就說明已經成功打開了二進制日誌。
1、查看當前已有的二進制日誌文件,執行sql「SHOW BINLOG EVENTS \G」或「SHOW MASTER LOGS」:
mysql> SHOW BINLOG EVENTS \G;
mysql> SHOW MASTER LOGS;
2、清除二進制日誌文件:
mysql> PURGE { MASTER|BINARY } LOGS TO 'log_name';
mysql> PURGE { MASTER|BINARY } LOGS BEFORE 'datetime';
例如:
mysql> PURGE MASTER LOGS TO 'mysql-bin.000001';
mysql> PURGE MASTER LOGS BEFORE '2010-06-20 13:00:00';
另外一種清除二進制日誌方法:
mysql > flush logs;
mysql > reset master;
mysqlbinlog:用於處理二進制日誌文件的實用工具;能夠用它來恢復從指定的時間點開始 (例如,從你最後一次備份)直到如今或另外一個指定的時間點的數據。
使用方法:mysqlbinlog [options] log-files。
mysqlbinlog有不少選項,具體可使用mysqlbinlog –help查看:
如:bin>mysqlbinlog --help
(若是沒有將mysqlbinlog設置成系統命令,linux下能夠用find / -name "mysqlbinlog"搜索出mysqlbinlog的位置,windows下在mysql安裝目錄的bin文件夾下)
若是執行mysqlbinlog時出現相似unknown variable 'default-character-set=utf8'錯誤提示,是由於在my.cnf(或my.ini)中的client選項組中添加了default-character-set=utf8,能夠有兩種辦法解決這個bug:
第一種,執行時加上--no-defaults選項;如:mysqlbinlog --no-defaults --help。
第二種,在使用mysqlbinlog工具時把my.cnf(或my.ini)中client選項組中的default-character-set=utf8註釋掉。注意要記得在不在使用mysqlbinlog工具時取消這個註釋。
部分經常使用選項說明:
--start-datetime=datetime #從二進制日誌中第1個日期時間等於或晚於datetime參量的事件開始讀取, 格式應符合DATETIME或TIMESTAMP數據類型。datetime值是相對於運行mysqlbinlog的機器上的本地時區時間。
--stop-datetime=datetime #從二進制日誌中第1個日期時間等於或晚於datetime參量的事件中止讀取,描述同start-datetime。
--start-position=N #從二進制日誌中第1個位置等於N參量時的事件開始讀。
· --stop-position=N #從二進制日誌中第1個位置等於N參量時的事件中止讀。
示例:
1、 從mysql-bin.000001中恢復從2010-01-01 01:00:00開始以後的數據:
bin> mysqlbinlog --start-datetime="2010-01-01 01:00:00" mysql-bin.000001 | mysql -uroot -proot
2、 從mysql-bin.000001中恢復從2010-01-01 01:00:00到2010-01-02 01:00:00之間的數據:
bin> mysqlbinlog --start-datetime="2010-01-01 01:00:00" --stop-datetime="2010-01-02 01:00:00" mysql-bin.000001 | mysql -uroot -proot
3、 從多個日誌文件中恢復數據:
bin> mysqlbinlog mysql-bin.000001 mysql-bin.000002 | mysql -uroot -proot
或
bin> ls -t -r -1 mysql-bin.* | xargs mysqlbinlog | mysql -uroot -proot
4、 其餘方式恢復:
bin> mysqlbinlog mysql-bin.000001 > /temp/binlog.sql #符號>表示建立新的文件,若是原來已經存在,則會覆蓋掉原文件。
bin> mysqlbinlog --stop-datetime="2010-01-02 01:00:00" mysql-bin.000002 >> /temp/binlog.sql #符號>>表示追加到內容後面。
bin> mysql -uroot -proot -e 「source /temp/binlog.sql」 #這步必須執行