利用flashback还原数据库和表
flashback 是oracle 10G给我们提供的最有价值的工具之一。利用他结合TSPITR可以大大节省DBA的工作量。
flashback 一张表的方法:
1、首先确认用户有flashback any table 的权限,或者 grant flashback any table to user;
2、向一张表中插入数据:
INSERT INTO employee
SELECT * FROM employee AS OF TIMESTAMP
TO_TIMESTAMP('2003-04-04 14:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE name = 'JOHN';
3、如果确认数据插入错误:在FLASH_TRANSACTION_QUERY表中查询插入信息:
SELECT commit_timestamp , logon_user FROM FLASHBACK_TRANSACTION_QUERY
WHERE xid IN
(SELECT versions_xid FROM employee VERSIONS BETWEEN
TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00', 'YYYY-MM-DD HH:MI:SS')
and TO_TIMESTAMP('2003-04-04 17:00:00', 'YYYY-MM-DD HH:MI:SS')
WHERE name = 'JOHN');
4、根据表中显示的信息,可以用时间或SCN号进行还原:FLASHBACK TABLE employee TO TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00','YYYY-MM-DD HH:MI:SS');
如果表中含有与其它表的约束条件,而造成其它表的数据错误,则建议用以下方式:
1、FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2003-04-04 14:00:00','YYYY-MM-DD HH:MI:SS');
2、EXP 相应的数据;
3、recover database until ...到当前状态
4、IMP相应数据。
错误删除一张表的恢复方法:
1、drop table employee;
2、被drop掉的表会保存在recyclebin中,并且不会自动删除,除非使用purge命令可以完全删除。
3、查询recyclebin中保存的数据:
SQL> SELECT object_name as recycle_name, original_name, object_type
FROM recyclebin;
RECYCLE_NAME ORIGINAL_NAME OBJECT_TYPE
-------------------------------- --------------------- -------------
BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0 EMPLOYEE_DEMO TABLE
BIN$JKS983293M1dsab4gsz/I249==$0 I_EMP_DEMO INDEX
BIN$NR72JJN38KM1dsaM4gI348as==$0 LOB_EMP_DEMO LOB
BIN$JKJ399SLKnaslkJSLK330SIK==$0 LOB_I_EMP_DEMO LOB INDEX
找到保存的表名,注意此时的表名是以ID形式存在,可以对照别名找到你删除的表。如果不使用ID名还原,可能会导致其它重名,或已经删除的同名表一起被还原。
4、执行恢复:
FLASHBACK TABLE "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0" TO BEFORE DROP;