天天看點

mysql binlog 常用指令及問題整理

1:開啟binlog日志記錄

# log-bin

log-bin = E:/log/logbin.log

檢視備份的二進制檔案

c:\mysql\bin\>mysqlbinlog e:/log/logbin.000001

">": 導入到檔案中; ">>": 追加到檔案中

c:\mysql\bin\> mysqlbinlog e:/log/logbin.000001 > e:/log/log.sql

c:\mysql\bin\> mysqlbinlog e:/log/logbin.000002 >> e:/log/log.sq

2.2 按指定位置導出:

c:\mysql\bin\>mysqlbinlog --start-position=185 --stop-position=338 e:/log/logbin.000001 > e:/log/log3.txt

2.3 按指定時間導出:

c:\mysql\bin\>mysqlbinlog --start-datetime="2010-01-07 11:25:56" --stop-datetime="2010-01-07 13:23:50" e:/log/logbin.000001 > e:/log/log_by_date22.txt

3:從備份恢複資料庫

c:\mysql\bin\>mysqlbinlog e:/log/logbin.000001 | mysql -u root -p

mysqlbinlog d:/mysql/data/binlog.000001 | mysql -uroot -pxcg213

3.2 按指定位置恢複:

c:\mysql\bin\>mysqlbinlog --start-position=185 --stop-position=338 e:/log/logbin.000001 | mysql -u root -p

3.3 按指定時間恢複:

c:\mysql\bin\>mysqlbinlog --start-datetime="2010-01-07 11:25:56" --stop-datetime="2010-01-07 13:23:50" e:/log/logbin.000001 | mysql -u root -p

3.4 通過導出的腳本檔案恢複

c:\mysql\bin\>mysql -e "source e:/log/log.sql"

4.其他常用操作

4.1 檢視所有日志檔案

Sql代碼

複制代碼 代碼如下:

mysql>show master logs;

4.2 目前使用的binlog檔案

>show binlog events;

mysql>show binlog events \g;

4.3 産生一個新的binlog日志檔案

Sql代碼

複制代碼 代碼如下:

mysql>flush logs;

4.4 删除所有二進制日志,并從新開始記錄(注意:reset master指令會删除所有的二進制日志)

mysql > flush logs;

mysql > reset master;

4.5 快速備份資料到sql檔案

c:\mysql\bin>mysqldump -u root -p --opt --quick interactive > e:/log/mysqldump.sql

為了友善檢視,把從腳本恢複的指令在寫一次

c:\mysql\bin\>mysql -e "source e:/log/mysqldump.sql"

更換政策:

使用索引來循環檔案,在以下條件将循環至下一個索引

1。伺服器重新開機

2。伺服器被更新

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

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

-------------------------------------------

2.記錄到二進制日志知的内容配置

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

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

但是如果在操作資料庫之前,不使用use $dbname 那麼所有的SQL都不會記錄

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

----------------------------------------------------------------------------------

ERROR 1665 (HY000) at line 33: Cannot execute statement: impossible to write to

binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage

 engine limited to row-based logging. InnoDB is limited to row-logging when tran

saction isolation level is READ COMMITTED or READ UNCOMMITTED.

解決辦法:

mysql> SET SESSION binlog_format = 'ROW';

   mysql> SET GLOBAL binlog_format = 'ROW';

解釋參考:http://www.cnblogs.com/sunson/archive/2012/05/28.html

msyql>show variables like 'binlog%';

當然了,也能夠在運作時動态修正binlog的款式。例如

mysql> SET SESSION binlog_format = 'STATEMENT';

mysql> SET SESSION binlog_format = 'ROW';

mysql> SET SESSION binlog_format = 'MIXED';

mysql> SET GLOBAL binlog_format = 'STATEMENT';

mysql> SET GLOBAL binlog_format = 'ROW';

mysql> SET GLOBAL binlog_format = 'MIXED';

-------------------------------------------------------------------------------------

3.二進制日志不準确的處理http://www.lampblog.net/2011/01/mysql-binlog%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%97%A5%E5%BF%97%E8%AF%A6%E8%A7%A3/

預設情況下,并不是每次寫入時都将二進制日志與硬碟同步。是以如果作業系統或機器(不僅僅是MySQL伺服器)崩潰,有可能二進制日志中最後的語句丢失。

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

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

如果崩潰恢複時MySQL伺服器發現二進制日志變短了(即至少缺少一個成功送出的InnoDB事務),

如果sync_binlog =1并且硬碟/檔案系統的确能根據需要進行同步(有些不需要)則不會發生,則輸出錯誤消息 (“二進制日志<名>比期望的要小”)。

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

為了您的安全,請隻打開來源可靠的網址

繼續閱讀