使用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)

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