--======================
-- 唯讀資料表空間的備份與恢複
--======================
一、唯讀資料表空間的特性
使用唯讀資料表空間避免對待用資料的頻繁備份
當使用alter tablespace tbs read only時,資料檔案會執行檢查點進程(將所有髒緩衝區的內容寫至磁碟),
當前的SCN號會被標註,同時儲存了SCN的資料檔案頭部被凍結.控制檔案內也會記錄該資料檔案的凍結資訊。
可以清除唯讀資料表空間的對象
二、唯讀資料表空間的備份
一般情況下,唯讀資料表空間只需要進行一次備份,即當資料表空間狀態發生改變時應立即進行備份
可以使用OS系統cp命令來備份或RMAN進行備份唯讀資料表空間
使用RMAN時建議啟用備份最佳化選項
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
唯讀資料表空間不支援熱備
SQL> alter tablespace tbs1 begin backup;
alter tablespace tbs1 begin backup
*
ERROR at line 1:
ORA-01642: begin backup not needed for read only tablespace 'TBS1'
三、唯讀資料表空間的還原與恢複
還原與恢複唯讀資料表空間的問題在於控制檔案如何控制唯讀資料表空間,分為下列三種情況:
--------- --------------- ---------------- -------------------------------------
case backup 1 crash status recovery
--------- --------------- ---------------- -------------------------------------
case 1 Read-Only Read-Only 將備份的唯讀資料表空間複製到目的地(Restore)
case 2 Read-Only Read-Write 先Restore backup1,後recover(applied log )
case 3 Read-Write Read-only 先Restore backup1,後recover(applied log )
唯讀資料表空間恢複時需要考慮的問題
重建一個控制檔案時
重新命名資料檔案時
使用一個備份的控制檔案時
下面對錶空間tbs1置為唯讀後對比前後產生的重建控制檔案的指令碼
SQL> alter database backup controlfile to trace as '/tmp/rectl1.sql';
SQL> alter tablespace tbs1 read only;
SQL> alter database backup controlfile to trace as '/tmp/rectl2.sql';
SQL> ho diff /tmp/rectl1.sql /tmp/rectl2.sql
69,70c69
< '/u01/app/oracle/oradata/orcl/example01.dbf',
< '/u01/app/oracle/oradata/orcl/tbs01.dbf'
---
> '/u01/app/oracle/oradata/orcl/example01.dbf'
97a97,102
> -- Files in read-only tablespaces are now named.
> ALTER DATABASE RENAME FILE 'MISSING00006'
> TO '/u01/app/oracle/oradata/orcl/tbs01.dbf';
>
> -- Online the files in read-only tablespaces.
> ALTER TABLESPACE "TBS1" ONLINE;
對比兩者
1.使用create controlfile命令時,datafile中未列出唯讀資料表空間的資料檔案
2.成功建立控制檔案並開啟後,使用alter database rename file命令重新命名唯讀資料表空間的資料檔案
3.使用alter tablespace readonly_tablespacename online 將唯讀資料表空間聯機
四、示範唯讀資料表空間變化的恢複過程
1. 示範整個過程為唯讀資料表空間的情況(對應前面描述的case 1)
SQL> create table scott.tb1 tablespace tbs1
2 as select * from scott.emp;
SQL> commit;
SQL> alter tablespace tbs1 read only;
SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ ONLY
SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf
SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');
SQL> update scott.tb1 set sal=sal*1.2 where ename='SCOTT';
SQL> delete from scott.tb1 where ename='SCOTT';
--執行上述三條命令,收到下列同樣的錯誤提示
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
從上面的示範可以看出對唯讀資料表空間內的資料作任何DML操作均不可用
在 Oracle 資料表空間與資料檔案 一文中,可以對唯讀資料表空間作delete操作(版本是10.2.0.1.0),應該是數
據庫補丁的問題, 此版本為10.2.0.4.0。
--使用vim 開啟?/oradata/orcl/tbs01.dbf檔案做任意操作來類比破壞該唯讀資料表空間的資料檔案
--重啟資料庫後收到下面的錯誤提示
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf
SQL> alter database open;
SQL> select count(1) from scott.tb1;
COUNT(1)
----------
16
2. 示範由唯讀變為讀寫後發生損壞且只有唯讀備份的恢複情況(對應前面描述的case 2)
SQL> alter tablespace tbs1 read write;
SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');
SQL> commit;
--使用vim 開啟/u01/app/oracle/oradata/orcl/tbs01.dbf檔案做任意操作來類比破壞該讀寫資料表空間的資料檔案
--重啟資料庫後未收到錯誤提示
SQL> insert into scott.tb1(empno,ename) values(4444,'Jackson');
insert into scott.tb1(empno,ename) values(4444,'Jackson')
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ---------------- ---------- ---------
6 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf
SQL> recover datafile 6;
Media recovery complete.
SQL> alter tablespace tbs1 online;
Tablespace altered.
SQL> select * from scott.tb1 where ename='Thomas';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
3333 Thomas
3. 示範由讀寫資料表空間變為唯讀資料表空間,且僅有讀寫資料表空間備份的恢複(對應前面描述的case 3)
SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ WRITE
SQL> alter tablespace tbs1 begin backup;
SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf
SQL> alter tablespace tbs1 end backup;
SQL> delete from scott.tb1 where empno=3333;
SQL> commit;
SQL> alter tablespace tbs1 read only;
--使用vim 開啟?/oradata/orcl/tbs01.dbf檔案做任意操作來類比破壞該唯讀資料表空間的資料檔案
--重啟資料庫後收到下面的錯誤提示
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf
SQL> recover datafile 6;
SQL> alter database open;
SQL> select * from scott.tb1 where ename='Thomas';
,;
no rows selected
4. 示範資料檔案狀態發生多次變化且在變化時沒有任何備份的恢複處理(實際上使用日誌來重新構造該資料檔案)
SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ WRITE
SQL> drop table scott.tb1;
SQL> commit;
SQL> alter tablespace tbs1 read only;
SQL> alter tablespace tbs1 read write;
SQL> create table scott.tb2 tablespace tbs1 as select * from scott.emp;
SQL> commit;
SQL> alter system checkpoint;
[oracle@oradb orcl]$tail -n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4064.trc:
ORA-01171: datafile 6 going offline due to error advancing checkpoint
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
ORA-01251: Unknown File Header Version read for file number 6
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- --------------- ---------- ---------
6 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> select file#,name,status from v$datafile where file#=6;
FILE# NAME STATUS
---------- --------------------------------------------- -------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf RECOVER
SQL> alter database create datafile 6;
SQL> recover datafile 6;
Media recovery complete.
SQL> alter database datafile 6 online;
SQL> select count(1) from scott.tb2;
COUNT(1)
----------
16
5. 示範刪除唯讀資料表空間上的對象
SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ ONLY
SQL> select segment_name,segment_type,tablespace_name,owner from dba_segments where
2 tablespace_name='TBS1' and segment_name='TB2';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME OWNER
-------------------- ------------------ ------------------------------ ----------
TB2 TABLE TBS1 SCOTT
SQL> drop table scott.tb2;
Table dropped.
五、總結
1. 資料表空間置為唯讀後將減少資料的備份量
2. 資料表空間置為唯讀後,不能對其中的對象執行任何DML操作
3. 唯讀資料表空間內的對象可以被清除,因為drop命令更新了資料字典,而不更新對象本身
4. 當資料表空間的狀態發生變化時,應立即備份該資料表空間,以減少恢複工作
5. 對於狀態多次發生改變且未及時備份的情況,日誌未損壞時,可以使用聯機重做、歸檔日誌來進行恢複
使用下列命令來實現:
刪除受損的資料檔案(rm dbfile.dbf)
重建受損的資料檔案(alter database create datafile n)
進行介質恢複(recover datafile n)
使受損的資料檔案聯機(alter database datafile n online)
6. 示範中多為在mount狀態下來恢複,生產環境中多在open狀態下恢複,可以按下列步驟實現
先將受損的唯讀資料表空間(資料檔案)離線(offline)
使用備份的資料表空間(資料檔案)來還原(restore)
使用歸檔、聯機日誌進行介質恢複(recover)
使恢複成功的資料表空間(資料檔案)聯機(online)
7. 對於原始介質受損,不能恢複到原始位置的情況下,使用下面的命令實現轉移
alter database rename file '<dir1>' to '<dir2>';
oracle視頻教程請關注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html