Mysql当前模式让不记录日志_MySQL日志binlog的三种模式
1三種模式的介紹
二進制日志binlog作用:
1、以二進制形式記錄更改數據庫的SQL語句(insert,update,delete,create,drop,alter等)
2、用于Mysql主從復制
3、增量數據庫備份及恢復
1.1Row模式
日志會記錄成每一行數據被修改成的形式,然后再slave端再對相同的數據進行修改,只記錄要修改的數據,只有value,不會有sql多表關聯的情況。
優點:在row模式下,bin-log中可以不記錄執行的sql語句的上下文相關信息,僅僅需要記錄哪一條記錄被修改了,修改成什么信樣了,所以row的日志內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解。而且不會出現在某些特定情況下的存儲過程和function,以及trigger的調用和處罰無法被正確復制問題。
缺點:在row模式下,所有執行的語句當記錄到日志中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日志內容。比如有這樣一條update語句:updateproduct set name='gongli'這條語句不是記錄的一條,而是修改每一條的都會記錄下來
1.2Statement模式
每一條會修改數據的sql都會記錄到master的binlog中,slave在復制的時候sql進程會解析成和原來master端相同的sql再執行。
優點:在Statement模式下首先就是解決了row模式下的缺點,不需要記錄記錄每一行日志的變化,減少了bin-log日志量,節省了I/O以及存儲資源,提高性能。因為它們只需要激勵在master上所執行的語句的細節以及執行語句時候的上下文信息。
缺點:在Statement模式下,由于它記錄的執行語句,所以,為了讓這些語句在slave端也能正確執行,那么它還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信息,以保證所有語句在slave端被執行的時候能夠得到和在master端執行時候的結果。另外,由于MySQL現在發展較快,很多的新功能不斷的加入,使MySQL的復制遇到了不小的挑戰,自然復制的時候涉及到越復雜的內容,bug也就越容易出現。在Statement中,目前已經發現不少情況會造成MySQL的復制出現問題,主要是修改數據的時候使用了某些特定的函數或者功能的時候會出現。比如:sleep()函數在有些版本中就不能直接復制,在存儲過程中使用了last_insert_id()函數,可能會使slave和master上得到不一致的id等等。由于rowlevel是基于每一行來記錄的變化,所以不會出現類似的問題
1.3Mixed模式
從官方文檔中看到,之前的MySQL一直都只有基于Statement的復制模式,知道5.1.5版本的MySQL才開始支持row模式。從5.0開始,MySQL的復制已經解決了大量老版本中出現的無法正確復制的問題。但是由于存儲過程的出現,給MySQL replication又帶來了更大的挑戰。另外,看到官方文檔說,從5.1.8版本開始,MySQL提供了除Statement和row之外的第三種模式:mixed,實際上就是前兩種模式的結合。在mixed模式下,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日志形式,也就是在Statement和row之間選擇一種。新版本中的Statement還是和以前一樣,僅僅記錄執行的語句。而新版本的MySQL中對row模式也做了優化,并不是所有的修改都會以row模式來記錄,比如遇到表結構變更的時候就會以Statement模式來記錄,如果sql語句確實是update或者delete等修改數據的語句,那么還是會記錄所有行的變更。
2小結
Statement:
優點:記錄的簡單,內容少
缺點:導致主從不一致
例:
100w條記錄
updatetest set name='tintin';
binilog 里面就只用update test set name='tintin';
ROW行級模式
優點:記錄數據詳細(每行),主從一直
缺點:占用大量的磁盤空間,降低了磁盤的性能
100w條記錄
updatetest set name='tintin';
binilog 里面就用100w條update test set name='tintin';語句
MIXED混合模式
100w條記錄
updatetest set name='tintin';
binilog 里面就只用update test set name='tintin';
對于函數,觸發器,存儲過程
會自動的使用row-level模式
1實戰操作
1.1要想mysql能用三種模式,必須開啟binlog功能
[root@db01 ~]# mysql -uroot -p789 -S/data/3306/mysql.sock -e "show variables like '%log_bin%';"
+---------------------------------+-------+
| Variable_name?????????????????? | Value |
+---------------------------------+-------+
| log_bin????????????????????????| ON??|
| log_bin_trust_function_creators | OFF?? |
| sql_log_bin???????????????????? | ON??? |
+---------------------------------+-------+
配置文件里面配置
[root@db01 ~]# egrep "log-bin"/data/3306/my.cnf
log-bin = /data/3306/mysql-bin
1.2查看當前的binlog日志模式
[root@db01 ~]# mysql -uroot -p789 -S/data/3306/mysql.sock -e "show variables like '%binlog_format%';"
+---------------+-----------+
| Variable_name | Value???? |
+---------------+-----------+
| binlog_format | STATEMENT|
+---------------+-----------+
1.3演示操作
1.3.1查看當前的binlog文件
[root@db01 3306]# ls
data???mysql-bin.000001?mysql-bin.000004? mysqld.pid
my.cnf?mysql-bin.000002?mysql-bin.000005?mysql_oldboy3306.err
mysql??mysql-bin.000003?mysql-bin.index?? mysql.sock
[root@db01 3306]# mysqlbinlog mysql-bin.000005
1.3.2使用mysqlbinlog來查看二進制的binglog文件
1.3.3模仿操作
update一條數據
mysql> select * from test2;
+----+--------+
| id | name??|
+----+--------+
|? 1 | oldboy|
|? 2 | gongli|
|? 3 |inca?? |
|? 4 |sb???? |
|? 5 |kaka?? |
|? 6 |doubi? |
+----+--------+
6 rows in set (0.00 sec)
mysql> update test2 set name="laowang"where id=5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1?Changed: 1? Warnings: 0
mysql> select * from test2;
+----+---------+
| id | name???|
+----+---------+
|? 1 |oldboy? |
|? 2 |gongli? |
|? 3 |inca??? |
|? 4 |sb????? |
|? 5 |laowang |
|? 6 |doubi?? |
+----+---------+
6 rows in set (0.00 sec)
查看binlog日志記錄
[root@db01 3306]# mysqlbinlog mysql-bin.000005
# at 7610
#160828 22:39:12 server id 1? end_log_pos 7717? Query??thread_id=32??? exec_time=0??????? error_code=0
SET TIMESTAMP=1472395152/*!*/;
update test2 set name="laowang" whereid=5
/*!*/;
# at 7717
#160828 22:39:12 server id 1? end_log_pos 7744? Xid = 299
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
1.4row模式演示
1.4.1修改binlog為row模式
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value???? |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.02 sec)
mysql> set global binlog_format = 'ROW';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value???? |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
mysql> show global variables like'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW?? |
+---------------+-------+
1 row in set (0.00 sec)
臨時修改:
mysql> set global binlog_format ='ROW';
永久修改:
修改my.cnf配置文件
1.4.2對表進行操作
update表test2
mysql> select * from test2;
+----+---------+
| id | name???|
+----+---------+
|? 1 |oldboy? |
|? 2 |gongli? |
|? 3 |inca??? |
|? 4 |sb????? |
|? 5 |laowang |
|? 6 |doubi?? |
+----+---------+
6 rows in set (0.00 sec)
mysql> update test2 setname='dadou';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6?Changed: 6? Warnings: 0
mysql> select * from test2;
+----+-------+
| id | name?|
+----+-------+
|? 1 | dadou|
|? 2 | dadou|
|? 3 | dadou|
|? 4 | dadou
1.4.3查看binlog日志文件
[root@db01 3306]# ls
data???mysql????????????mysql-bin.000005?mysql-bin.000007? mysql-bin.index? mysql_oldboy3306.err
my.cnf?mysql-bin.000004?mysql-bin.000006?mysql-bin.000008? mysqld.pid?????? mysql.sock
[root@db01 3306]# mysqlbinlog mysql-bin.000008
BINLOG '
GP3CVxMBAAAAMQAAAJ0CAAAAACMAAAAAAAEABm9sZGJveQAFdGVzdDIAAgP+Av48AA==
GP3CVxgBAAAAogAAAD8DAAAAACMAAAAAAAEAAv///AEAAAAGb2xkYm95/AEAAAAFZGFkb3X8AgAA
AAZnb25nbGn8AgAAAAVkYWRvdfwDAAAABGluY2H8AwAAAAVkYWRvdfwEAAAAAnNi/AQAAAAFZGFk
b3X8BQAAAAdsYW93YW5n/AUAAAAFZGFkb3X8BgAAAAVkb3ViafwGAAAABWRhZG91這里我們會看到這些編碼
'/*!*/;
# at 831
#160828 23:02:48 server id 1? end_log_pos 858?? Xid = 12
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SETCOMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
查看row模式下的編碼
mysqlbinlog --base64-output="decode-rows"--verbose? mysql-bin.000008
再次查看
總結
以上是生活随笔為你收集整理的Mysql当前模式让不记录日志_MySQL日志binlog的三种模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python输出奇数数字序位_pytho
- 下一篇: python咖啡名称提取_(转)Pyth