通过binlog日志恢复表记录

使用binlog日志

1 使用binlog日志
1.1 问题

利用binlog恢复库表,要求如下:

启用binlog日志
创建db1库tb1表,插入3条记录
删除tb1表中刚插入的3条记录
使用mysqlbinlog恢复删除的3条记录

1.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:启用binlog日志

1)调整/etc/my.cnf配置,并重启服务

[[email protected] ~]# vim  /etc/my.cnf
[mysqld]
.. ..
log-bin-index=mysql-bin                              //启用二进制日志,并指定前缀
server_id=1
binlog_format=STATEMENT                               //在Mysql5.7中,binlog日志格式默认为ROW,但它不记录sql语句上下文相关信息。需要将binlog日志格式修改为STATEMENT
.. ..
[[email protected] ~]# systemctl  restart mysqld.service

2)确认binlog日志文件

新启用binlog后,每次启动MySQl服务都会新生成一份日志文件:

[[email protected] ~]# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001  /var/lib/mysql/mysql-bin.index

其中mysql-bin.index文件记录了当前保持的二进制文件列表:

[[email protected] ~]# cat /var/lib/mysql/mysql-bin.index
./mysql-bin.000001

重启MySQL服务程序,或者执行SQL操作“FLUSH LOGS;”,会生成一份新的日志:

[[email protected] ~]# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001  /var/lib/mysql/mysql-bin.index
/var/lib/mysql/mysql-bin.000002
[[email protected] ~]# 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日志内容

[[email protected] ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000002
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @[email protected]@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 [email protected]_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命令执行导入重做:

[[email protected] ~]# 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)

原文地址:http://blog.51cto.com/13735155/2134632

时间: 2024-10-04 11:21:38

通过binlog日志恢复表记录的相关文章

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一.初步了解binlogMySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. DDL-

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco

mysqldump备份结合binlog日志恢复

http://hongge.blog.51cto.com/ MySQL备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间. 1.binlog介绍 mysql的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看. Binlo

datastage 分析日志获取表记录条数

DataStage通过分析日志获取Job插入目标表的记录数 这只是一种不太好的方法,也许还有更好.更简便的方法.这种方法要求每次运行Job之前删除已有的日志信息,否则无法统计出正确的记录数.当然,在Job跑完之后,可以在shell备份本次Job运行的日志到服务器磁盘. 1       日志清理设置 登录Datastage Administrator,选择对应项目,项目属性->记录,勾选"自动清除作业日志",设置为自动清理上次及以前的日志. Figure 1 Administrat

mysql数据库通过bin-log日志恢复数据

binlog日志用于记录所有更新数据,当我们的数据库出现故障时,我们可以利用binlog日志来挽回. 如果mysql数据库出现问题需要重新创建binlog二进制文件. # 关闭当前的binlog日志并创建一个新日志文件,编号加1. flush logs # 查看日志,查出需要恢复的时间点 mysqlbinlog --no-defaults fangx-bin.000001 |more #恢复具体时间导成SQL语句 mysqlbinlog fangx-bin.000001 --database=f

使用全备+binlog日志恢复数据库

1.binlog日志类型 Statement 只记录执行的sql语句,磁盘占用少,但是恢复的时候容易出问题.InodeDB不能使用Statement . Row 记录修改后的具体数据,磁盘占用较多 Mixed 上面两种混合,mysqlsql根据具体情形,选择较好的方案 查看当前的类型: show variables like 'binlog_format' /etc/my.cnf 里面的binlog_format参数 2. 恢复方式 全备+恢复部分binlog日志 3.恢复方法 1. 全备 my

MySQL日志恢复误删记录

1.查询日志是否开启 show variables like"log_"; 2.查询是用的哪个日志文件 show master status; 3.定位是在什么时间误删的 /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/mysql-bin.000075 也就是说,610是drop了数据表,那么恢复至能到505即可 4.恢复 /usr/local/mysql/bin/mysqlbinlog  --stop-position=&q

使用binlog日志, XtraBackup备份工具 ,MySQL AB复制

使用binlog日志 1.1 问题 利用binlog恢复库表,要求如下: 启用binlog日志 创建db1库tb1表,插入3条记录 删除tb1表中刚插入的3条记录 使用mysqlbinlog恢复删除的3条记录 1.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:启用binlog日志 1)调整/etc/my.cnf配置,并重启服务 [[email protected] ~]# vim /etc/my.cnf [mysqld] .. .. log-bin-index=mysql-bin     

在mysql 使用binlog日志

一. 利用binlog恢复库表策略:1.启用binlog日志2.创建db1库tb1表,插入3条记录3.删除tb1表中刚插入的3条记录4.使用mysqlbinlog恢复删除的3条记录 步骤一:启用binlog日志1)调整/etc/my.cnf配置,并重启服务[mysqld]......log_bin=logdirserver_id=50binlog_format=mixed...... [[email protected] ~]# systemctl restart mysqld 2)确认binl