MySQL Binary Log也就是常說的bin-log, ,是mysql執行改動產生的二進位記錄檔,其主要作用有兩個:
* 資料回複
* 主從資料庫。用於slave端執行增刪改,保持與master同步。
1.開啟binary log功能
需要修改mysql的設定檔,本篇的實驗環境是win7,設定檔為mysql安裝目錄\MySQL Server 5.1下的my.ini,添加一句log_bin = mysql_bin即可
eg: [mysqld] ...... log_bin = mysql_bin ...... log_bin是產生的bin-log的檔案名稱,尾碼則是6位元字的編碼,從000001開始,按照上面的配置,產生的檔案則為: mysql_bin.000001 mysql_bin.000002 ......
配置儲存以後重啟mysql的伺服器,用show variables like '%bin%'查看bin-log是否開啟,如圖:
2.查看產生的binary log
bin-log因為是二進位檔案,不能通過記事本等編輯器直接開啟查看,mysql提供兩種方式查看方式,在介紹之前,我們先對資料庫進行一下增刪改的操作,否則log裡邊資料有點空。
create table bin( id int(10) primary key auto_increment,name varchar(255));
(測試前我已經建表)
insert into bin(name) values ('orange');
1.在用戶端中使用 show binlog events in 'mysql_bin.000001' 語句進行查看,為了排序美觀,可以在結尾加\G使結果橫變縱,此時結尾無需加;語句結束符。
eg:
mysql> show binlog events in 'mysql_bin.000001'\G ...............省略............... *************************** 3. row *************************** Log_name: mysql_bin.000001 Pos: 174 Event_type: Intvar Server_id: 1 End_log_pos: 202 Info: INSERT_ID=2 *************************** 4. row *************************** Log_name: mysql_bin.000001 Pos: 202 Event_type: Query Server_id: 1 End_log_pos: 304 Info: use `test`; insert into bin(name) values ('orange') *************************** 5. row *************************** ...............省略...............
- Log_name:此條log存在那個檔案中,從上面可以看出這2條log皆存在與mysql_bin.000001檔案中。
- Pos:log在bin-log中的開始位置
- Event_type:log的類型資訊
- Server_id:可以查看配置中的server_id,表示log是那個伺服器產生
- End_log_pos:log在bin-log中的結束位置
- Info:log的一些備忘資訊,可以直觀的看出進行了什麼操作
2.用mysql內建的工具mysqlbinlog,這是我們就需要知道bin-log存在硬碟的什麼位置,win7預設存在C:\ProgramData\MySQL\MySQL Server 5.1\data檔案夾下面,如果沒有此檔案夾,那我們可以通過設定檔中的 datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/" 定位,如果還沒有,那我就會說“各個系統的搜尋功能都做的不錯!”。這種查看方式就沒那個美觀了,如下
C:\ProgramData\MySQL\MySQL Server 5.1\data>mysqlbinlog mysql_bin.000001 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #121015 16:35:56 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.51-community-log created 121015 16:35:56 at startup ROLLBACK/*!*/; BINLOG ' 7Mp7UA8BAAAAZgAAAGoAAAAAAAQANS4xLjUxLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADsyntQEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/; # at 106 #121015 16:36:51 server id 1 end_log_pos 174 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1350290211/*!*/; SET @@session.pseudo_thread_id=2/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1344274432/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 174 #121015 16:36:51 server id 1 end_log_pos 202 Intvar SET INSERT_ID=3/*!*/; # at 202 #121015 16:36:51 server id 1 end_log_pos 309 Query thread_id=2 exec_time=0 error_code=0 use test/*!*/; SET TIMESTAMP=1350290211/*!*/; insert into bin(name) values('xishizhaohua') /*!*/; # at 309 #121015 16:36:51 server id 1 end_log_pos 336 Xid = 28 COMMIT/*!*/; # at 336 #121015 16:37:25 server id 1 end_log_pos 379 Rotate to mysql_bin.000002 pos: 4 DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
雖然排版有點亂,但從圖中我們可以得到更多資訊,如時間戳記,自增的位移,是否自動認可事務等資訊。如下圖為從中提取的一部分。
3.利用bin_log恢複資料
(1).最長用的就是回複指定資料端的資料了,可以直接恢複到資料庫中:
mysqlbinlog --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 |mysql -uroot -p123456
亦可匯出為sql檔案,再匯入至資料庫中:
mysqlbinlog --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 >d:\1.sql source d:\1.sql
(2).指定開始\結束位置,從上面的查看產生的binary log我們可以知道某個log的開始到結束的位置,我們可以在恢複的過程中指定回複從A位置到B位置的log.需要用下面兩個參數來指定:
--start-positon="50" //指定從50位置開始 --stop-postion="100"//指定到100位置結束
最後介紹幾個bin_log的操作:
(1).產看最後一個bin記錄檔是那個,現在位置
(2).啟用新的記錄檔,一般備份完資料庫後執行
(3).清空現有的所用bin-log
4.binary log相關變數和參數
命令列參數
--log-bin [=file_name]
設定此參數表示啟用binlog功能,並制定路徑名稱。
--log-bin-index[=file]
設定此參數是指定二進位索引檔案的路徑與名稱。
--max_binlog_size
Binlog最大值,最大和預設值是1GB,該設定並不能嚴格控制Binlog的大小,尤其是Binlog比較靠近最大值而又遇到一個比較大事務時,
為了保證事務的完整性,不可能做切換日誌的動作,只能將該事務的所有SQL都記錄進當前日誌,直到事務結束。
--binlog-do-db=db_name
此參數表示只記錄指定資料庫的二進位日誌
--binlog-ignore-db=db_name
此參數表示不記錄指定的資料庫的二進位日誌
系統變數
log_bin
binlog_cache_size
此參數表示binlog使用的記憶體大小,可以通過狀態變數binlog_cache_use和binlog_cache_disk_use來協助測試。
max_binlog_cache_size
此參數表示binlog使用的記憶體最大的尺寸
binlog_cache_use
使用二進位日誌緩衝的事務數量
binlog_cache_disk_use
使用二進位日誌緩衝但超過binlog_cache_size值並使用臨時檔案來儲存事務中的語句的事務數量。
binlog_do_db
binlog_ignore_db
sync_binlog
這個參數直接影響mysql的效能和完整性。
sync_binlog=0:
當事務提交後,Mysql僅僅是將binlog_cache中的資料寫入binlog檔案,但不執行fsync之類的磁碟,同步指令通知檔案系統將緩衝重新整理到磁碟,而讓Filesystem自行決定什麼時候來做同步,這個是效能最好的。
sync_binlog=0,在進行n次事務提交以後,Mysql將執行一次fsync之類的磁碟同步指令,通知檔案系統將Binlog檔案快取重新整理到磁碟。
Mysql中預設的設定是sync_binlog=0,即不做任何強制性的磁碟排清指令,這時效能是最好的,但風險也是最大的。一旦系統Crash,在檔案系統快取中的所有Binlog資訊都會丟失。