1. 程式人生 > >oracle 表資料刪除後恢復還原

oracle 表資料刪除後恢復還原

資料庫表還原到某時間點

還原語句

使用如下sql語句就可以還原整張表格資料到某個時間點,前提條件:該表的表格式沒有變動(如:欄位的修改等)

ALTER TABLE 表名 ENABLE ROW MOVEMENT;
FLASHBACK TABLE 表名 TO TIMESTAMP TO_TIMESTAMP('2018-02-27 09:00:00', 'yyyy-mm-dd hh24:mi:ss');
  • 測試基礎資料
create table DEMO
(
  id        VARCHAR2(10) not null,
  dsc       VARCHAR2(100),
  pid       VARCHAR2(10
), is_delete NUMBER default 0 not null, sal NUMBER );
insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00013', '河南', '00001', 0, null); insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00022', '香港', '0001', 0, 10); insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00001', '中國', '-1', 0, null
);
insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00011', '陝西', '00001', 0, 400); insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00012', '貴州', '00001', 0, 11); insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00111', '西安', '00011', 0, null); insert into demo (ID, DSC, PID, IS_DELETE, SAL) values
('00112', '咸陽', '00011', 0, null);
insert into demo (ID, DSC, PID, IS_DELETE, SAL) values ('00113', '延安', '00011', 0, null); commit;

以下兩種還原表資料方式,可以正對於某個特點條件下刪除的資料恢復

1. select…as of timestamp

--1.刪除id為'00013'的這條資料
DELETE FROM demo de WHERE de.id = '00013';
COMMIT;
--查詢是10分鐘前id為'00013'的這條資料
SELECT * FROM demo AS OF TIMESTAMP SYSDATE-10/1440 WHERE ID = '00013';
--插入剛才刪除id為'00013'的這條資料
INSERT INTO demo SELECT * FROM demo AS OF TIMESTAMP SYSDATE-10/1440 WHERE id = '00013';
commit;
  • 註解說明

    SYSDATE-10/1440
    SYSDATE-10/1440是啥意思,1440又是怎麼來的?

    首先60(分)×24=1440,這樣就計算出一天擁有多少分鐘,SYSDATE是系統函式,用來取得當前的系統時間(以天為單位),SYSDATE-10/1440,得出的就是距當前時間10分鐘前的記錄了

2. select…as of scn

--該語句獲取scn值2948488
SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;
SELECT * FROM demo de WHERE de.id = '00013';
--1.刪除id為'00013'的這條資料
DELETE FROM demo de WHERE de.id = '00013';
COMMIT;

--查詢是scn值為2948488時 表中id為'00013'的這條資料
SELECT * FROM demo AS OF SCN 2948488 WHERE id = '00013';

--插入剛才刪除id為'00013'的這條資料
INSERT INTO demo SELECT * FROM demo AS OF SCN 2948488 WHERE id = '00013';
COMMIT;
  • 註解說明

    SCN 2884883
    SCN 2884883是啥意思呢? 2884883是怎麼來的?

    既然是基於SCN的查詢,我們首先就需要得到SCN,這裡我們通過DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函式來獲取Oracle當前的SCN,之後再執行資料的修改操作。
    如何獲取Oracle資料庫當前的SCN?獲取當前SCN的方式非常多,除了使用DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER函式外,也可以通過查詢V$DATABASE檢視中的CURRENT_SCN列獲取。不過,不管是通過查詢檢視,或是通過過程獲取,操作的使用者都必須擁有要操作物件的訪問許可權。
    SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;


  • 轉換說明
    在Oracle資料庫中也可以手動進行時間和SCN的相互轉換,Oracle提供了兩個函式SCN_TO_TIMESTAMP和 TIMESTAMP_TO_SCN專門幹這個
SELECT timestamp_to_scn(SYSDATE) FROM dual ;
    SELECT to_char(scn_to_timestamp(2884883),'yyyy-mm-dd hh:mm:ss') FROM dual;