使用binlog日誌
1 使用binlog日誌
1.1 問題mysql
利用binlog恢復庫表,要求以下:sql
啓用binlog日誌 建立db1庫tb1表,插入3條記錄 刪除tb1表中剛插入的3條記錄 使用mysqlbinlog恢復刪除的3條記錄
1.2 步驟數據庫
實現此案例須要按照以下步驟進行。vim
步驟一:啓用binlog日誌session
1)調整/etc/my.cnf配置,並重啓服務ide
[root@dbsvr1 ~]# vim /etc/my.cnf [mysqld] .. .. log-bin-index=mysql-bin //啓用二進制日誌,並指定前綴 server_id=1 binlog_format=STATEMENT //在Mysql5.7中,binlog日誌格式默認爲ROW,但它不記錄sql語句上下文相關信息。須要將binlog日誌格式修改成STATEMENT .. .. [root@dbsvr1 ~]# systemctl restart mysqld.service
2)確認binlog日誌文件工具
新啓用binlog後,每次啓動MySQl服務都會新生成一份日誌文件:this
[root@dbsvr1 ~]# ls /var/lib/mysql/mysql-bin.* /var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index
其中mysql-bin.index文件記錄了當前保持的二進制文件列表:rest
[root@dbsvr1 ~]# cat /var/lib/mysql/mysql-bin.index ./mysql-bin.000001
重啓MySQL服務程序,或者執行SQL操做「FLUSH LOGS;」,會生成一份新的日誌:日誌
[root@dbsvr1 ~]# ls /var/lib/mysql/mysql-bin.* /var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index /var/lib/mysql/mysql-bin.000002 [root@dbsvr1 ~]# cat /var/lib/mysql/mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002
步驟二:利用binlog日誌重作數據庫操做
1)執行數據庫表添加操做
建立db1·庫tb1表,表結構自定義:
mysql> CREATE DATABASE db1; Query OK, 1 row affected (0.05 sec) mysql> USE db1; Database changed mysql> CREATE TABLE tb1( -> id int(4) NOT NULL,name varchar(24) -> ); Query OK, 0 rows affected (0.28 sec)
插入3條表記錄:
mysql> INSERT INTO tb1 VALUES -> (1,'Jack'), -> (2,'Kenthy'), -> (3,'Bob'); Query OK, 3 rows affected (0.12 sec) Records: 3 Duplicates: 0 Warnings: 0
確認插入的表記錄數據:
mysql> SELECT * FROM tb1; +----+--------+ | id | name | +----+--------+ | 1 | Jack | | 2 | Kenthy | | 3 | Bob | +----+--------+ 3 rows in set (0.00 sec)
2)刪除前一步添加的3條表記錄
執行刪除全部表記錄操做:
mysql> DELETE FROM tb1; Query OK, 3 rows affected (0.09 sec)
確認刪除結果:
mysql> SELECT * FROM tb1; Empty set (0.00 sec)
步驟三:經過binlog日誌恢復表記錄
binlog會記錄全部的數據庫、表更改操做,因此可在必要的時候從新執行之前作過的一部分數據操做,但對於啓用binlog以前已經存在的庫、表數據將不適用。
根據上述「恢復被刪除的3條表記錄」的需求,應經過mysqlbinlog工具查看相關日誌文件,找到刪除這些表記錄的時間點,只要恢復此前的SQL操做(主要是插入那3條記錄的操做)便可。
1)查看mysql-bin.000002日誌內容
[root@dbsvr1 ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000002 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #170412 12:05:32 server id 1 end_log_pos 123 CRC32 0x6d8c069c Start: binlog v 4, server v 5.7.17-log created 170412 12:05:32 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' jKftWA8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAACMp+1YEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA AZwGjG0= '/*!*/; # at 123 #170412 12:05:32 server id 1 end_log_pos 154 CRC32 0x17f50164 Previous-GTIDs # [empty] # at 154 #170412 12:05:59 server id 1 end_log_pos 219 CRC32 0x4ba5a976 Anonymous_GTID last_committed=0 sequence_number=1 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 219 #170412 12:05:59 server id 1 end_log_pos 310 CRC32 0x5b66ae13 Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1491969959/*!*/; 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 db1 /*!*/; # at 310 #170412 12:06:23 server id 1 end_log_pos 375 CRC32 0x2967cc28 Anonymous_GTID last_committed=1 sequence_number=2 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 375 #170412 12:06:23 server id 1 end_log_pos 502 CRC32 0x5de09aae Query thread_id=3 exec_time=0 error_code=0 use `db1`/*!*/; SET TIMESTAMP=1491969983/*!*/; CREATE TABLE tb1( id int(4) NOT NULL,name varchar(24) ) /*!*/; # at 502 #170412 12:06:55 server id 1 end_log_pos 567 CRC32 0x0b8cd418 Anonymous_GTID last_committed=2 sequence_number=3 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 567 #170412 12:06:55 server id 1 end_log_pos 644 CRC32 0x7e8f2fa0 Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1491970015/*!*/; BEGIN /*!*/; # at 644 #170412 12:06:55 server id 1 end_log_pos 772 CRC32 0x4e3f728e Query thread_id=3 exec_time=0 error_code=0 //插入表記錄的起始時間點 SET TIMESTAMP=1491970015/*!*/; INSERT INTO tb1 VALUES(1,'Jack'),(2,'Kenthy'), (3,'Bob') /*!*/; # at 772 #170412 12:06:55 server id 1 end_log_pos 803 CRC32 0x6138b21f Xid = 10 //確認事務的時間點 COMMIT/*!*/; # at 803 #170412 12:07:24 server id 1 end_log_pos 868 CRC32 0xbef3f472 Anonymous_GTID last_committed=3 sequence_number=4 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 868 #170412 12:07:24 server id 1 end_log_pos 945 CRC32 0x5684e92c Query thread_id=3 exec_time=0 error_code=0 SET TIMESTAMP=1491970044/*!*/; BEGIN /*!*/; # at 945 #170412 12:07:24 server id 1 end_log_pos 1032 CRC32 0x4c1c75fc Query thread_id=3 exec_time=0 error_code=0 //刪除表記錄的時間點 SET TIMESTAMP=1491970044/*!*/; DELETE FROM tb1 /*!*/; # at 1032 #170412 12:07:24 server id 1 end_log_pos 1063 CRC32 0xccf549b2 Xid = 12 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*/;
2) 執行指定Pos節點範圍內的sql命令恢復數據
根據上述日誌分析,只要恢復從2014.01.12 20:12:14到2014.01.12 20:13:50之間的操做便可。可經過mysqlbinlog指定時間範圍輸出,結合管道交給msyql命令執行導入重作:
[root@dbsvr1 ~]# mysqlbinlog \ --start-datetime="2017-04-12 12:06:55" \ --stop-datetime="2017-04-12 12:07:23" \ /var/lib/mysql/mysql-bin.000002 | mysql -u root -p Enter password: //驗證口令
3)確認恢復結果
mysql> SELECT * FROM db1.tb1; +----+--------+ | id | name | +----+--------+ | 1 | Jack | | 2 | Kenthy | | 3 | Bob | +----+--------+ 3 rows in set (0.00 sec)