使用mysqlbinlog恢复指定表

一、登录数据库刷新binlog
1.1)查看当前的binlog
MySQL> show master status;
+---------------------+----------+--------------+------------------+-------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| test-150-bin.000003 |  2895377 |              |                  |                   |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

1.2)刷新binlog
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

1.3)确认刷新binlog成功
mysql> show master status;
+---------------------+----------+--------------+------------------+-------------------+
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+------------------+-------------------+
| test-150-bin.000004 |      120 |              |                  |                   |
+---------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
用show master status 命令查看当前的binlog已经由test-150-bin.000003变为test-150-bin.000004,
证明binlog已经刷新成功。

二、查询二进制日志位置
mysql> show variables like‘log_bin%‘;
+---------------------------------+------------------------------------------+
| Variable_name                   | Value                                    |
+---------------------------------+------------------------------------------+
| log_bin                             | ON                                       |
| log_bin_basename             | /db/mysql5.6/data/test-150-bin       |
| log_bin_index                    | /db/mysql5.6/data/test-150-bin.index |
| log_bin_trust_function_creators  | ON                                       |
| log_bin_use_v1_row_events       | OFF                                      |
+---------------------------------+------------------------------------------+

三、从二进制日志中获取表被删除的时间
$ mysqlbinlog test-150-bin.000003 | grep -i DROP  -A3 -B4
COMMIT/*!*/;
# at 122869
#140126 17:03:35 server id 150  end_log_pos 122989 CRC32 0x8707c4c4     Query   thread_id=12519 exec_time=0     error_code=0
SET TIMESTAMP=1390727015/*!*/;
DROP TABLE `test` /* generated by server */
/*!*/;
# at 122989
#140126 17:04:06 server id 150  end_log_pos 123039 CRC32 0x43476aad     Rotate to test-150-bin.000004  pos: 4

drop语句的前两行表名drop语句的执行时间是在 17:03:35
mysql> SELECT from_unixtime(‘1390727015‘);
+-----------------------------+
| from_unixtime(‘1390727015‘)  |
+-----------------------------+
| 2014-01-26 17:03:35.000000 |
+-----------------------------+
1 row in set

四、从binlog中获取指定数据库的改变数据
用mysqlbinlog 恢复ivr数据库在二进制日志test-150-bin.000003中的数据
这里假设从上一次mysql备份后,只有一个binlog产生,即登录数据库时查询到binlog test-150-bin.000003
mysqlbinlog -d ivr --stop-datetime=‘2014-01-26 17:03:35‘ test-150-bin.000003 >recover_ivr.sql

如果从上次备份刷新binlog,到发现表被删掉的过程中产生了多个binlog。则要按照binlog产生的顺序进行恢复,那
么恢复的次序应该是按照binglog的产生的序号,从小到大依次恢复。
假如从上次备份,到发现表被删除,共有两个binlog文件,分别是test-150-bin.000002,test-150-bin.000003 ,
则按照binlog序号从小到大的排列,恢复的顺序应该是:

mysqlbinlog -d ivr  test-150-bin.000002  > recover_ivr.sql

mysqlbinlog -d ivr --stop-datetime=‘2014-01-26 17:03:35‘ test-150-bin.000003  >> recover_ivr.sql

由于恢复的文件recover_ivr.sql中包含了整个ivr数据库的所有表,我们只要恢复指定的表testtuo,还要对恢复出来的sql进行过滤。

[[email protected] data]$ more recover_ivr.sql | grep  -i -E ‘insert|update|delete‘   -A2 -B2 | grep testtuo
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
--
# at 122721
#140126 17:03:28 server id 150  end_log_pos 122721 CRC32 0xe0f851bb     Intvar
SET INSERT_ID=4/*!*/;
#140126 17:03:28 server id 150  end_log_pos 122838 CRC32 0x9efcc7b2     Query   thread_id=12578 exec_time=0     error_code=0
use `ivr`/*!*/;
SET TIMESTAMP=1390727008/*!*/;
INSERT INTO `testtuo` (`name`) VALUES (‘d‘)
/*!*/;
# at 122838

将过滤后的结果保存为sql脚本,恢复到数据库即可。

恢复之前为了避免产生没有用的二进制日志,可以关闭二进制日志的记录
SET SESSION sql_log_bin=0;

恢复完成,启用记录二进制日志
SET SESSION sql_log_bin=1;

时间: 2024-10-09 22:32:10

使用mysqlbinlog恢复指定表的相关文章

CentOS下利用mysqlbinlog恢复MySQL数据库

如果不小心对数据库进行误操作,而又没有及时备份怎么办?这恐怕是广大的coder经常遇到的一类问题.我今天就因为不小心删除了某个数据库,但最后的备份是1个礼拜前的,唯一能解决的办法就是通过mysqlbinlog来恢复了.解决方案如下: 如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始(例如,从你最后一次备份)直到现在或另一个指定的时间点的数据.关于启用二进制日志的信息,参见5.11.3节,"二进制日志".对于mysqlbinlog的详细信

mysqlbackup 恢复特定表

mysqlbackup使用TTS恢复指定表. ************************************************************* 4.恢复特定表 ************************************************************* --4.1新建测试环境 CREATE DATABASE `wind` DEFAULT CHARACTER SET gbk ; use wind; create table t1 ( sid

mysqlbinlog 恢复数据的四种方法

mysqlbinlog 命令 作用:mysqlbinlog 是用来解析mysql的binlog日志的. [[email protected] data]# file mysql-bin.000001 mysql-bin.000001: MySQL replication log [[email protected] data]# mysqlbinlog日志无法直接用cat 查看,需要用mysqlbinlog命令转换为普通文件才能查看 也只有用mysqlbinlog命令把binlog日志转化为普通

通过binlog日志文件恢复单表【小技巧】

场景:某天执行了delete from t1操作忘加where条件,我们需要通过昨天的全量备份+误操作之前的binlog增量备份,加以恢复. 在通过mysqlbinlog解析时,需要用sed命令去过滤出t1表的insert.delete.update操作,如果binlog文件很多,并且默认是1G的大小,用这种方法费时费力,很麻烦. 这里,介绍一个小技巧,通过授权账户去恢复. 我这里创建一个用户hcy,并只授予t1表的select.insert.delete.update权限,这样该用户针对其他表

使用mysqlbinlog恢复数据

一.开启bin-log 1.安装mysql [[email protected] ~]# yum -y install mysql mysql-devel mysql-server 2.开启bin-log功能 [[email protected] ~]# vi /etc/my.cnf       1 [mysqld]       2 datadir=/var/lib/mysql       3 socket=/var/lib/mysql/mysql.sock       4 user=mysql

MySQL DDL操作--------指定表数据文件存放目录最佳实战

1. 背景 * 在MYSQL中建立一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也就是任何存储引擎的数据表都必须有.frm文件,命名方式为数据表名.frm,如user.frm. .frm文件可以用来在数据库崩溃时恢复表结构. * MySQL文件包括MySQL所建数据库文件和MySQL所用引擎创建的数据库文件. * .frm 文件与操作系统和数据库引擎无关,都有这么

如何恢复SQLServer表级数据详解

 最近几天,公司的技术维护人员频繁让我恢复数据库,因为他们总是少了where条件,导致update.delete出现了无法恢复的后果,加上那些库都是几十G.恢复起来少说也要十几分钟.为此,找了一些资料和工作总结,给出一下几个方法,用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好.上章分享了如何使用SQLCMD在SQLServer执行多个脚本详解需要的朋友可以看下. 在生产环境或者开发环境,往往都有某些非常重要的表.这些表存放了核心数据.当这些表出现数据损坏时,需要尽快还原.但是,正式环

sql查询指定表外键约束

//////////////////查询指定表外键约束select a.name as 约束名, object_name(b.parent_object_id) as 外键表, d.name as 外键列, object_name(b.referenced_object_id) as 主健表, c.name as 主键列 from sys.foreign_keys A inner join sys.foreign_key_columns B on A.object_id=b.constraint

获取指定表的创建脚本

--****************************************************************************-- 软件名称: May Flower Erp-- 版权所有: (C) 2005-2006 May Flower ERP 开发组-- 功能描述: 获取指定表的创建脚本,包括表和字段的属性.外键(注释掉的)----------------------------------------------------------------------