MySQL的binlog日誌做用是用來記錄mysql內部增刪改查等對mysql數據庫有更新的內容的記錄(對數據庫的改動),對數據庫的查詢select和show等操做不會被binlog日誌記錄;主要用於數據庫的主從複製以及增量恢復。mysql的binlog日誌必須打開log-bin功能才能生存binlog日誌必須打開log-bin功能才能生成binlog日誌。mysql
一、打開mysql的log-bin功能linux
編輯my.cnf配置文件,首先要找到這個配置文件,不一樣的操做系統和安裝方式最終呈現的目錄結構是不同的,下面以linux操做系統爲例進行說明sql
二進制文件安裝:數據庫
將下載的mysql tar文件安裝包在指定目錄進行解壓,則會生成下圖所示的目錄vim
源碼安裝:安全
編譯完源碼以後,便開始安轉。默認狀況下,能夠將文件安裝到/usr/local,即在該目錄下生成下面的一系列子目錄bash
能夠看到上面兩種不一樣的安裝方式,在一個安裝目錄內,遠嗎安裝的目錄佈局徹底不一樣於二進制安裝:服務器
mysqld服務器被安裝在「libexec」目錄而不是「bin」目錄內。socket
瞭解了mysql的目錄結構以後,my.cnf配置文件通常都在/opt/mysql/data/database_instance_name/my.cnf函數
編輯my.cnf配置文件
# grep log-bin my.cnf log-bin = /data/3306/mysql-bin
添加完成以後查看是否已經啓動了日誌
mysql>show variables like 'log_bin';
二、Mysqlbinlog解析工具
Mysqlbinlog命令功能是將Mysql的binlog日誌轉換成Mysq領域具。默認狀況下binlog日誌是二進制文件,沒法直接查看
Mysqlbinlog參數以下所示:
參數 | 描述 |
-d | 指定庫的binlog |
-r | 至關於重定向到指定文件 |
--start-position--stop-position | 按照指定位置精確解析binlog日誌(精確),如不接--stop-positiion則一直到binlog日誌結尾 |
--start-datetime--stop-datetime | 按照指定時間解析binlog日誌(模糊,不許確),如不接--stop-datetime則一直到binlog日誌結尾 |
備註:mysqlbinlog分庫處處binlog,如使用-d參數,那麼在導入更新數據時須要在mysql命令行使用use database命令進入到相應的數據庫中。由於bin-log裏記錄了在改mysql上面存儲的全部數據庫的增量操做信息,可是實際使用中咱們經常須要針對某一個數據庫分別進行,因此一般須要使用mysqlbinlog將binlog分庫導出。
例如:解析test數據庫的binlog日誌並將其寫入my.sql文件中。
#mysqlbinlog -d test mysql-bin.000001 -r my.sql
經過條件查詢精確解析日誌:
mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql mysqlbinlog dadong-bin.000005 --start-position=2265 --stop-position=2552 -r pos.sql mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql 截取部分binlog根據pos mysqlbinlog dadong-bin.000009 --start-position=365 --stop-position=456 -r pos.sql mysqlbinlog dadong-bin.000009 --start-position=365 -r pos.sql mysqlbinlog dadong-bin.000009 --stop-position=456 -r pos.sql 截取部分binlog根據時間 mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15' --stop-datetime='2014-10-16 17:15:15' -r time.sql mysqlbinlog dadong-bin.000009 --start-datetime='2014-10-16 17:14:15' -r time.sql mysqlbinlog dadong-bin.000009 --stop-datetime='2014-10-16 17:15:15' -r time.sql
總結:
以insert into xxtable values (x,y,z)爲例, 影響: 1行,且爲新增1行, 對於其餘行沒有影響. 這個狀況,用row格式,直接複製磁盤上1行的新增變化. 以update xxtable set age=21 where name=’sss’; 這個狀況,通常也只是影響1行. 用row也比較合適. 以過年發紅包,全公司的人,都漲薪100元. update xxtable set salary=salary+100; 這個語句帶來的影響,是針對每一行的, 所以磁盤上不少row都發生了變化. 此處,適合就statment格式的日誌. 2種日誌,各有各的高效的地方,mysql提供了mixed類型. 能夠根據語句的不一樣,而自動選擇適合的日誌格式.
四、MySQL企業binlog模式的選擇
1
2
3
4
5
6
7
8
9
10
|
mysql>show global variables like
"binlog%"
;
+-----------------------------------------+-----------+
| Variable_name | Value |
+-----------------------------------------+-----------+
| binlog_cache_size | 1048576 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_format | STATEMENT |
#系統默認爲STATEMENT模式
| binlog_stmt_cache_size | 32768 |
+-----------------------------------------+-----------+
4 rows
in
set
(0.00 sec)
|
1
|
mysql>
set
global binlog_format=
'ROW'
;
|
1
2
3
4
5
6
|
#vim my.cnf
[mysqld]
binlog_format=
'ROW'
#放在mysqld模塊下面
user = mysql
port = 3306
socket =
/data/3306/mysql
.sock
|
service mysqld restart或者./mysqld restart
固然如今不少公司爲了安全起見對mysql的原生命令好比mysqld進行了改造 不能直接經過該命令句進行重啓等操做 須要使用自定義的命令進行操做