二進制日志(binary log)介紹與調整


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 -Fmysqladmin 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM