`

利用mysqlbinlog恢复数据

阅读更多

PS:原创文章,如需转载,请注明出处,谢谢!     

本文地址:http://flyer0126.iteye.com/blog/2210993

 

      前几天,由于同事误操作delete掉线上数据一个表的数据,由于操作库为数据主库,开启了binlog,于是开始了利用mysqlbinlog恢复表数据的折腾过程。在此仅记录一下。

      1. 确认恢复库的binlog已打开。

[mysqld]
log-bin=mysql-bin

       2. 将删除操作对应的log文件转换为sql文件

mysqlbinlog  /var/lib/mysql/mysql-bin.00014  > /var/lib/mysql/14.txt

       3. 查看并记录执行删除操作的语句起始与结束位置

#BEGIN
/*!*/;
# at 194663082
#150507 19:47:03 server id 125  end_log_pos 194663179   Query   thread_id=807717        exec_time=0     error_code=0
#SET TIMESTAMP=1430999223/*!*/;
#delete from test_table;
/*!*/;
# at 194663179
#150507 19:47:03 server id 125  end_log_pos 194663206   Xid = 9667064
#COMMIT/*!*/;

     记录起始位置:194663179, 结束位置:194663206。

 

      4. 如果有之前的备份表数据,可以根据备份日期与执行删除日期间的数据binlog来匹配查询所有关于此表的写操作(insert && update)。

#根据binlog查找对应表的数据进行恢复
mysqlbinlog  mysql-bin.0001  --result-file=binlog.1 // 转换binlog二进制文件为sql文件
grep "insert into test_table" binlog.1  >binlog-back1.sql  // 查找insert语句整理至binlog-back1.sql
grep "update test_table" binlog.1  >binlog-back11.sql  // 查找update语句整理至binlog-back11.sql 

      依次对binlog文件执行上述操作,查找表相关的写操作,然后在mysql客户端上顺序执行即可。

       5. 还可以使用mysqlbinlog指定位置和制定时间断进行数据恢复。

 

这里有几个比较关键的参数:
--database=db_name, -d db_name
该参数使mysqlbinlog仅从本地二进制日志中输出指定的db_name被use命令选作默认数据库时产生的日志事件。行为类似于mysqld的--binlog-do-db命令。若该参数指定了多次那么只有最后一次指定的内容有效。参数具体的影响依赖于二进制日志格式,只有在使用行模式的日志格式时该参数才能保证一致性。基于语句或混合模式的二进制日志格式中因为可能存在跨库的更新导致--database参数表现不同的行为,从而不能保证数据一致性。
mysqlbinlog  VMS00781-bin.000001  -d testDB | mysql -uusername -p

--force-read, -f
使用了该参数后mysqlbinlog工具在读取到不能识别的日志事件时会打印出warning,忽略事件并继续执行,没有此参数的情况下mysqlbinlog会停止。
mysqlbinlog  VMS00781-bin.000001  -d testDB -f | mysql -uusername -p

--no-defaults
阻止mysqlbinlog工具从任何配置文件读取参数, .mylogin.cnf除外(以便于安全的保存密码)
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults| mysql -uusername -p

--start-datetime=datetime
--stop-datetime=datetime
上边一组参数用于指定恢复开始时间点和结束时间点,可以一起或单独给出,也可与--start-position,--stop-position混用
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-datetime=datetime --stop-position=NNNNNN | mysql -uusername -p

--start-position=N, -j N
--stop-position=N
上边一组参数用于指定恢复开始位置和结束位置,可以一起或单独给出也可与--start-datetime,--stop-datetime混用
mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

需要还原的二进制日志文件通常不止一个,那么要是有多个二进制日志文件需要还原呢,该注意些什么?
首先,可以选择上述直接重定向到mysql客户端的方法或先导入到.sql文件然后执行.sql文件的方式逐个应用二进制日志文件。但是这里存在一个隐患,及,如果二进制日志中记录有使用临时表的情况,那么当上一个日志应用完,在新连接中应用下一个二进制日志时临时表就会丢失,引起错误。所以,安全的方式是多个二进制文件同时执行。
如:
mysqlbinlog  VMS00781-bin.000001  VMS00781-bin.000002 VMS00781-bin.000003 --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

或mysqlbinlog  VMS00781-bin.00000[1-3] --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

当多个二进制日志文件同时执行时,--start-position和--stop-position分别只应用于第一个列出的二进制日志文件和最后一个列出的二进制日志文件

当然也可以先将多个二进制日志文件的输出导到同一个.sql文件最后在执行该.sql文件(适用于日志量不多的情况) 

 

分享到:
评论

相关推荐

    MySQL利用binlog恢复库表

    使用`mysqlbinlog`导出到某个时间点之前的SQL操作,然后执行这些操作来恢复数据。例如,假设我们想恢复到删除操作之前的状态,可以这样操作: ```bash mysqlbinlog --stop-datetime='2023-08-15 12:00:00' /var/...

    MySQL执行delete误删除数据恢复

    本文将重点介绍如何利用MySQL的二进制日志(binlog)以及my2sql工具来恢复数据。 首先,一旦发现误删除,首要任务是立即停止对数据库的任何写入操作,防止新数据覆盖已被删除的数据。这为恢复提供了可能的空间。如果...

    windows mysqlbinlog Ver 3.4 for Win64 at x86_64.zip

    总的来说,这个压缩包提供了一种在Windows环境中利用MySQLbinlog工具处理MySQL二进制日志的方法,这对于数据库管理、数据安全和灾难恢复具有重要意义。正确理解和使用MySQLbinlog可以大大提高数据库运维的效率和数据...

    mysql根据日志恢复数据详细步骤

    ### MySQL根据日志恢复数据详细步骤 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,因其高效稳定、易于维护等特性而深受开发者喜爱。然而,在实际使用过程中,难免会遇到误删数据的情况,这时就...

    mysqlbinlog.exe文件,win 7mysql 5.6下可用

    例如,如果你的数据库发生故障,你可以利用二进制日志来恢复到故障发生前的状态。同样,如果你想设置一个从服务器来实时同步主服务器的数据,`mysqlbinlog`可以读取主服务器的二进制日志,并将这些变更应用到从...

    mysql恢复数据常用方法

    4. **过滤和执行SQL语句**:从转换后的SQL语句中删除不需要的部分,然后执行这些SQL语句以恢复数据。 #### 四、binlog的开启与配置 1. **临时开启**:可以使用以下命令临时开启binlog功能,但重启后会失效。 ```...

    MySQL 数据库误删除后的数据恢复操作说明(详细)

    特别是在面对如MySQL这样的关系型数据库管理系统时,一旦发生误删除的情况,如何有效地恢复数据成为了技术人员必须掌握的一项技能。本文将详细介绍在遇到MySQL数据库误删除的情况下,如何通过备份文件和binlog文件...

    实验4 数据库备份与恢复实验 (2).docx

    数据库备份是指将数据库中的数据复制到其他存储介质中,以便在出现数据丢失或损坏时可以恢复数据。数据库备份可以分为物理备份和逻辑备份两种。 * 物理备份是指将数据库文件复制到其他存储介质中。 * 逻辑备份是指...

    mysqlbinlog DOC

    **MySQL binlog DOC** 在MySQL数据库管理中,二进制日志(Binary Log,简称binlog)是一项至关重要的功能,...通过阅读提供的文档《利用mysqlbinlog工具恢复MySQL数据库.docx》,您将获得更详细的步骤指导和实践案例。

    实验4 数据库备份与恢复实验.pdf

    数据备份是指将数据库中的数据复制一份或多份到其他存储设备上,以便在数据丢失、损坏或者错误操作等情况下能够从备份中恢复数据。数据恢复则是指将备份的数据重新导入到数据库中,以修复数据丢失或损坏等问题。 ##...

    mysql从删库到恢复

    本文将详细介绍如何利用MySQLbinlog和mysqldump工具来恢复已删除的数据库。 首先,我们需要理解MySQLbinlog的作用。MySQLbinlog是MySQL服务器的日志系统,它记录了所有改变数据库状态的事务,包括创建数据库、修改...

    MySQL日志和数据恢复

    本文将深入探讨MySQL中的日志类型以及如何利用这些日志进行数据恢复。 1. 错误日志 (Error Log) MySQL的错误日志记录了服务器启动、运行和关闭过程中的各种问题和警告信息。当遇到异常情况时,首先查看错误日志能...

    mysqlbinlog.zip

    - **数据恢复**:当你不小心执行了错误的SQL语句导致数据丢失时,可以通过`mysqlbinlog`提取并重放binlog中的事务来恢复数据。 - **主从复制**:在MySQL的主从复制架构中,主服务器的binlog会被发送到从服务器,从...

    详解MySQL误操作后怎样进行数据恢复

    假设发生了误操作,例如误删除了部分数据,我们可以利用之前备份的全量数据和binlog进行恢复。首先,停止MySQL服务,然后用备份文件恢复数据库到全量备份时的状态。命令可能如下: ```bash mysql -uroot -p $(date ...

    Binlog数据恢复,生成反向SQL语句.zip

    Binlog是用于备份和复制的基础,也是在灾难性故障后恢复数据的关键。 当面临数据丢失情况,可以通过以下步骤利用Binlog进行数据恢复: 1. **获取最近的备份**:首先,需要找到最近的完整数据库备份。这个备份通常...

    Binlog数据恢复,生成反向SQL语句

    - **筛选和应用SQL语句**:根据需要恢复的数据范围,筛选出相关的SQL语句,然后在新的环境中执行这些语句以恢复数据。 5. **生成反向SQL语句** 在某些情况下,我们可能需要生成反向SQL语句,比如撤销误操作。这...

    MySQL数据库中误操作删除数据的恢复问题.pdf

    恢复误删除数据的基本思路是利用binlog中的反向操作SQL语句。当执行删除操作时,MySQL会在binlog中记录下这个操作,包括删除的条件。例如,如果执行了`DELETE FROM table WHERE pk_id = 1`,对应的binlog条目会包含...

    探析基于SQL数据库中日志文件的数据恢复对策.pdf

    在MySQL中,可以使用mysqlbinlog工具解析二进制日志并应用到数据库,实现数据恢复。 除了标准的恢复模式,还有一些特殊情况需要考虑。例如,当数据库处于“简单恢复模式”时,只保留最近的事务日志,不支持时间点...

Global site tag (gtag.js) - Google Analytics