转自:http://www.taobaodba.com/html/1430_mysql%E7%9A%84%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D.html
数据库数据被误删除是经常看到的事情,数据的恢复也就自然成为了DBA很重要的一门基本功夫,比较笨拙的办法是拉出历史的备份到另外的一台机器恢复出来,但是这种方法如果数据量比较大的话,往往会耗费较长的时间,以前在使用oracle的时候,提供了很多数据恢复的办法,常用的办法就是采用闪回flashback,或者通过logmnr在分析日志完成数据的恢复,但是在mysql中,数据的恢复变成了很困难的一件事情。
上周一同事的数据库就由于开发人员的数据订正误操作,导致了一张表的所有数据被清空,由于该库的数据容量已经达到了几百G,从备份中恢复需要很长的时间,所以联系到我帮助恢复,由于数据库采用的是row模式,删除的操作在binlog中会一行一行的记录,所以恢复操作就是将binlog中的内容进行解析为对应的插入语句,恢复步骤如下:
1.用mysqlbing将binlog文件进行解析:
mysqlbinlog -vvv /home/mysql/data3006/mysql/mysql-bin.000004 >/tmp/master.log.20120925
2.由于被误删除的表有13个字段,在加上两行delete和where,所以取其中的15行:
grep “###” master.log.20120925 | grep “DELETE FROM master.agentgroup” -A 15 >/tmp/xx.log
root@db1.com # more /tmp/xx.log
### DELETE FROM master.del_table
### WHERE
### @1=15 /* INT meta=0 nullable=0 is_null=0 */
### @2=1 /* INT meta=0 nullable=0 is_null=0 */
### @3=2010-09-07 18:03:13 /* DATETIME meta=0 nullable=0 is_null=0 */
### @4=1 /* INT meta=0 nullable=0 is_null=0 */
### @5=2012-09-24 01:13:56 /* DATETIME meta=0 nullable=0 is_null=0 */
### @6=’yahoo_yst’ /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
### @7=5259 /* INT meta=0 nullable=1 is_null=0 */
### @8=22 /* INT meta=0 nullable=1 is_null=0 */
### @9=b’0′ /* BIT(1) meta=1 nullable=0 is_null=0 */
### @10=b’1′ /* BIT(1) meta=1 nullable=0 is_null=0 */
### @11=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */
### @12=b’0′ /* BIT(1) meta=1 nullable=1 is_null=0 */
### @13=18170 /* INT meta=0 nullable=1 is_null=0 */
3.用sed替换’###’:
root@db1.com # more /tmp/xx.log
DELETE FROM master.del_table
WHERE
@1=15 /* INT meta=0 nullable=0 is_null=0 */
@2=1 /* INT meta=0 nullable=0 is_null=0 */
@3=2010-09-07 18:03:13 /* DATETIME meta=0 nullable=0 is_null=0 */
@4=1 /* INT meta=0 nullable=0 is_null=0 */
@5=2012-09-24 01:13:56 /* DATETIME meta=0 nullable=0 is_null=0 */
@6=’yahoo_yst’ /* VARSTRING(384) meta=384 nullable=0 is_null=0 */
@7=5259 /* INT meta=0 nullable=1 is_null=0 */
@8=22 /* INT meta=0 nullable=1 is_null=0 */
@9=b’0′ /* BIT(1) meta=1 nullable=0 is_null=0 */
@10=b’1′ /* BIT(1) meta=1 nullable=0 is_null=0 */
@11=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */
@12=b’0′ /* BIT(1) meta=1 nullable=1 is_null=0 */
@13=18170 /* INT meta=0 nullable=1 is_null=0 */
4.替换’*/’为’,':
root@db1.com # sed -i ‘s/\*\//\*\/,/g’ /tmp/xx.log
root@db1.com # more /tmp/xx.log
DELETE FROM master.del_table
WHERE
@1=15 /* INT meta=0 nullable=0 is_null=0 */,
@2=1 /* INT meta=0 nullable=0 is_null=0 */,
@3=2010-09-07 18:03:13 /* DATETIME meta=0 nullable=0 is_null=0 */,
@4=1 /* INT meta=0 nullable=0 is_null=0 */,
@5=2012-09-24 01:13:56 /* DATETIME meta=0 nullable=0 is_null=0 */,
@6=’yahoo_yst’ /* VARSTRING(384) meta=384 nullable=0 is_null=0 */,
@7=5259 /* INT meta=0 nullable=1 is_null=0 */,
@8=22 /* INT meta=0 nullable=1 is_null=0 */,
@9=b’0′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@10=b’1′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@11=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */,
@12=b’0′ /* BIT(1) meta=1 nullable=1 is_null=0 */,
@13=18170 /* INT meta=0 nullable=1 is_null=0 */,
DELETE FROM master.del_table
5.替换日志中的最后一个’,'为’;':
a.delete前加’;':
sed -i ‘s/DELETE/;DELETE/g’ /tmp/xx.log
root@db1.com # more /tmp/xx.log
DELETE FROM master.del_table
WHERE
@1=15 /* INT meta=0 nullable=0 is_null=0 */,
@2=1 /* INT meta=0 nullable=0 is_null=0 */,
@3=2010-09-07 18:03:13 /* DATETIME meta=0 nullable=0 is_null=0 */,
@4=1 /* INT meta=0 nullable=0 is_null=0 */,
@5=2012-09-24 01:13:56 /* DATETIME meta=0 nullable=0 is_null=0 */,
@6=’yahoo_yst’ /* VARSTRING(384) meta=384 nullable=0 is_null=0 */,
@7=5259 /* INT meta=0 nullable=1 is_null=0 */,
@8=22 /* INT meta=0 nullable=1 is_null=0 */,
@9=b’0′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@10=b’1′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@11=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */,
@12=b’0′ /* BIT(1) meta=1 nullable=1 is_null=0 */,
@13=18170 /* INT meta=0 nullable=1 is_null=0 */,
;DELETE FROM master.del_table
b.delete 前的’,;’替换为’;':
vi /tmp/xx.log —–>:%s/,$\n^ ;/;/g
DELETE FROM master.del_table
WHERE
@1=29 /* INT meta=0 nullable=0 is_null=0 */,
@2=1 /* INT meta=0 nullable=0 is_null=0 */,
@3=2010-09-07 18:03:13 /* DATETIME meta=0 nullable=0 is_null=0 */,
@4=1 /* INT meta=0 nullable=0 is_null=0 */,
@5=2012-06-01 13:05:00 /* DATETIME meta=0 nullable=0 is_null=0 */,
@6=’alipay_front_jx’ /* VARSTRING(384) meta=384 nullable=0 is_null=0 */,
@7=5267 /* INT meta=0 nullable=1 is_null=0 */,
@8=58 /* INT meta=0 nullable=1 is_null=0 */,
@9=b’0′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@10=b’1′ /* BIT(1) meta=1 nullable=0 is_null=0 */,
@11=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */,
@12=b’0′ /* BIT(1) meta=1 nullable=1 is_null=0 */,
@13=NULL /* BIT(1) meta=0 nullable=1 is_null=1 */
;DELETE FROM master.del_table
@1,@2,@3….对应的是表的字段;
6.最后将delete from table xx where 改为insert into xx values(”,”,”,”…..)既可以;
通过上面的6个步骤就可以从binlog中恢复出删除的数据,看上去很繁琐,所以
parse_binlog 工具就产生了,这个工具是@俊达 所写,可以将row模式的binlog转换为对应的sql语句:
mysql> USE T1
Database changed
mysql> delete from t1 where id<12;
Query OK, 2 rows affected (0.00 sec)
mysqlbinlog -vvv /home/mysql/data3006/mysql/mysql-bin.000004 |/root/parse_binlog.pl >/tmp/parse.sql1
more /tmp/parse/sql1
–DML type: DELETE, num of cols: 2
replace into t1.t1 values ( 10 , ‘ni hao1′);
–DML type: DELETE, num of cols: 2
replace into t1.t1 values ( 11 , ‘ni hao1′);
这样DBA就可以方便的进行数据的恢复了;
最近
@plinux已经完成该mysql闪回
方案的
补丁,在row模式的binlog下,记录了每个ROW的完整信息,INSERT会包含每个字段的值,DELETE也会包含每个字段的值,UPDATE会在SET和WHERE部分包含所有的字段值。因此binlog就是个完整的逻辑redo,把它的操作逆过来,就是需要的“undo”;
@吴炳锡 这个好人已经把他编译好了放在开源社区上,可以在这里
下载:
mysql> show master logs;
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000004 | 2293035 |
+——————+———–+
mysql> use t1
Database changed
mysql> delete from t1 where id=15;
Query OK, 1 row affected (0.00 sec)
mysql> show master logs;
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000004 | 2293211 |
+——————+———–+
root@db.com # ./mysqlbinlog.txt -v –base64-output=decode-rows -B –start-position=2293035 /home/mysql/data3006/mysql/mysql-bin.000004 >/tmp/1.sql
root@db.com # more /tmp/1.sql
DELIMITER ;
#121004 19:59:35 server id 3703006010 end_log_pos 2293211 Xid = 13145226
COMMIT/*!*/;
#121004 19:59:35 server id 3703006010 end_log_pos 2293143 Table_map: `t1`.`t1` mapped to number 1584
#121004 19:59:35 server id 3703006010 end_log_pos 2293184 Delete_rows: table id 1584 flags: STMT_END_F
### INSERT INTO t1.t1
### SET
### @1=15
### @2=’ni xxx’
DELIMITER ;
不得不说开源的力量真大.
分享到:
相关推荐
MySQL数据恢复是一个重要的数据库管理任务,特别是在数据丢失或系统故障后,恢复数据是确保业务连续性和数据完整性不可或缺的环节。这篇博文将深入探讨MySQL数据恢复的相关知识点,包括常见的数据丢失场景、备份策略...
MySQL 数据恢复是数据库管理中的一项重要任务,尤其是在遭遇意外数据丢失、硬件故障或软件错误时。以下是三种常用的数据恢复方式的详细说明: 1. **通过表备份的方式**: 当数据表因各种原因如误删除、软件故障或...
MySQL数据恢复是一个重要的主题,尤其是在数据库管理中,数据的安全性和可恢复性是至关重要的。当面临数据丢失或数据库损坏的情况时,专业的MySQL数据恢复软件能够帮助我们找回宝贵的信息。本软件"sa_mysql_recovery...
### MySQL 数据恢复方法详解 #### 一、引言 在MySQL数据库管理中,数据安全至关重要。即便是经验丰富的DBA也可能因误操作导致数据丢失。本文将详细介绍如何在MySQL环境下利用binlog进行数据恢复,这对于刚接触...
通过binlog日志进行mysql数据恢复
根据mysql数据日志文件,自动生成对应的建表sql和数据恢复sql,可以对数据名和表明进行过滤。适用于设置为完整日志格式下的mysql数据库还原,包括误操作数据、数据库崩溃等多种情况下的数据库数据恢复。 ※※※※...
RAID6数据恢复软件V2.1是一款RAID6数据恢复软件,完全支持整个RAID6在缺少两块磁盘后进行完整数据恢复。 该软件是一款功能强大的RAID6数据恢复软件,完全支持整个RAID6在缺少两块磁盘后进行完整数据恢复。 完美...
#### 二、MySQL数据恢复基础知识 1. **逻辑备份与物理备份**: - **逻辑备份**通常是使用`mysqldump`工具将整个数据库导出为SQL脚本文件。 - **物理备份**则是直接复制数据库文件到备份介质上,如使用`cp`命令...
总之,MySQL数据恢复主要依赖于二进制日志和定期的全量备份。正确开启binlog并定期备份是防止数据丢失的关键步骤。在出现误操作时,及时停止所有写入操作,然后按照上述步骤进行恢复,可以最大程度地减少数据损失。...
二、MySQL数据恢复 1. **使用SQL脚本恢复**:恢复过程相对简单,只需将备份的SQL文件导入到MySQL服务器: ``` mysql -u [username] -p[password] [database_name] ``` 2. **基于二进制日志的恢复**:如果需要...
### MySQL根据日志恢复数据详细步骤 #### 一、引言 MySQL作为一款广泛使用的开源关系型数据库管理系统,因其高效稳定、易于维护等特性而深受开发者喜爱...希望本文能够帮助读者更好地理解和掌握MySQL的数据恢复技巧。
在本篇文章中,我们将深入探讨MySQL的数据恢复机制,包括其重要性、基本步骤、不同类型的备份策略以及高级恢复策略,以帮助读者更好地理解和实施数据保护措施。 #### MySQL 数据恢复的重要性 数据恢复是任何数据库...
文件级别数据库恢复工具软件,本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表...
1.1.7 MySQL的数据如何恢复到任意时间点?
MySQL 数据恢复通过 .frm 和 .ibd 文件 MySQL 是一种广泛使用的关系型数据库管理系统,它提供了高效、安全和可靠的数据存储和管理机制。但是,在实际应用中,数据库可能会出现各种故障,例如数据丢失、表结构异常等...
#### 二、MySQL数据恢复 为了确保数据的完整性和准确性,首先需要将MySQL的备份文件恢复到一个测试数据库中,然后再进行迁移操作。 **1. 恢复步骤** - 批量执行`.sql`文件,在MySQL测试库中重新建立表并恢复数据...
2. **数据恢复**:一旦发现可修复的错误,工具会尝试恢复数据,确保尽可能多的数据能够被挽救。 3. **日志分析**:对于InnoDB引擎,工具可能需要分析事务日志(Redo Log)来恢复未提交的事务,以保持数据一致性。 ...
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
MySQL 数据备份与恢复是数据库管理中的重要环节,它关乎到数据的安全性和业务的连续性。在本篇中,我们将深入探讨 MySQL 的三种主要备份恢复模式,以及如何利用工具如 `innobackupex` 实现高效的数据保护。 一、...
然而,数据库系统难免会遇到问题,如意外的数据丢失、错误操作或系统崩溃等,这时MySQL的日志和数据恢复机制就显得尤为重要。本文将深入探讨MySQL中的日志类型以及如何利用这些日志进行数据恢复。 1. 错误日志 ...