delete表的数据后恢复

[img]http://dl2.iteye.com/upload/attachment/0094/2787/8d2000d7-a32b-3824-a9b0-ec9c6bd99c34.jpg[/img]
今天测试下了Oracle在删除表的数据后的恢复方法。

在oracle生产系统的维护测试中有一张表,将里面的数据delete并commit了,由于业务不能中断(数据库不能停机),并且系统还在不断有数据往该表中写入。现在需要将之前delete掉的数据恢复,可以使用基于scn的恢复。

在删除之前,最好查询到数据库当前的scn,恢复的时候就采用基于这个scn点的恢复。

example:
方法一:
1)创建一张测试表;
CREATE TABLE w AS SELECT * FROM dba_objects WHERE 1 = 2;
2)向该表插入测试数据;
SQL> insert into w select * from dba_objects;

72558 rows created.

SQL> commit;

Commit complete.
3)SQL> select count(*) from w;

COUNT(*)
----------
72558
4)在删除之前,先获取数据库的scn,便于恢复的时候查找到数据在什么时候还是存在的;
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
117853514 ------ 当前scn号
由于数据库没有停,因此scn号也在不断变化,因此需要查出数据在哪个scn点的时候还是存在的
SQL> select count(*) from w as of scn 117854000; ------查看数据在scn号为117854000时是否存在
select count(*) from w as of scn 117854000
*
ERROR at line 1:
ORA-08181: specified number is not a valid system change number ------应该是系统还没有走到这个scn号


SQL> select count(*) from w as of scn 117853000;------查看数据在scn号为117853000时是否存在

COUNT(*)
----------
0 ------不存在

SQL> select count(*) from w as of scn 117853500;

COUNT(*)
----------
0

SQL> select count(*) from w as of scn 117853510; 直到查到这个scn才发现数据才存在,因此届时就是基于这个scn点进行恢复

COUNT(*)
----------
72558
5)模拟删除数据;
SQL> delete from w;

72558 rows deleted.

SQL> commit;

Commit complete.
SQL> SELECT COUNT(*) FROM w;

COUNT(*)
----------
0
6)模拟数据库不停机,业务在不断向表中插入数据; 【Linux公社 http://www.linuxidc.com 】
SQL> insert into w select * from w as of scn 117844000;

72558 rows created.

SQL> select count(*) from w;

COUNT(*)
----------
72558
<think>好的,我现在需要帮助用户了解如何在MySQL中恢复DELETE删除的数据。首先,我得回忆一下相关知识。记得MySQL的binlog可以用于数据恢复,但具体步骤可能有点复杂。用户提供的引用里提到了一些关键点,比如使用mysqlbinlog工具、查找误操作的时间点、转换DELETE语句为INSERT等。我需要把这些步骤整理清楚,确保逻辑正确,同时遵循用户给出的格式要求。 首先,恢复数据的前提是启用了binlog,并且日志格式是ROW模式。因为STATEMENT或MIXED模式可能无法完整记录数据变化。用户可能不知道这个前提,需要明确说明。 接下来,步骤大概分为定位误操作的时间点、导出相关binlog内容、转换DELETE为INSERT语句,然后执行这些语句恢复数据。每个步骤需要详细说明,比如如何用mysqlbinlog命令指定时间范围,如何用sed命令处理日志文件。用户提供的引用里提到了具体的命令示例,应该参考这些内容,确保准确性。 还要注意可能的错误点,比如时间点不准确导致导出内容不全,或者转换过程中语法错误。需要提醒用户在操作前备份当前数据,避免二次破坏。此外,如果有多个事务或大量数据,处理起来可能更复杂,可能需要分段处理或使用工具辅助。 用户的问题可能还涉及权限问题,比如是否有权限访问binlog文件,或者执行mysqlbinlog命令。不过这可能属于进阶内容,用户如果没有提到,可能不需要深入,但可以简单提及需要注意权限。 最后,生成相关问题时要围绕数据恢复的主题,比如其他恢复方法、预防措施、binlog的其他用途等,这样用户可以有进一步的学习方向。 现在需要将以上思考整理成结构清晰的步骤,使用中文,注意数学公式和代码块的格式要求,同时正确引用提供的参考资料。确保每个步骤都有对应的引用标注,例如使用[^1]、[^2]等。还要检查LaTeX语法是否正确,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能公式较少,主要关注代码块和引用。</think>### MySQL恢复DELETE删除数据的方法 在MySQL中恢复被`DELETE`误删的数据,主要依赖**binlog日志**和**ROW格式的日志记录**。以下是详细步骤: --- #### **一、前提条件** 1. **启用binlog**:MySQL需配置`log_bin=ON`,并设置`binlog_format=ROW`[^4]。 2. **定位误操作时间**:需知道`DELETE`执行的大致时间范围[^4]。 --- #### **二、恢复流程** 1. **查找误操作的binlog点位** 使用`mysqlbinlog`工具导出特定时间段的日志: ```bash mysqlbinlog "/path/mysql-bin.00000X" \ --start-datetime="2024-09-22 22:00:00" \ --stop-datetime="2024-09-22 22:24:00" \ --base64-output=decode-rows -v > operation.sql ``` 通过搜索`DELETE FROM`关键字定位误删记录[^4][^5]。 2. **转换DELETE语句为INSERT** 使用`sed`命令将`DELETE`操作逆向转换为`INSERT`语句: ```bash cat operation.sql | sed -n '/###/p' | \ sed 's/### //g; s/DELETE FROM/INSERT INTO/g; s/WHERE/SELECT/g;' \ | sed 's/@1=//g; s/@[1-9]=/,/g' > restore.sql ``` 此操作会将删除前的数据生成插入语句。 3. **执行恢复脚本** 在MySQL中运行生成的`restore.sql`文件: ```bash mysql -u root -p < restore.sql ``` 或通过客户端工具(如Navicat)逐条执行[^3]。 --- #### **三、注意事项** - **日志格式**:必须为`ROW`格式,否则无法解析具体数据[^1]。 - **及时性**:误操作后尽快恢复,避免binlog被覆盖或清理。 - **备份优先**:恢复前备份当前数据库状态,防止二次损坏。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值