MySQL主從複製----Binlog日誌(常用操作、數據恢復)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章