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

猜你喜欢

转载自blog.csdn.net/weixin_44792728/article/details/90648495
今日推荐