mysql 日誌之二進位制日誌

wl365365發表於2015-07-13
二進位制日誌檔案的作用   
    Mysql的二進位制日誌記錄的是所有mysql資料庫發生變更的資訊,因此對資料庫非常重要,二進位制日誌的作用我概括了一下主要包含如下幾個方面:
1、可以用於資料庫基於時間點的還原。
2、可以用來分析資料庫發生更改的情況,比如程式的bug導致資料庫資料更改等等。
3、二進位制日誌還可以用來重建資料庫。


二進位制開啟狀態:
| log_bin                                 | ON                         |
| log_bin_basename                        | /mysql/log/mysql-bin       |
| log_bin_index                           | /mysql/log/mysql-bin.index |





二進位制日誌相關的引數:

mysql> show global variables like "%log%";

sql_log_bin ={ON|OFF}     #用於控制會話級別二進位制日誌功能的開啟或關閉。預設為ON,表示啟用記錄功能。使用者可以在會話級別修改此變數的值,但其必須具有SUPER許可權。
binlog_cache_size =32768   #預設值32768 Binlog Cache用於在開啟了二進位制日誌(binlog)記錄功能的環境,是MySQL 用來提高binlog的記錄效率而設計的一個用於短時間內臨時快取binlog資料的記憶體區域。一般來說,如果我們的資料庫中沒有什麼大事務,寫入也不是特別頻繁,2MB~4MB是一個合適的選擇。但是如果我們的資料庫大事務較多,寫入量比較大,可與適當調高binlog_cache_size。同時,我們可以透過binlog_cache_use 以及 binlog_cache_disk_use來分析設定的binlog_cache_size是否足夠,是否有大量的binlog_cache由於記憶體大小不夠而使用臨時檔案(binlog_cache_disk_use)來快取了。
binlog_stmt_cache_size= 32768       #當非事務語句使用二進位制日誌快取,但是超出binlog_stmt_cache_size時,使用一個臨時檔案來存放這些語句。
log_bin = mysql-bin#指定binlog的位置,預設在資料目錄下。
binlog-format= {ROW|STATEMENT|MIXED}     #指定二進位制日誌的型別,預設為MIXED。如果設定了二進位制日誌的格式,卻沒有啟用二進位制日誌,則MySQL啟動時會產生警告日誌資訊並記錄於錯誤日誌中。
sync_binlog = 10#設定多久同步一次二進位制日誌至磁碟檔案中,0表示不同步,任何正數值都表示對二進位制每多少次寫操作之後同步一次。當autocommit的值為1時,每條語句的執行都會引起二進位制日誌同步,否則,每個事務的提交會引起二進位制日誌同步
max_binlog_cache_size= {4096 .. 18446744073709547520}      #二進定日誌快取空間大小,5.5.9及以後的版本僅應用於事務快取,其上限由max_binlog_stmt_cache_size決定。
max_binlog_stmt_cache_size= {4096 .. 18446744073709547520}    #二進定日誌快取空間大小,5.5.9及以後的版本僅應用於事務快取
expire_log_days ={0..99}    #設定二進位制日誌的過期天數,超出此天數的二進位制日誌檔案將被自動刪除。預設為0,表示不啟用過期自動刪除功能。如果啟用此功能,自動刪除工作通常發生在MySQL啟動時或FLUSH日誌時。


二進位制日誌定義方式:
其一、log_bin可以直接定義為檔案路徑,也可以為ON|OFF。
其二、透過編輯my.cnf中的log-bin選項可以開啟二進位制日誌;形式如下:


[root@stu18 ~]#my.cnf
[mysqld]
log-bin [=DIR \ [filename]]
其中,DIR引數指定二進位制檔案的儲存路徑;filename引數指定二級制檔案的檔名,其形式為filename.number,number的形式為000001、000002等。每次重啟mysql服務或執行mysql> flush logs;都會生成一個新的二進位制日誌檔案,這些日誌檔案的number會不斷地遞增。除了生成上述的檔案外還會生成一個名為filename.index的檔案。這個檔案中儲存所有二進位制日誌檔案的清單又稱為二進位制檔案的索引。

[root@localhost log]# mysqlbinlog mysql-bin.000001 
# at 197
#150615 13:44:19 server id 1  end_log_pos 294 CRC32 0x6536d798 Query thread_id=1 exec_time=0 error_code=0
use `tts`/*!*/;
SET TIMESTAMP=1434347059/*!*/;
insert into a1 values (2)
/*!*/;
# at 294
#150615 13:44:19 server id 1  end_log_pos 325 CRC32 0x95d8b34f Xid = 15
COMMIT/*!*/;




如果說我們向某個表的某個欄位插入一個資料而這個資料為當前時間(日期時間型);過段時間將此二進位制檔案應用到另一臺伺服器上資料就會變動從而導致資料的不一致性所以說對於這種非確定性的資料使用預設的語句定義並不是可靠的;


二進位制日誌中常用的定義格式:

1、語句(statement):預設的記錄格式
2、行(row):定義的並非資料本身而是這一行的資料是什麼;
3、混合模式(mixed):交替使用行和語句、由mysql伺服器自行判斷。
其中基於行的定義格式資料量會大一些但是可以保證資料的精確性。


檢視二進位制日誌:
二進位制日誌的定義方式為二進位制格式;使用此格式可以儲存更多的資訊,並且可以使寫入二進位制日誌的效率更高。但是不能直接使用檢視命令開啟並檢視二進位制日誌。

mysql> show binary logs;     #顯示當前伺服器使用的二進位制檔案及大小
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       325 |
+------------------+-----------+
1 row in set (0.00 sec)


mysql> show master logs;      #顯示主伺服器使用的二進位制檔案及大小
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       325 |
+------------------+-----------+
1 row in set (0.00 sec)


mysql> show master status;   #當前使用的二進位制檔案及所處位置
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      325 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


小擴充套件:二進位制日誌的記錄位置:通常為上一個事件執行結束時間的位置,每一個日誌檔案本身也有自己的後設資料所以說對於當前版本的mysql來說二進位制的開始位置通常為107;




mysql> flush logs;
Query OK, 0 rowsaffected (0.23 sec)
注意:flush logs一般只會滾動中繼日誌和二進位制日誌。
mysql> showmaster status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011|      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00sec)
檢視當前二進位制檔案的資訊:


檢視二進位制日誌資訊的命令:

SHOW BINLOG EVENTS[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
mysql> showbinlog events\G         #檢視所有的二進位制資訊
***************************87. row ***************************
   Log_name: mysql-bin.000001
        Pos: 13580
 Event_type: Query
  Server_id: 1
End_log_pos: 13688
       Info: use `hellodb`; /*!40000 ALTERTABLE `toc` DISABLE KEYS */
***************************88. row ***************************
   Log_name: mysql-bin.000001
        Pos: 13688
 Event_type: Query
  Server_id: 1
End_log_pos: 13795
       Info: use `hellodb`; /*!40000 ALTERTABLE `toc` ENABLE KEYS */
***************************89. row ***************************
   Log_name: mysql-bin.000001
        Pos: 13795
 Event_type: Stop
  Server_id: 1
End_log_pos: 13814
       Info:
89 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011';    #檢視指定日誌的二進位制資訊
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                         |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011|   4 | Format_desc |         1 |         107 | Server ver: 5.5.33-log, Binlogver: 4        |
| mysql-bin.000011 |107 | Query       |         1 |         190 | create database yong                         |
| mysql-bin.000011 |190 | Query       |         1 |         293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query       |         1 |         357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query       |         1 |         452 | insert into yong.tb1values(1,'tom')         |
| mysql-bin.000011 |452 | Xid         |         1 |         479 | COMMIT /* xid=103 */                         |
+------------------+-----+-------------+-----------+-------------+----------------------------------------------+
6 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011' from 190; #從指定的事件位置開始
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| Log_name         | Pos | Event_type | Server_id |End_log_pos | Info                                         |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011 |190 | Query      |         1 |         293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query      |         1 |         357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query      |         1 |         452 | insert into yong.tb1values(1,'tom')         |
| mysql-bin.000011 |452 | Xid        |         1 |         479 | COMMIT /* xid=103 */                         |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
4 rows in set (0.00sec)
mysql> showbinlog events in 'mysql-bin.000011' from 190 limit 3;  #指定偏移量(不是語句,是事件)
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| Log_name         | Pos | Event_type | Server_id |End_log_pos | Info                                         |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
| mysql-bin.000011 |190 | Query      |         1 |         293 | create table yong.tb1 (idint,name char(20)) |
| mysql-bin.000011 |293 | Query      |         1 |         357 | BEGIN                                        |
| mysql-bin.000011 |357 | Query      |         1 |         452 | insert into yong.tb1values(1,'tom')         |
+------------------+-----+------------+-----------+-------------+----------------------------------------------+
3 rows in set (0.00sec)
命令列下檢視二進位制日誌:


由於無法使用cat等方式直接開啟並檢視二進位制日誌;所以必須使用mysqlbinlog命令。但是當正在執行mysql讀寫操作時建議不要使用此開啟正在使用的二進位制日誌檔案;若非要開啟可flush logs。mysqlbinlog命令的使用方式:


[root@stu18 data]#mysqlbinlog mysql-bin.000017        #必須在資料目錄下
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET@@session.max_insert_delayed_threads=0*/;
/*!50003 SET@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4       #事件開始處
#131009  0:25:59 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.33-log created 131009  0:25:59 
# Warning: thisbinlog is either in use or was not closed properly.
BINLOG '
FzJUUg8BAAAAZwAAAGsAAAABAAQANS41LjMzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#131009  0:26:36 server id 1  end_log_pos 192   Query   thread_id=12    exec_time=0 error_code=0     #131009 0:26:36年月日的簡寫方式;end_log_pos事件結束處;thread_id=12 哪個會話執行緒建立的此語句;exec_time=0 執行時長單位為秒;error_code=0 錯誤程式碼0表示沒有
SET TIMESTAMP=1381249596/*!*/;      #預設資訊(環境設定)
匯出此資料庫的資訊:


1
[root@stu18 data]#mysqlbinlog mysql-bin.000017 > /tmp/a.sql
匯入此資料庫的資訊:


1
[root@stu18 data]#mysql < a.sql
刪除二進位制日誌資訊:


二進位制日誌會記錄大量的資訊(其中包含一些無用的資訊)。如果很長時間不清理二進位制日誌,將會浪費很多的磁碟空間。但是,刪除之後可能導致資料庫崩潰時無法進行恢復,所以若要刪除二進位制日誌首先將其和資料庫備份一份,其中也只能刪除備份前的二進位制日誌,新產生的日誌資訊不可刪(可以做即時點還原)。也不可在關閉mysql伺服器之後直接刪除因為這樣可能會給資料庫帶來錯誤的。若非要刪除二進位制日誌需要做如下操作:匯出備份資料庫和二進位制日誌檔案進行壓縮歸檔儲存。刪除二進位制檔案的方法如下:


1、刪除所有的二進位制日誌(不可效仿):


使用RESET MASTER語句可以刪除所有的二進位制日誌。該語句的形式如下:




mysql> resetmaster;           
Query OK, 0 rowsaffected (0.17 sec)
mysql> showbinary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001|       107 |
+------------------+-----------+
1 row in set (0.04sec)
解析:首先不建議在生產環境下使用此操作;刪除所有的二進位制日誌後,Mysql將會重新建立新的二進位制日誌。新二進位制日誌的編號從000001開始。


2、根據檔案或時間點來刪除二進位制日誌:


語法形式:


1
mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr }
其中TO'log_name'表示把這個檔案之前的其他檔案都刪除掉,也可使用BEFORE datetime_expr指定把哪個時間之前的二進位制檔案刪除了。


mysql> PURGEBINARY LOGS TO 'mysql-bin.000007';
Query OK, 0 rowsaffected (0.11 sec)
mysql> showbinary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000007|       150 |
| mysql-bin.000008|       150 |
| mysql-bin.000009|       150 |
| mysql-bin.000010|       150 |
| mysql-bin.000011|       150 |
| mysql-bin.000012|       150 |
| mysql-bin.000013|       150 |
| mysql-bin.000014|       150 |
| mysql-bin.000015|       150 |
| mysql-bin.000016|       150 |
| mysql-bin.000017|       483 |
+------------------+-----------+
11 rows in set (0.04sec)
[root@stu18 data]#cat mysql-bin.index
./mysql-bin.000007
./mysql-bin.000008
./mysql-bin.000009
./mysql-bin.000010
./mysql-bin.000011
./mysql-bin.000012
./mysql-bin.000013
./mysql-bin.000014
./mysql-bin.000015
./mysql-bin.000016
./mysql-bin.000017
由此可以看出這種清理二進位制日誌檔案的方式是非常合理的,不會導致資料庫的錯誤發生。


1
2
mysql> PURGEBINARY LOGS BEFORE '13-10-19 10:26:36'; #使用時間來刪除二進位制日誌
Query OK, 0 rowsaffected (0.05 sec)
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22039464/viewspace-1731512/,如需轉載,請註明出處,否則將追究法律責任。

相關文章