使用闪回功能快速恢复用户的误操作
2012-12-28 21:12
597 查看
Oracle提供的闪回特性对于快速恢复误操作的数据起到了非常大的帮助。在没有这个特性的Oracle早期版本,如果需要恢复因用户错误导致的数据丢失,需要大量的时间和精力去做不完全恢复。
不过,这种用空间换时间的策略也存在限制,不可能无限地恢复任何时间点的误操作。针对那些“及时”发现的误操作,使用该方法进行恢复是非常有效的。
简单演示一下这个方法,供参考。
1.创建实验表T
sec@ora10g> create table t (x int);
Table created.
2.初始化数据
sec@ora10g> insert into t values (1);
1 row created.
sec@ora10g> commit;
Commit complete.
sec@ora10g> insert into t values (2);
1 row created.
sec@ora10g> commit;
Commit complete.
3.查看表中的数据,之所以使用rowid字段是为了后面实验参考方便。
sec@ora10g> select rowid, x from t;
ROWID X
------------------ ----------
AAASVaAAFAAAAAYAAA 1
AAASVaAAFAAAAAYAAB 2
4.模拟误删除
sec@ora10g> delete from t;
2 rows deleted.
sec@ora10g> commit;
Commit complete.
5.看一看此时T表有哪些动作被记录在案?
sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
因为前后的操作时间并不是很长,所以对于T表的所有操作都清晰的展示出来了。
6.恢复方法一:使用UNDO SQL。
重点关注一下“VERSIONS_XID”的内容,每一个不同的值都对应了一个完整的操作动作。我们逐条看一下上面每个动作对应的恢复语句。
1)如果要恢复误删除的操作,可以使用下面的UNDO SQL。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL
----------------------------------------------------------------------
insert into "SEC"."T"("X") values ('2');
insert into "SEC"."T"("X") values ('1');
2)向前一步回滚:回滚插入的“2”,即删除记录“2”对应的行。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090018004B250000';
UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAB';
3)再向前回滚:回滚插入的“1”,即删除记录“1”对应的行。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090008004B250000';
UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAA';
7.恢复方法二:使用SCN号进行便捷恢复
上面虽然已经列出了具体回滚的SQL语句,只要简单的执行即可,不过如果涉及的到的记录数非常多,那么使用具体的UNDO SQL就不是很方便了。
这里有一个比较简单的方法,我们可以通过XID的值在flashback_transaction_query视图中得到操作前的SCN号,然后根据SCN号进行闪回恢复。简单演示一下。
1)得到误删除之前的SCN号
sec@ora10g> col UNDO_SQL for a42
sec@ora10g> col OPERATION for a8
sec@ora10g> select undo_sql, operation, start_scn from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL OPERATIO START_SCN
------------------------------------------ -------- ----------
insert into "SEC"."T"("X") values ('2'); DELETE 31205010
insert into "SEC"."T"("X") values ('1'); DELETE 31205010
BEGIN 31205010
2)使用上面的SCN号“31205010”进行闪回
sec@ora10g> flashback table t to scn 31205010;
flashback table t to scn 31205010
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
3)上面报错提示信息很明确,需要启用“row movement”。
sec@ora10g> alter table t enable row movement;
Table altered.
4)再次尝试闪回,成功。
sec@ora10g> flashback table t to scn 31205010;
Flashback complete.
5)最后重新查看一下T表的操作记录
sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 10.02.16 PM 09000F004C250000 I 1
05-DEC-09 10.02.16 PM 09000F004C250000 I 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
6 rows selected.
可见闪回的动作也被记录在案,因为使用的是真实的SQL来完成。
6)使用这种基于SCN的恢复方法可以将表恢复到任何“可恢复”的时间点,比较灵活。
例如,我们可以使用下面的SQL恢复T表到仅插入记录“1”的状态。
sec@ora10g> flashback table t to scn 31204988;
Flashback complete.
sec@ora10g> select * from t;
X
----------
1
8.小结
使用此闪回方法恢复误操作有一个前提,就是需要尽早的发现问题,果断的采取行动。若误操作的记录已经在UNDO中被清除,则此方法就不可行了,需要另寻他法。
不过,这种用空间换时间的策略也存在限制,不可能无限地恢复任何时间点的误操作。针对那些“及时”发现的误操作,使用该方法进行恢复是非常有效的。
简单演示一下这个方法,供参考。
1.创建实验表T
sec@ora10g> create table t (x int);
Table created.
2.初始化数据
sec@ora10g> insert into t values (1);
1 row created.
sec@ora10g> commit;
Commit complete.
sec@ora10g> insert into t values (2);
1 row created.
sec@ora10g> commit;
Commit complete.
3.查看表中的数据,之所以使用rowid字段是为了后面实验参考方便。
sec@ora10g> select rowid, x from t;
ROWID X
------------------ ----------
AAASVaAAFAAAAAYAAA 1
AAASVaAAFAAAAAYAAB 2
4.模拟误删除
sec@ora10g> delete from t;
2 rows deleted.
sec@ora10g> commit;
Commit complete.
5.看一看此时T表有哪些动作被记录在案?
sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
因为前后的操作时间并不是很长,所以对于T表的所有操作都清晰的展示出来了。
6.恢复方法一:使用UNDO SQL。
重点关注一下“VERSIONS_XID”的内容,每一个不同的值都对应了一个完整的操作动作。我们逐条看一下上面每个动作对应的恢复语句。
1)如果要恢复误删除的操作,可以使用下面的UNDO SQL。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL
----------------------------------------------------------------------
insert into "SEC"."T"("X") values ('2');
insert into "SEC"."T"("X") values ('1');
2)向前一步回滚:回滚插入的“2”,即删除记录“2”对应的行。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090018004B250000';
UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAB';
3)再向前回滚:回滚插入的“1”,即删除记录“1”对应的行。
sec@ora10g> select undo_sql from flashback_transaction_query WHERE XID='090008004B250000';
UNDO_SQL
----------------------------------------------------------------------
delete from "SEC"."T" where ROWID = 'AAASVaAAFAAAAAYAAA';
7.恢复方法二:使用SCN号进行便捷恢复
上面虽然已经列出了具体回滚的SQL语句,只要简单的执行即可,不过如果涉及的到的记录数非常多,那么使用具体的UNDO SQL就不是很方便了。
这里有一个比较简单的方法,我们可以通过XID的值在flashback_transaction_query视图中得到操作前的SCN号,然后根据SCN号进行闪回恢复。简单演示一下。
1)得到误删除之前的SCN号
sec@ora10g> col UNDO_SQL for a42
sec@ora10g> col OPERATION for a8
sec@ora10g> select undo_sql, operation, start_scn from flashback_transaction_query WHERE XID='09002C004B250000';
UNDO_SQL OPERATIO START_SCN
------------------------------------------ -------- ----------
insert into "SEC"."T"("X") values ('2'); DELETE 31205010
insert into "SEC"."T"("X") values ('1'); DELETE 31205010
BEGIN 31205010
2)使用上面的SCN号“31205010”进行闪回
sec@ora10g> flashback table t to scn 31205010;
flashback table t to scn 31205010
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
3)上面报错提示信息很明确,需要启用“row movement”。
sec@ora10g> alter table t enable row movement;
Table altered.
4)再次尝试闪回,成功。
sec@ora10g> flashback table t to scn 31205010;
Flashback complete.
5)最后重新查看一下T表的操作记录
sec@ora10g> select versions_starttime,versions_endtime, versions_xid, versions_operation,t.x from t versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V X
--------------------- --------------------- ---------------- - ----------
05-DEC-09 10.02.16 PM 09000F004C250000 I 1
05-DEC-09 10.02.16 PM 09000F004C250000 I 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 2
05-DEC-09 09.52.51 PM 09002C004B250000 D 1
05-DEC-09 09.50.57 PM 05-DEC-09 09.52.51 PM 090018004B250000 I 2
05-DEC-09 09.49.54 PM 05-DEC-09 09.52.51 PM 090008004B250000 I 1
6 rows selected.
可见闪回的动作也被记录在案,因为使用的是真实的SQL来完成。
6)使用这种基于SCN的恢复方法可以将表恢复到任何“可恢复”的时间点,比较灵活。
例如,我们可以使用下面的SQL恢复T表到仅插入记录“1”的状态。
sec@ora10g> flashback table t to scn 31204988;
Flashback complete.
sec@ora10g> select * from t;
X
----------
1
8.小结
使用此闪回方法恢复误操作有一个前提,就是需要尽早的发现问题,果断的采取行动。若误操作的记录已经在UNDO中被清除,则此方法就不可行了,需要另寻他法。
相关文章推荐
- 使用闪回功能快速恢复用户的误操作
- 使用Oracle10g Flashback database功能恢复用户错误
- NET快速信息化系统开发框架 V3.2 -> “用户管理”主界面使用多表头展示、增加打印功能
- 使用oracle闪回查询功能恢复之前删除的数据
- window下使用二进制文件对mysql数据库备份及恢复(再现用户操作)
- 解决:一个最近安装的程序已停用欢迎屏幕和快速用户切换.您必须卸载该程序以恢复这些功能.下列文件名可以帮您识别该程序所作的修改:vrlogon.dll 【转贴】
- NET快速信息化系统开发框架 V3.2 -> “用户管理”主界面使用多表头展示、增加打印功能
- .NET快速信息化系统开发框架 V3.2 -> “用户管理”主界面使用多表头展示、增加打印功能
- 给您的文字编辑程序添加一剂“后悔药”-使用RichTextBox控件提供用户编辑功能,加入类似word的“撤销”和“恢复”功能
- 使用数据库闪回功能来恢复已经删除…
- 使用RMAN恢复用户DML误操作的步骤
- ORACLE EBS中附件功能的使用(上传用户操作文档)
- SQL Server 2016新功能--Temporal Table--快速恢复误操作
- mysql delete错误使用where条件的操作恢复(模拟oracle闪回)
- oracle使用闪回功能恢复删除的表数据
- 注意使用闪回功能恢复
- XP下关于快速切换用户功能的相关编程
- BaiduMap---百度地图官方Demo之LBS.云检索功能(介绍如何使用LBS.云检索用户自有数据)
- HP1020打印机加入域后,域用户无法使用HP1020域打印功能
- ARCHIVELOG模式下用户管理恢复控制文件(2)——使用trace文件重建控制文件!