MySQL的log_bin和sql_log_bin 的區別


利用二進制還原數據庫的時候,突然有點糾結,log_bin和sql_log_bin有什么區別呢?行吧,搜搜,結合自己的經驗,簡單說一下。
log_bin:二進制日志。

在 mysql 啟動時,通過命令行或配置文件決定是否開啟 binlog,而 log_bin 這個變量僅僅是報告當前 binlog 系統的狀態(打開與否)。若你想要關閉 binlog,你可以通過修改 sql_log_bin 並把原來的連接 kill 掉,也可以修改 log_bin,然后重啟 mysql,后者更徹底,缺點就是需要重啟。
在配置文件或命令行中開啟 binlog 時,可以為 log_bin 指定值(如–log_bin=mysql.bin),作為 binlog 文件的前綴名。

例如你UPDATE一個表,或者DELETE一些數據,即使該語句沒有匹配的數據,這個命令也會存儲到日志文件中,還包括每個語句執行的時間,也會記錄進去的。

說白了,就是把把在mysql里面執行的語句,記錄在二進制日志里面而已。
那么這些二進制日志有什么作用,你知道嗎?
1:數據恢復 
如果你的數據庫出問題了,而你之前有過備份,那么可以看日志文件,找出是哪個命令導致你的數據庫出問題了,想辦法挽回損失。 而且,你也可以利用二進制日志來還原你誤操作的數據庫。不過具體怎么操作還需要學的喲!

2:主從服務器之間同步數據 
主服務器上所有的操作都在記錄日志中,從服務器可以根據該日志來進行,以確保兩個同步。因此,我們經常做的mysql-salva也是利用master的二進制日志來和master數據一致的。

二進制日志一般都不小,要是想關閉怎么辦呢?
1:只有一個mysql服務器,那么可以簡單的注釋掉這個選項就行了。 
vim   /etc/my.cnf把里面的 log-bin 這一行注釋掉,重啟mysql服務即可。 


那么sql_log_bin是什么東東?

sql_log_bin 是一個動態變量,修改該變量時,可以只對當前會話生效(Session),也可以是全局的(Global),當全局修改這個變量時,只會對新的會話生效(這意味當對當前會話也不會生效),因此一般全局修改了這個變量后,都要把原來的所有連接 kill 掉。

用處:
當還原數據庫的時候,如果不關閉二進制日志,那么你還原的過程仍然會記錄在二進制日志里面,不僅浪費資源,那么增加了磁盤的容量,還沒有必要(特別是利用二進制還原數據庫的時候)所以一般還原的時候會選擇關閉二進制日志,可以通過修改配置文件,重啟關閉二進制日志。也可以動態命令關閉sql_log_bin,然后導入數據庫。

 

------------------------------------------------------------------------------------------------------------------------

二進制日志

1、二進制日志(binary log)介紹

  二進制日志(binary log):記錄數據庫里的數據被修改。

  (insert,update,delete,create,drop,alter)的相關語句;

  作用:增量數據恢復和主從復制;

2、二進制日志(binary log)調整

 1 mysql>  show variables like '%log_bin%';
 2 +---------------------------------+---------------------------------------+
 3 | Variable_name                   | Value                                 |
 4 +---------------------------------+---------------------------------------+
 5 | log_bin                         | ON                                    |記錄binlog開關
 6 | log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
 7 | log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
 8 | log_bin_trust_function_creators | OFF                                   |
 9 | log_bin_use_v1_row_events       | OFF                                   |
10 | sql_log_bin                     | ON                                    |為OFF時,臨時不記錄binlog開關(增量恢復)某個時間點某些語句不記錄binlog
11 +---------------------------------+---------------------------------------+

修改為臨時不記錄binlog,之后在進行數據操作,操作便不會記錄到到二進制日志中。

 1 mysql> set session sql_log_bin = 0;
 2 Query OK, 0 rows affected (0.00 sec)
 3 
 4 mysql>  show variables like '%log_bin%';
 5 +---------------------------------+---------------------------------------+
 6 | Variable_name                   | Value                                 |
 7 +---------------------------------+---------------------------------------+
 8 | log_bin                         | ON                                    |
 9 | log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
10 | log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
11 | log_bin_trust_function_creators | OFF                                   |
12 | log_bin_use_v1_row_events       | OFF                                   |
13 | sql_log_bin                     | OFF                                   |
14 +---------------------------------+---------------------------------------+

 查看日志

 1 [root@021rjsh216086s data]# mysqlbinlog -compact mysql-bin.000044
 2 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
 3 /*!40019 SET @@session.max_insert_delayed_threads=0*/;
 4 /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
 5 DELIMITER /*!*/;
 6 # at 4
 7 #180117 16:29:53 server id 1  end_log_pos 120 CRC32 0xe9eec1e7     Start: binlog v 4, server v 5.6.38-log created 180117 16:29:53
 8 # Warning: this binlog is either in use or was not closed properly.
 9 BINLOG '
10 gQlfWg8BAAAAdAAAAHgAAAABAAQANS42LjM4LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
11 AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAefB
12 7uk=
13 '/*!*/;
14 # at 120
15 #180117 16:30:29 server id 1  end_log_pos 199 CRC32 0xdf86372d     Query    thread_id=3    exec_time=0    error_code=0
16 SET TIMESTAMP=1516177829/*!*/;
17 SET @@session.pseudo_thread_id=3/*!*/;
18 SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
19 SET @@session.sql_mode=1075838976/*!*/;
20 SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
21 /*!\C utf8 *//*!*/;
22 SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
23 SET @@session.lc_time_names=0/*!*/;
24 SET @@session.collation_database=DEFAULT/*!*/;
25 BEGIN
26 /*!*/;
27 # at 199
28 #180117 16:30:29 server id 1  end_log_pos 310 CRC32 0xc0c60628     Query    thread_id=3    exec_time=0    error_code=0
29 use `test`/*!*/;
30 SET TIMESTAMP=1516177829/*!*/;
31 insert into class values (8,'咳咳')                            --這就是剛insert的數據,但是臨時不記錄binlog后,之后的insert語句就沒進來
32 /*!*/;
33 # at 310
34 #180117 16:30:29 server id 1  end_log_pos 341 CRC32 0x8af81f01     Xid = 46
35 COMMIT/*!*/;
36 DELIMITER ;
37 # End of log file
38 ROLLBACK /* added by mysqlbinlog */;
39 /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
40 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

 

二進制日志的三種模式

  語句級:Statement (默認),包含的是原始的sql語句。

  行級:Row,包含的是行更改的信息。

  混合級:Mixed,前兩種模式的結合,Mysql根據實際開銷情況選擇到底使用哪種模式。

 1 mysql>  show variables like '%binlog_format%';
 2 +---------------+-----------+
 3 | Variable_name | Value     |
 4 +---------------+-----------+
 5 | binlog_format | STATEMENT |                      默認是語句級
 6 +---------------+-----------+
 7 1 row in set (0.00 sec)
 8 
 9 mysql> set global binlog_format = 'ROW';           將模式修改為行級
10 Query OK, 0 rows affected (0.00 sec)
11 
12 mysql>  show variables like '%binlog_format%';     必須退出,重新登錄mysql,才能看到變成ROW
13 +---------------+-----------+
14 | Variable_name | Value     |
15 +---------------+-----------+
16 | binlog_format | ROW       |
17 +---------------+-----------+
18 1 row in set (0.00 sec)

  

之后插入一條語句 insert into class values (10,'行級');,再看二進制日志的內容

 1 [root@021rjsh216086s data]#  mysqlbinlog --base64-output='decode-rows' -v mysql-bin.000046         行級為row的必須用這種方式查
 2 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
 3 /*!40019 SET @@session.max_insert_delayed_threads=0*/;
 4 /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
 5 DELIMITER /*!*/;
 6 # at 4
 7 #180117 17:17:17 server id 1  end_log_pos 120 CRC32 0xc178a01f     Start: binlog v 4, server v 5.6.38-log created 180117 17:17:17
 8 # Warning: this binlog is either in use or was not closed properly.
 9 # at 120
10 #180117 17:17:32 server id 1  end_log_pos 192 CRC32 0x850ebcdb     Query    thread_id=13    exec_time=0    error_code=0
11 SET TIMESTAMP=1516180652/*!*/;
12 SET @@session.pseudo_thread_id=13/*!*/;
13 SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
14 SET @@session.sql_mode=1075838976/*!*/;
15 SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
16 /*!\C utf8 *//*!*/;
17 SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
18 SET @@session.lc_time_names=0/*!*/;
19 SET @@session.collation_database=DEFAULT/*!*/;
20 BEGIN
21 /*!*/;
22 # at 192
23 #180117 17:17:32 server id 1  end_log_pos 243 CRC32 0x6ab562be     Table_map: `test`.`class` mapped to number 72
24 # at 243
25 #180117 17:17:32 server id 1  end_log_pos 290 CRC32 0x1371869f     Write_rows: table id 72 flags: STMT_END_F
26 ### INSERT INTO `test`.`class`
27 ### SET
28 ###   @1=10
29 ###   @2='行級'
30 # at 290
31 #180117 17:17:32 server id 1  end_log_pos 321 CRC32 0x90e5a3ef     Xid = 82
32 COMMIT/*!*/;
33 DELIMITER ;
34 # End of log file
35 ROLLBACK /* added by mysqlbinlog */;
36 /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
37 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

 

 


免責聲明!

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



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