MySQL常見日誌
Error log 錯誤日誌
General query log 普通查詢日誌
Slow query log 慢查詢日誌
Binary log 二進制日誌
下面重點描述二進制日誌 Binary log ,Binary log 簡寫爲 binlog
其作用:
1、增量備份(只備份新增的)
2、主從複製
在MySQL5.7中binlog默認不開啓,現在我們去看下
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename | |
| log_bin_index | |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
6 rows in set (0.00 sec)
mysql>
可以看出 log_bin 爲OFF是沒有開啓。下面開啓binlog日誌,退出mysql,在終端編輯mysql的配置文件,添加以下配置
[root@master /]# vi /etc/my.cnf
#start binlog
server-id=1
log-bin=/var/lib/mysql/mysql-bin
注意:sever-id一個節點只能有一個,添加後重啓mysql服務。
[root@master /]# service mysqld restart
再次查看binlog日誌是否開啓
1、直接在剛剛配置的目錄下查看
看到mysql-bin.000001就說明binlog日誌已經開啓
其中:mysql-bin.000001的.000001指的是第一個mysql的二進制日誌的數據文件,mysql-bin.index指的是二進制日誌的索引文件。
2、進入到mysql輸入
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
6 rows in set (0.00 sec)
看到log_bin爲NO說明binlog日誌已經開啓。其中 log_bin_basename就指的是你mysql-bin.000001。log_bin_index 指的是mysql-bin.index文件。
對於剛開啓的binlog日誌文件,它的索引文件了裏應只有一條索引記錄,現在我們去看下
[root@master /]# cat /var/lib/mysql/mysql-bin.index
/var/lib/mysql/mysql-bin.000001
[root@master /]#
可以看到只記錄了一個索引。現在我們去看下binog日誌文件的內容
方法一:終端下查看
[root@master mysql]# cat mysql-bin.000001
_þbinJ]w{5.7.27-logJ]8
發現內容很奇怪,要注意此時在Linux終端無法用cat命令查看mysql-bin.000001文件,因爲該文件是一個二進制文件,cat命令無法解析二進制,因此應當用專有命令去查看,輸入
[root@master mysql]# mysqlbinlog mysql-bin.000001
內容爲:
[root@master mysql]# mysqlbinlog mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190927 7:30:26 server id 1 end_log_pos 123 CRC32 0xbf35e26a Start: binlog v 4, server v 5.7.27-log created 190927 7:30:26 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
EkqNXQ8BAAAAdwAAAHsAAAABAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAASSo1dEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AWriNb8=
'/*!*/;
# at 123
#190927 7:30:26 server id 1 end_log_pos 154 CRC32 0xcb265d2a Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@master mysql]#
方法二:mysql中查看
mysql> show binlog events;
首先查案所有記錄在案的日誌大體信息
要查看具體某一日誌文件信息時後面跟上文件名即可
mysql> show binlog events in 'fileName';
爲了初步解釋說明binlog日誌文件,現在我們創建一個數據庫和表並插入一條數據,
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table suer( id int, name varchar(10));
Query OK, 0 rows affected (0.13 sec)
mysql> insert into suer values(1,'bear');
Query OK, 1 row affected (0.10 sec)
mysql> insert into suer values(1,'bear');
Query OK, 1 row affected (0.10 sec)
上述過程中有幾個輸入錯誤的語句,這裏我直接把正確的寫了上去。此時我們再次查看日誌文件信息
可以發現多出了一些日誌信息,即binlog日誌可以記錄我們的所有操作。
接下來我們來具體分析下binlog日誌文件
首先注意到下圖的Pos列中操作之前多了154到720等信息,這裏我們針對一個來進行分析,我們這裏選擇219
在終端打開binlog日誌文件
[root@master mysql]# mysqlbinlog mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190927 7:30:26 server id 1 end_log_pos 123 CRC32 0xbf35e26a Start: binlog v 4, server v 5.7.27-log created 190927 7:30:26 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
EkqNXQ8BAAAAdwAAAHsAAAABAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAASSo1dEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AWriNb8=
'/*!*/;
# at 123
#190927 7:30:26 server id 1 end_log_pos 154 CRC32 0xcb265d2a Previous-GTIDs
# [empty]
# at 154
#190927 8:07:23 server id 1 end_log_pos 219 CRC32 0x36668b6d Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#190927 8:07:23 server id 1 end_log_pos 313 CRC32 0xa2c769a7 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1569542843/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database test
/*!*/;
# at 313
#190927 8:09:13 server id 1 end_log_pos 378 CRC32 0x483ce4d2 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 378
#190927 8:09:13 server id 1 end_log_pos 496 CRC32 0x5432a21d Query thread_id=3 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1569542953/*!*/;
create table suer( id int, name varchar(10))
/*!*/;
# at 496
#190927 8:12:26 server id 1 end_log_pos 561 CRC32 0x0c142d46 Anonymous_GTID last_committed=2 sequence_number=3 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 561
#190927 8:12:26 server id 1 end_log_pos 633 CRC32 0x36aa3246 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1569543146/*!*/;
BEGIN
/*!*/;
# at 633
#190927 8:12:26 server id 1 end_log_pos 683 CRC32 0x784f3f10 Table_map: `test`.`suer` mapped to number 110
# at 683
#190927 8:12:26 server id 1 end_log_pos 728 CRC32 0xac344fee Write_rows: table id 110 flags: STMT_END_F
BINLOG '
6lONXRMBAAAAMgAAAKsCAAAAAG4AAAAAAAEABHRlc3QABHN1ZXIAAgMPAgoAAxA/T3g=
6lONXR4BAAAALQAAANgCAAAAAG4AAAAAAAEAAgAC//wBAAAABGJlYXLuTzSs
'/*!*/;
# at 728
#190927 8:12:26 server id 1 end_log_pos 759 CRC32 0xff379272 Xid = 20
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
我們找到219
我們把219單獨提取出來分析
# at 219
#190927 8:07:23 server id 1 end_log_pos 313 CRC32 0xa2c769a7 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1569542843/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database test
/*!*/;
首先像這樣單獨的一節我們稱之爲一個 事件,每個事件由兩部分組成,時間頭 和 事件體
事件頭中主要記錄了一些此次事件操作的起始id、時間戳、server id、終止id(end_log_pos 313)等信息。
事件體中記錄一些該事件操作的其它信息。
Binlog日誌的操作
現在我們重啓mysql服務,然後再查看
發現重啓服務後binlog日誌數據文件多了一個【每次重啓mysql服務後,服務器會調用flash logs來創建一個新的binlog日誌】。想象一個場景,第二天重啓服務後,當天的操作日誌信息都在.000002這個文件中,當突然發現昨天有個操作是錯誤的,這是隻需在.000001文件中進行造作即可,方便管理操作。
1、flash logs 刷新日誌文件,產生一個新的日誌文件
2、show binlog events in 'fileName';查看指定日誌文件信息
3、show master status查看當前操作記錄在那個日誌文件裏
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
可以看出當前操作記錄在mysql-bin.000002文件中。
4、show master logs; 查看一共記錄了多少個日誌
法一:
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 782 |
| mysql-bin.000002 | 154 |
+------------------+-----------+
2 rows in set (0.00 sec)
法二:直接查看mysql-bin.index[索引文件]文件內容
[root@master mysql]# cat mysql-bin.index
/var/lib/mysql/mysql-bin.000001
/var/lib/mysql/mysql-bin.000002
5、reset master 清空所有binlog數據日誌文件(不建議操作)
binlog數據恢復
首先我們忘suer表裏插入幾條數據
mysql> select * from suer;
+------+--------+
| id | name |
+------+--------+
| 1 | bear |
| 2 | flower |
| 3 | key |
| 4 | linux |
+------+--------+
然後刪除id>=2的數據
mysql> delete from suer where id >=2;
Query OK, 3 rows affected (0.41 sec)
mysql> select * from suer;
+------+------+
| id | name |
+------+------+
| 1 | bear |
+------+------+
1 row in set (0.00 sec)
mysql>
恢復數據
[root@master mysql]# mysqlbinlog mysql-bin.000002 | mysql -uroot -p
登錄mysql
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from suer;
+------+--------+
| id | name |
+------+--------+
| 1 | bear |
| 2 | flower |
| 3 | key |
| 4 | linux |
+------+--------+
4 rows in set (0.00 sec)
mysql>
可以看到,剛剛刪除的數據已經恢復。
當想恢復指數據時:需要查看binlog日誌中想要恢復的數據的起始位置和終止位置,比如219-421。這時加入參數
mysqlbinlog mysql-bin.000002 --start-position 219 --stop-position 421 | mysql -uroot -p
查看binlog幫助文檔
[root@master mysql]# mysqlbinlog