利用二進制還原數據庫的時候,突然有點糾結,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*/;