先查看确定数据库最大可以闪回查询的时间段undo_retention(单位秒) SQL> show parameter undo_retention; 确定数据库的状态:undo_management是auto show parameter undo_management ; 然后创建一个存储过程: CREATE OR REPLACE PROCEDURE prc_recoveremp IS CURSOR c_emp IS SELECT * FROM scott.emp; v_row c_emp%ROWTYPE; BEGIN --确定删除操作的时间距离当前时间的时间长度(不超过5天) DBMS_FLASHBACK.ENABLE_AT_TIME(SYSTIMESTAMP - INTERVAL '1' DAY); OPEN c_emp; DBMS_FLASHBACK.DISABLE; LOOP FETCH c_emp INTO v_row; EXIT WHEN c_emp%NOTFOUND; INSERT INTO scott.emp VALUES (v_row.EMPNO,v_row.ENAME,...); END LOOP; CLOSE c_emp; COMMIT; END prc_recoveremp; 最后执行它来进行恢复: execute prc_recoveremp;
logminer就行了
如果log已经被清了,那就没救了
SQL> show parameter undo_retention;
确定数据库的状态:undo_management是auto
show parameter undo_management ;
然后创建一个存储过程:
CREATE OR REPLACE PROCEDURE prc_recoveremp IS
CURSOR c_emp IS
SELECT * FROM scott.emp;
v_row c_emp%ROWTYPE;
BEGIN
--确定删除操作的时间距离当前时间的时间长度(不超过5天)
DBMS_FLASHBACK.ENABLE_AT_TIME(SYSTIMESTAMP - INTERVAL '1' DAY);
OPEN c_emp;
DBMS_FLASHBACK.DISABLE;
LOOP
FETCH c_emp INTO v_row;
EXIT WHEN c_emp%NOTFOUND;
INSERT INTO scott.emp VALUES
(v_row.EMPNO,v_row.ENAME,...);
END LOOP;
CLOSE c_emp;
COMMIT;
END prc_recoveremp;
最后执行它来进行恢复:
execute prc_recoveremp;