oracle误删除或未加where条件误更新后恢复数据
将删除或误更新之前的前数据,查出并做成新表
-
创建测试表,并插入数据 CREATE TABLE "TEST_RECOVER" (
"ID" NUMBER PRIMARY KEY,
"NAME" VARCHAR2(255 BYTE),
"AGE" NUMBER
);
INSERT INTO "TEST_RECOVER" VALUES ('1', '白敬亭', '20');
INSERT INTO "TEST_RECOVER" VALUES ('2', '宋祖儿', '18');
INSERT INTO "TEST_RECOVER" VALUES ('3', '胡歌', '21');
-
手滑执行了 UPDATE TEST_RECOVER SET AGE = 25; 造成数据全部更改了 -
查询数据库执行sql记录 SELECT
*
FROM
v$sqlarea t
ORDER BY
t.LAST_ACTIVE_TIME DESC
SELECT
*
FROM
v$sqlarea t
where
t.sql_text LIKE '%test_recover%' OR t.sql_text LIKE '%TEST_RECOVER%'
ORDER BY
t.LAST_ACTIVE_TIME DESC
SELECT
T.SQL_TEXT, T.SQL_FULLTEXT, SQL_ID,FIRST_LOAD_TIME
FROM
v$sqlarea t
where
t.sql_text LIKE '%test_recover%' OR t.sql_text LIKE '%TEST_RECOVER%'
ORDER BY
t.LAST_ACTIVE_TIME DESC
SQL_TEXT、SQL_FULLTEXT:记录sql的信息 FIRST_LOAD_TIME:记录sql时间,可以用来恢复数据
- 根据SQL_FULLTEXT,找到FIRST_LOAD_TIME,做临时表
create table NEW_TEST_RECOVER
as
select * from TEST_RECOVER
as of timestamp to_timestamp('2022-08-30 11:13:03','yyyy-mm-dd hh24:mi:ss');
- 查询新表,数据已恢复到NEW_TEST_RECOVER,后续想怎么弄就怎么弄了
SELECT * FROM NEW_TEST_RECOVER;
注意:oracle闪回快照是有时间限制的,并不是所有的数据均可以闪回
直接回滚删除前或误更新前数据
- 更上述创建表、插入数据、查出FIRST_LOAD_TIME相同
- 根据FIRST_LOAD_TIME直接闪回数据,本篇直接闪回上述2022-08-30 11:13:03数据
SELECT
*
FROM
v$sqlarea t
where
t.sql_text LIKE '%test_recover%' OR t.sql_text LIKE '%TEST_RECOVER%'
ORDER BY
t.LAST_ACTIVE_TIME DESC
alter table TEST_RECOVER enable row movement;
lashback table TEST_RECOVER to timestamp to_timestamp('2022-08-30 11:13:03','yyyy-mm-dd hh24:mi:ss');
alter table TEST_RECOVER disable row movement;
|