TSPITR方式資料庫找回誤操作丟失的資料

持續高溫發表於2018-07-30

一、TSPITR介紹

        TSPITR全稱是Tablespace Point In Time Recover(表空間基於時間點的不完全恢復)。原理是通過輔助例項基於時間還原出誤操作前的資料通過DataPump將資料匯入到目標資料庫。TSPITR的最大好處是不需要生產庫停機。

二、適用場景

表空間時點恢復適用用以下場景:
    ①錯誤的批處理作業或資料操作語言DML
    ②恢復資料定義語言(DDL)後丟失的資料操作,改變表的結構。不能使用閃回表將表倒回結構更改點之前,例如截斷表(truncate)操作。
    ③恢復drop時使用了purge選項的表
    ④恢復存在邏輯錯誤的表
    ⑤恢復被刪除的表空間,RMAN可以在被drop的表空間上面執行TSPITR
    ⑥與全庫級別閃回相比,表空間時點恢復停留在表空間級別,影響較全庫閃回較小。其次,資料庫閃回功能需要承擔維護閃回日誌開啟的相關效能開銷。

三、TSPITR前提

1、有一套有效全庫備份,因為TSPITR這個過程除了複製需要恢復的表空間外,也必須複製system,sysaux和undo表空間
2、需要回復的表空間需要自包含,可以通過TS_PITR_CHECK檢視檢視自包含資訊。表空間上存在約束關係(依賴)表的情形,依賴關係所在的表空間也需要一同做時點恢復(如外來鍵參照,不在同一時點,則違反參照約束)
3、對於索引與資料分離的表空間在時點恢復時,應先刪除索引
4、不能恢復資料庫當前的預設表空間
5、不能恢復以下物件:
    ①存在依賴關係的物化檢視,分割槽表等(如果要恢復,先解決依賴)
    ②undo表空間,undo段
    ③sys模式下的物件(如PL/SQL,views, synonyms, users…)

四、測試過程

1、對全庫做一個全備(之前做過全庫備份並且有效這步可以忽略)

RMAN> backup database format `/u01/rman_bak/all_db_%U.bak`;

啟動 backup 於 2018-07-29 19:19:31
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
輸入資料檔案: 檔案號=00001 名稱=/u01/app/oracle/oradata/vbox66db/system01.dbf
輸入資料檔案: 檔案號=00002 名稱=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
輸入資料檔案: 檔案號=00003 名稱=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
輸入資料檔案: 檔案號=00004 名稱=/u01/app/oracle/oradata/vbox66db/users01.dbf
輸入資料檔案: 檔案號=00005 名稱=/u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在啟動段 1 於 2018-07-29 19:19:31
通道 ORA_DISK_1: 已完成段 1 於 2018-07-29 19:21:37
段控制程式碼=/u01/rman_bak/all_db_0kt98563_1_1.bak 標記=TAG20180729T191931 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:02:06
通道 ORA_DISK_1: 正在啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
備份集內包括當前控制檔案
備份集內包括當前的 SPFILE
通道 ORA_DISK_1: 正在啟動段 1 於 2018-07-29 19:21:44
通道 ORA_DISK_1: 已完成段 1 於 2018-07-29 19:21:45
段控制程式碼=/u01/rman_bak/all_db_0lt985a1_1_1.bak 標記=TAG20180729T191931 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 2018-07-29 19:21:45

RMAN> 

2、建立一個測試表空間

①建立testdb表空間

SYS@vbox66in>create tablespace testdb datafile `/u01/app/oracle/oradata/vbox66db/testdb01.dbf` size 100M autoextend on;

表空間已建立。

SYS@vbox66in>select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/vbox66db/system01.dbf
/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
/u01/app/oracle/oradata/vbox66db/users01.dbf
/u01/app/oracle/oradata/vbox66db/test01.dbf
/u01/app/oracle/oradata/vbox66db/testdb01.dbf

已選擇6行。

SYS@vbox66in>

SYS@vbox66in>alter user scott default tablespace testdb;

使用者已更改。

②建立測試表

SCOTT@vbox66in>create table test01 tablespace testdb as select * from emp;

表已建立。

SCOTT@vbox66in>create table test02 tablespace testdb as select * from dept;

表已建立。
SCOTT@vbox66in>alter table test01 add primary key(empno);

表已更改。

SCOTT@vbox66in>alter table test02 add primary key(deptno);

表已更改。

SCOTT@vbox66in>alter table test01 add constraints test01_fk foreign key(deptno) references test02(deptno);

表已更改。

SCOTT@vbox66in>

SCOTT@vbox66in>commit;

提交完成。

SCOTT@vbox66in>

③RMAN備份testdb表空間

RMAN> backup tablespace testdb format `/u01/rman_bak/testdb_%U.bak`;

啟動 backup 於 2018-07-29 21:01:53
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
輸入資料檔案: 檔案號=00006 名稱=/u01/app/oracle/oradata/vbox66db/testdb01.dbf
通道 ORA_DISK_1: 正在啟動段 1 於 2018-07-29 21:01:53
通道 ORA_DISK_1: 已完成段 1 於 2018-07-29 21:01:54
段控制程式碼=/u01/rman_bak/testdb_0mt98b61_1_1.bak 標記=TAG20180729T210153 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 2018-07-29 21:01:54

RMAN> 

④取當前時間,以便之後還原時用

SCOTT@vbox66in>select sysdate from dual;

SYSDATE
-------------------
2018-07-29 21:03:31

SCOTT@vbox66in>

⑤誤操作刪除表test01、test02資料(這裡是測試,)

SCOTT@vbox66in>truncate table test02;

表被截斷。

SCOTT@vbox66in>truncate table test01;

表被截斷。

SCOTT@vbox66in>select * from test01;

未選定行

SCOTT@vbox66in>select * from test02;

未選定行

SCOTT@vbox66in>

⑥建立目錄指定輔助庫目標,

[oracle@vbox66 ~]$ mkdir -p /tmp/auxdata
[oracle@vbox66 ~]$ ll /tmp/auxdata/
總計 0
[oracle@vbox66 ~]$ ll -d /tmp/auxdata/
drwxr-xr-x 2 oracle oinstall 4096 07-29 21:16 /tmp/auxdata/

⑦做RMAN TSPITR 並指定輔助庫目的地

RMAN> recover tablespace testdb until time `2018-07-29 22:11:35` auxiliary destination `/tmp/auxdata`;    //這個時間和上面記錄的有點出入,因為期間修改過一次,道理上一致
啟動 recover 於 2018-07-29 22:15:28
使用通道 ORA_DISK_1
RMAN-05026: 警告: 假定以下表空間集適用於指定的時間點

表空間列表要求具有 UNDO 段
表空間 SYSTEM
表空間 UNDOTBS1

使用 SID=`Fcny` 建立自動例項

供自動例項使用的初始化引數:
db_name=VBOX66DB
db_unique_name=Fcny_tspitr_VBOX66DB
compatible=11.2.0.4.0
db_block_size=8192
db_files=200
sga_target=1G
processes=80
db_create_file_dest=/tmp/auxdata
log_archive_dest_1=`location=/tmp/auxdata`
#No auxiliary parameter file used


啟動自動例項 VBOX66DB

Oracle 例項已啟動

系統全域性區域總計    1068937216 位元組

Fixed Size                     2260088 位元組
Variable Size                281019272 位元組
Database Buffers             780140544 位元組
Redo Buffers                   5517312 位元組
自動例項已建立
對恢復集表空間執行 TRANSPORT_SET_CHECK
TRANSPORT_SET_CHECK 已成功完成

記憶體指令碼的內容:
{
# set requested point in time
set until  time "2018-07-29 22:11:35";
# restore the controlfile
restore clone controlfile;
# mount the controlfile
sql clone `alter database mount clone database`;
# archive current online log 
sql `alter system archive log current`;
# avoid unnecessary autobackups for structural changes during TSPITR
sql `begin dbms_backup_restore.AutoBackupFlag(FALSE); end;`;
}
正在執行記憶體指令碼

正在執行命令: SET until clause

啟動 restore 於 2018-07-29 22:15:43
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=19 裝置型別=DISK

通道 ORA_AUX_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_AUX_DISK_1: 正在還原控制檔案
通道 ORA_AUX_DISK_1: 正在讀取備份片段 /u01/rman_bak/full_db_0pt98f62_1_1.bak
通道 ORA_AUX_DISK_1: 段控制程式碼 = /u01/rman_bak/full_db_0pt98f62_1_1.bak 標記 = TAG20180729T220804
通道 ORA_AUX_DISK_1: 已還原備份片段 1
通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:00:01
輸出檔名=/tmp/auxdata/VBOX66DB/controlfile/o1_mf_fovm0jqt_.ctl
完成 restore 於 2018-07-29 22:15:45

sql 語句: alter database mount clone database

sql 語句: alter system archive log current

sql 語句: begin dbms_backup_restore.AutoBackupFlag(FALSE); end;

記憶體指令碼的內容:
{
# set requested point in time
set until  time "2018-07-29 22:11:35";
plsql <<<-- tspitr_2
declare
  sqlstatement       varchar2(512);
  offline_not_needed exception;
  pragma exception_init(offline_not_needed, -01539);
begin
  sqlstatement := `alter tablespace `||  `TESTDB` ||` offline immediate`;
  krmicd.writeMsg(6162, sqlstatement);
  krmicd.execSql(sqlstatement);
exception
  when offline_not_needed then
    null;
end; >>>;
# set destinations for recovery set and auxiliary set datafiles
set newname for clone datafile  1 to new;
set newname for clone datafile  3 to new;
set newname for clone datafile  2 to new;
set newname for clone tempfile  1 to new;
set newname for datafile  6 to 
 "/u01/app/oracle/oradata/vbox66db/testdb01.dbf";
# switch all tempfiles
switch clone tempfile all;
# restore the tablespaces in the recovery set and the auxiliary set
restore clone datafile  1, 3, 2, 6;
switch clone datafile all;
}
正在執行記憶體指令碼

正在執行命令: SET until clause

sql 語句: alter tablespace TESTDB offline immediate

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

正在執行命令: SET NEWNAME

臨時檔案 1 在控制檔案中已重新命名為 /tmp/auxdata/VBOX66DB/datafile/o1_mf_temp_%u_.tmp

啟動 restore 於 2018-07-29 22:15:56
使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_AUX_DISK_1: 正在指定從備份集還原的資料檔案
通道 ORA_AUX_DISK_1: 將資料檔案 00001 還原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_system_%u_.dbf
通道 ORA_AUX_DISK_1: 將資料檔案 00003 還原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_%u_.dbf
通道 ORA_AUX_DISK_1: 將資料檔案 00002 還原到 /tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_%u_.dbf
通道 ORA_AUX_DISK_1: 將資料檔案 00006 還原到 /u01/app/oracle/oradata/vbox66db/testdb01.dbf
通道 ORA_AUX_DISK_1: 正在讀取備份片段 /u01/rman_bak/full_db_0ot98f25_1_1.bak
通道 ORA_AUX_DISK_1: 段控制程式碼 = /u01/rman_bak/full_db_0ot98f25_1_1.bak 標記 = TAG20180729T220804
通道 ORA_AUX_DISK_1: 已還原備份片段 1
通道 ORA_AUX_DISK_1: 還原完成, 用時: 00:02:25
完成 restore 於 2018-07-29 22:18:21

資料檔案 1 已轉換成資料檔案副本
輸入資料檔案副本 RECID=4 STAMP=982793902 檔名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_system_fovm0ws4_.dbf
資料檔案 3 已轉換成資料檔案副本
輸入資料檔案副本 RECID=5 STAMP=982793902 檔名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_fovm0wsx_.dbf
資料檔案 2 已轉換成資料檔案副本
輸入資料檔案副本 RECID=6 STAMP=982793902 檔名=/tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_fovm0wsb_.dbf

記憶體指令碼的內容:
{
# set requested point in time
set until  time "2018-07-29 22:11:35";
# online the datafiles restored or switched
sql clone "alter database datafile  1 online";
sql clone "alter database datafile  3 online";
sql clone "alter database datafile  2 online";
sql clone "alter database datafile  6 online";
# recover and open resetlogs
recover clone database tablespace  "TESTDB", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog;
alter clone database open resetlogs;
}
正在執行記憶體指令碼

正在執行命令: SET until clause

sql 語句: alter database datafile  1 online

sql 語句: alter database datafile  3 online

sql 語句: alter database datafile  2 online

sql 語句: alter database datafile  6 online

啟動 recover 於 2018-07-29 22:18:22
使用通道 ORA_AUX_DISK_1

正在開始介質的恢復

執行緒 1 序列 22 的歸檔日誌已作為檔案 /u01/app/oracle/oradata/arch/1_22_974146828.dbf 存在於磁碟上
歸檔日誌檔名=/u01/app/oracle/oradata/arch/1_22_974146828.dbf 執行緒=1 序列=22
介質恢復完成, 用時: 00:00:02
完成 recover 於 2018-07-29 22:18:25

資料庫已開啟

記憶體指令碼的內容:
{
# make read only the tablespace that will be exported
sql clone `alter tablespace  TESTDB read only`;
# create directory for datapump import
sql "create or replace directory TSPITR_DIROBJ_DPDIR as ``
/tmp/auxdata``";
# create directory for datapump export
sql clone "create or replace directory TSPITR_DIROBJ_DPDIR as ``
/tmp/auxdata``";
}
正在執行記憶體指令碼

sql 語句: alter tablespace  TESTDB read only

sql 語句: create or replace directory TSPITR_DIROBJ_DPDIR as ``/tmp/auxdata``

sql 語句: create or replace directory TSPITR_DIROBJ_DPDIR as ``/tmp/auxdata``

正在執行後設資料匯出...
   EXPDP> 啟動 "SYS"."TSPITR_EXP_Fcny":  
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/TABLE
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/INDEX_STATISTICS
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
   EXPDP> 處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
   EXPDP> 已成功載入/解除安裝了主表 "SYS"."TSPITR_EXP_Fcny" 
   EXPDP> ******************************************************************************
   EXPDP> SYS.TSPITR_EXP_Fcny 的轉儲檔案集為:
   EXPDP>   /tmp/auxdata/tspitr_Fcny_42764.dmp
   EXPDP> ******************************************************************************
   EXPDP> 可傳輸表空間 TESTDB 所需的資料檔案:
   EXPDP>   /u01/app/oracle/oradata/vbox66db/testdb01.dbf
   EXPDP> 作業 "SYS"."TSPITR_EXP_Fcny" 已於 星期日 7月 29 22:20:31 2018 elapsed 0 00:01:15 成功完成
匯出完畢


記憶體指令碼的內容:
{
# shutdown clone before import
shutdown clone immediate
# drop target tablespaces before importing them back
sql `drop tablespace  TESTDB including contents keep datafiles cascade constraints`;
}
正在執行記憶體指令碼

資料庫已關閉
資料庫已卸裝
Oracle 例項已關閉

sql 語句: drop tablespace  TESTDB including contents keep datafiles cascade constraints

正在執行後設資料匯入...
   IMPDP> 已成功載入/解除安裝了主表 "SYS"."TSPITR_IMP_Fcny" 
   IMPDP> 啟動 "SYS"."TSPITR_IMP_Fcny":  
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/PLUGTS_BLK
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/TABLE
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/INDEX_STATISTICS
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
   IMPDP> 處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
   IMPDP> 作業 "SYS"."TSPITR_IMP_Fcny" 已於 星期日 7月 29 22:21:27 2018 elapsed 0 00:00:10 成功完成
匯入完畢


記憶體指令碼的內容:
{
# make read write and offline the imported tablespaces
sql `alter tablespace  TESTDB read write`;
sql `alter tablespace  TESTDB offline`;
# enable autobackups after TSPITR is finished
sql `begin dbms_backup_restore.AutoBackupFlag(TRUE); end;`;
}
正在執行記憶體指令碼

sql 語句: alter tablespace  TESTDB read write

sql 語句: alter tablespace  TESTDB offline

sql 語句: begin dbms_backup_restore.AutoBackupFlag(TRUE); end;

刪除自動例項
自動例項已刪除
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/datafile/o1_mf_temp_fovm638r_.tmp
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_3_fovm5vqb_.log
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_2_fovm5p7q_.log
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/onlinelog/o1_mf_1_fovm5krt_.log
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/datafile/o1_mf_sysaux_fovm0wsb_.dbf
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/datafile/o1_mf_undotbs1_fovm0wsx_.dbf
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/datafile/o1_mf_system_fovm0ws4_.dbf
已刪除輔助例項檔案 /tmp/auxdata/VBOX66DB/controlfile/o1_mf_fovm0jqt_.ctl
完成 recover 於 2018-07-29 22:21:32

RMAN> 

⑧檢視錶的資料

SYS@vbox66in>alter tablespace testdb online;

表空間已更改。

SYS@vbox66in>conn scott/tiger;
已連線。
SCOTT@vbox66in>select * from test01;

 EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
  7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
  7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
  7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
  7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
  7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
  7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
  7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
  7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
  7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
  7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20

 EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
  7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
  7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
  7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10

已選擇14行。

SCOTT@vbox66in>select * from test02;

DEPTNO DNAME          LOC
---------- -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

SCOTT@vbox66in>

此時發現資料已經全部恢復。


相關文章