使用binlog日誌

1.使用binlog日誌
問題
利用binlog恢復庫表,要求如下:
1)啓用binlog日誌
2)創建db1庫tb1表,插入3條記錄
3)刪除tb1表中剛插入的3條記錄
4)使用mysqlbinlog恢復刪除的3條記錄
步驟
實現此案例需要按照如下步驟進行。
步驟一:啓用binlog日誌
1)調整/etc/my.cnf配置,並重啓服務
[root@dbsvr1 ~]# vim /etc/my.cnf
[mysqld]
… …
log-bin=mysql-bin //啓用二進制日誌,並指定前綴
… …
[root@dbsvr1 ~]# service mysql restart
Shutting down MySQL… [確定]
Starting MySQL… [確定]
2)確認binlog日誌文件
新啓用binlog後,每次啓動MySQl服務都會新生成一份日誌文件:
[root@dbsvr1 ~]# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001 /var/lib/mysql/mysql-bin.index
其中mysql-bin.index文件記錄了當前保持的二進制文件列表:
[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.19 sec)
插入3條表記錄:
mysql> INSERT INTO tb1 VALUES
-> (1,‘Jack’),
-> (2,‘Kenthy’),
-> (3,‘Bob’);
Query OK, 3 rows affected (0.13 sec)
Records: 3 Duplicates: 0 Warnings: 0
確認插入的表記錄數據:
mysql> SELECT * FROM tb1;
±—±-------+
| id | name |
±—±-------+
| 1 | Jack |
| 2 | Kenthy |
| 3 | Bob |
±—±-------+
3 rows in set (0.04 sec)
2)刪除前一步添加的3條表記錄
執行刪除所有表記錄操作:
mysql> DELETE FROM tb1;
Query OK, 3 rows affected (0.00 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/;
/!40019 SET @@session.max_insert_delayed_threads=0/;
/!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0/;
DELIMITER /!/;

at 4

#140112 20:05:37 server id 1 end_log_pos 120 CRC32 0xb6b5bd8f Start: binlog v 4, server v 5.6.15-log created 140112 20:05:37 at startup

Warning: this binlog is either in use or was not closed properly.

ROLLBACK/!/;
BINLOG ’
EYXSUg8BAAAAdAAAAHgAAAABAAQANS42LjE1LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAARhdJSEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAY+9
tbY=
'/!/;

at 120

#140112 20:09:58 server id 1 end_log_pos 211 CRC32 0x86198382 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1389528598/!/;
SET @@session.pseudo_thread_id=1/!/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/!/;
SET @@session.sql_mode=1075838976/!/;
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=33/!/;
SET @@session.lc_time_names=0/!/;
SET @@session.collation_database=DEFAULT/!/;
CREATE DATABASE db1
/!/;

at 211

#140112 20:10:44 server id 1 end_log_pos 338 CRC32 0x3f49ba47 Query thread_id=1 exec_time=0 error_code=0
use db1/!/;
SET TIMESTAMP=1389528644/!/;
CREATE TABLE tb1(
id int(4) NOT NULL,name varchar(24)
)
/!/;

at 338

#140112 20:12:14 server id 1 end_log_pos 415 CRC32 0x755ac4ea Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1389528734/!/;
BEGIN
/!/;

at 415

#140112 20:12:14 server id 1 end_log_pos 545 CRC32 0x98781640 Query thread_id=1 exec_time=0 error_code=0 //插入表記錄的起始時間點
SET TIMESTAMP=1389528734/!/;
INSERT INTO tb1 VALUES
(1,‘Jack’),
(2,‘Kenthy’),
(3,‘Bob’)
/!/;

at 545

#140112 20:12:14 server id 1 end_log_pos 576 CRC32 0x672e96e5 Xid = 9
//確認事務的時間點
COMMIT/!/;

at 576

#140112 20:13:51 server id 1 end_log_pos 653 CRC32 0xbf4c6024 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1389528831/!/;
BEGIN
/!/;

at 653

#140112 20:13:51 server id 1 end_log_pos 740 CRC32 0x253837bb Query thread_id=1 exec_time=0 error_code=0 //刪除表記錄的時間點
SET TIMESTAMP=1389528831/!/;
DELETE FROM tb1
/!/;

at 740

#140112 20:13:51 server id 1 end_log_pos 771 CRC32 0xbf4675d0 Xid = 12
COMMIT/!/;
DELIMITER ;

End of log file

ROLLBACK /* added by mysqlbinlog /;
/
!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=“2014-01-12 20:12:14” \
–stop-datetime=“2014-01-12 20:12:50”
/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)

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