1、二進制日志(binary log)介紹
二進制日志(binary log):記錄數據庫里的數據被修改。
(insert,update,delete,create,drop,alter)的相關語句;
作用:增量數據恢復和主從復制;
2、二進制日志(binary log)調整
[root@db01-51 ~]# mysql -S /data/3306/mysql.sock -e "show variables like '%log_bin%';" +---------------------------------+-----------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------+ | log_bin | ON |記錄binlog開關 | log_bin_basename | /data/3306/oldboy-bin | | log_bin_index | /data/3306/oldboy-bin.index |binlog文件 | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON |臨時不記錄binlog開關(增量恢復)某個時間點某些語句不記錄binlog +---------------------------------+-----------------------------+
臨時不記錄binlog(增量恢復)做主從同步的時候關閉會出現錯誤
mysql> set session sql_log_bin = OFF; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%log_bin%'; +---------------------------------+-----------------------------+ | Variable_name | Value | +---------------------------------+-----------------------------+ | log_bin | ON | | log_bin_basename | /data/3306/oldboy-bin | | log_bin_index | /data/3306/oldboy-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | OFF | +---------------------------------+-----------------------------+ 6 rows in set (0.00 sec)
binlog文件切割的條件:
a.數據庫重啟自動切割binlog為新文件。
b.執行mysqldump -F或mysqladmin flush-logs切割binlog為新文件。
c.binlog文件達到1.1G,自動切割binlog為新文件。
d.人為配置切割及調整
刪除binlog日志文件方法:
1.設置參數自動刪除
[root@db01-51 ~]# grep expire_logs_days /data/3306/my.cnf expire_logs_days = 7 [root@db01-51 ~]# mysql -S /data/3307/mysql.sock -e "show variables like 'expire_logs_days%';" +------------------+-------+ | Variable_name | Value | +------------------+-------+ | expire_logs_days | 7 | +------------------+-------+
2.從頭刪除到指定的文件位置
[root@db01-51 ~]# mysql -S /data/3307/mysql.sock -e "purge binary logs to 'xusx-bin.000002';" [root@db01-51 ~]# ll /data/3307/data/ drwx------ 2 mysql mysql 4096 Mar 19 08:11 xusx -rw-rw---- 1 mysql mysql 654021 Mar 20 18:17 xusx-bin.000002 ##--->01刪到02 -rw-rw---- 1 mysql mysql 32 Mar 20 23:44 xusx-bin.index
3.刪除指定的時間
mysql> PURGE MASTER LOGS BEFORE '2017-03-20 00:00:00';
4.刪除所有,重置
mysql> reset master; Query OK, 0 rows affected (0.03 sec)
MySQL binlog三種模式
二進制日志log-bin作用:
1、以二進制形式記錄更改數據庫的SQL語句(insert,update,delete,create,drop,alter等)。
2、用於MySQL主從復制。
3、增量數據備份及恢復
Row Level:
日志中會記錄成每一行數據被修改的情況,然后在slave端再對相同的數據進行修改。
優點:在row level模式下,bin-log中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄哪一條記錄被修改了,修改成什么樣。所以row level的日志內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解,而且不會出現某些特定情況下的存儲過程或function,以及trigger的調用和觸發無法被正確復制問題。
Statement Level(默認語句模式)
每一條被修改數據的sql都會記錄到master的bin-log中。slave在復制的時候sql進程會解析成和原來master端執行過的相同的sql來再次執行。
優點:statement level下的優點首先就是解決了row level下的缺點,不需要記錄每一行數據的變化,減少bin-log日志量,節約磁盤IO,提高性能。因為他只需要記錄在Master上所有執行的語句的細節,以及執行語句時候的上下文的信息。
Mixed:
實際上就是前兩種模式的結合。在Mixed模式下,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和Row之間選擇一種。新版本中的Statment level還是和以前一樣,僅僅記錄執行的語句。新版本的MySQL中對row level模式也被做了優化,並不是所有的修改都會以row level來記錄像遇到表結構變更的時候就會以statement模式來記錄,如果sql語句確實就是update或者delete等修改數據的語句,那么還是會記錄所有行的變更。
總結:
Statement level (默認語句模式)按照執行的SQL語句記錄
不需要記錄每行數據的變化,減少bin-log日志量,節約磁盤IO,提高性能
缺點:主從復制特殊功能會導致無法正常復制。存儲過程、觸發器、函數。
Row Level
按行記錄日志,細致,主從復制容易保持一致
缺點:數據量大
mixed:智能模式
數據量大選擇Statement Level,特殊可能引起數據不一致就選行模式
企業場景如何選擇binlog的模式
1、互聯網公司、使用MySQL的功能相對少(存儲過程、觸發器、函數)
選擇默認的語句模式,Statement Level(默認)
2、公司如果用到使用MySQL的特殊功能(存儲過程、觸發器、函數)
選擇Mixed模式
3、公司如果用到使用MySQL的特殊功能(存儲過程、觸發器、函數),又希望數據最大化,此時最好Row level模式
mysql> show variables like '%binlog_format%'; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+ 1 row in set (0.00 sec) mysql> set global binlog_format = 'ROW'; Query OK, 0 rows affected (0.00 sec) [root@db01-51 ~]# grep binlog_format /data/3306/my.cnf binlog_format = 'ROW' mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec)
修改3306中的數據
mysql> select * from test; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | +----+------+ 2 rows in set (0.00 sec) mysql> update test set name='kk'; Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from test; +----+------+ | id | name | +----+------+ | 1 | kk | | 2 | kk | +----+------+ 2 rows in set (0.00 sec)
查看binlog日志文件
[root@mysql-db03 ~]# mysqlbinlog --help|grep rows
'decode-rows' decodes row events into commented
[root@db01-51 3306]# mysqlbinlog --base64-output='decode-rows' -v oldboy-bin.000002 # at 904 #170321 1:17:07 server id 6 end_log_pos 970 CRC32 0xb53c660d Update_rows: table id 70 flags: STMT_END_F ### UPDATE `xusx`.`test` ### WHERE ### @1=1 ### @2='a' ### SET ### @1=1 ### @2='kk' ### UPDATE `xusx`.`test` ### WHERE ### @1=2 ### @2='b' ### SET ### @1=2 ### @2='kk' # at 970