1. 程式人生 > 其它 >rman只讀表空間的備份和恢復

rman只讀表空間的備份和恢復

目錄

rman只讀表空間備份和恢復

當使用alter tablespace tbs read only時,資料檔案會執行檢查點程序(將所有髒緩衝區的內容寫至磁碟),

當前的SCN號會被標註,同時儲存了SCN的資料檔案頭部被凍結不再變化.控制檔案內也會記錄該資料檔案的凍結資訊。

特點:

1) 減少啟動和關閉時間:當表空間設定為只讀後,在啟動和關閉時就不會對只讀表空間對應的資料檔案進行處理。從而減少了資料庫啟動和關閉的時間。

2) 減少備份恢復時間:備份只讀表空間後,不需要在對其進行備份,減少了備份量

3)不同分割槽表放在不同表空間,歷史的資料做只讀,便於管理

備份只讀表空間

方式:

1)exclude排除不需要備份的表空間(需要手動指定,不方便)

2)skip readonly跳過只讀表空間(自動跳過)

exclude方式

1建立測試的只讀表空間test01

create tablespace TEST1 datafile '/u01/app/oracle/oradata/ORCL/test1.dbf' size 10m;

create table t1(a int) tablespace test1;
insert into t1 select rownum from dual connect by rownum<=10;

alter tablespace test1 read only; 

SQL> select tablespace_name,contents,status from dba_tablespaces;

TABLESPACE_NAME                CONTENTS              STATUS
------------------------------ --------------------- ---------
SYSTEM                         PERMANENT             ONLINE
SYSAUX                         PERMANENT             ONLINE
UNDOTBS1                       UNDO                  ONLINE
TEMP                           TEMPORARY             ONLINE
USERS                          PERMANENT             ONLINE
TEST1                          PERMANENT             READ ONLY

2.備份只讀表空間

backup tablespace test1 format '/tmp/test/%d_test1_%s.bk';

RMAN> list backup of database;


備份集列表
===================


BS 關鍵字  型別 LV 大小       裝置型別 經過時間 完成時間
------- ---- -- ---------- ----------- ------------ ----------
60      Full    1.12M      DISK        00:00:00     14-5月 -22
        BP 關鍵字: 60   狀態: AVAILABLE  已壓縮: NO  標記: TAG20220514T103917
段名:/tmp/test/ORCL_test1_80.bk
  備份集 60 中的資料檔案列表
  File LV Type Ckp SCN    Ckp 時間 Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- ---------- ----------- ------ ----
  15      Full 4202861    14-5月 -22              NO    /u01/app/oracle/oradata/ORCL/test1.dbf

3.備份時排除只讀表空間

run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
configure exclude for tablespace test1;
backup as compressed backupset incremental level 0 database format '/tmp/test/%d_%s.bk';
configure exclude for tablespace test1 clear;
backup current controlfile format '/tmp/test/control_%s.bk';
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup archivelog all delete input format '/tmp/test/arch_%s';
release channel ch1;
release channel ch2;
}

skip readonly方式

backup tablespace test1 format '/tmp/test/%d_test1_%s.bk';

備份只讀表空間之後

run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup as compressed backupset incremental level 0 database format '/tmp/test/%d_%s.bk' include current controlfile skip readonly;
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup archivelog all delete input format '/tmp/test/arch_%s';
release channel ch1;
release channel ch2;
}

恢復只讀表空間

分三種情況:

  1. 備份是read only狀態,被破壞時是時read only(只需要recover)
  2. 備份是read only狀態,被破壞時是時read write
  3. 備份是read write狀態,被破壞時是時read only

備份是read only狀態,被破壞時是時read only

只需要resotore即可

--先備份
backup tablespace test1 format '/tmp/test/test1_%s.bk';

--檢視對應的檢查點資訊
SQL> select name,checkpoint_change# from v$datafile;
......
NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4307981
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4307981
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4307981
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4307981
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4202861


--生成一個完全檢查點,強行寫髒塊更新資料檔案和控制檔案的檢查點
SQL> alter system checkpoint;

--檢視對比檢查點變化情況,只讀表空間檢查點鎖死不變
--同時也側面證明了cdb的系統操作不會作用pdb的資料檔案
SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4308474
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4308474
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4308474
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4308474
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4202861

--刪除,模擬破壞資料檔案,
rm -f /u01/app/oracle/oradata/ORCL/test1.dbf
SQL> alter system flush buffer_cache;

--資料檔案15號不見了
資料檔案 15: '/u01/app/oracle/oradata/ORCL/test1.dbf'

--rman恢復

run{
sql'alter database datafile 15 offline';
restore datafile 15;
sql'alter database datafile 15 online';
}

備份是read only狀態,被破壞時是時read write

--備份
backup tablespace test1 format '/tmp/test/test1_%s.bk';


--轉化為read write
SQL> alter tablespace test1 read write;
SQL> select tablespace_name,contents,status from dba_tablespaces;

TABLESPACE_NAME                CONTENTS              STATUS
------------------------------ --------------------- ---------
SYSTEM                         PERMANENT             ONLINE
SYSAUX                         PERMANENT             ONLINE
UNDOTBS1                       UNDO                  ONLINE
TEMP                           TEMPORARY             ONLINE
USERS                          PERMANENT             ONLINE
TEST1                          PERMANENT             ONLINE

SQL> col table_name for a30;
SQL> select table_name,tablespace_name from user_tables where table_name='T1';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T1                             TEST1


--修改表,同時檢查點號改變
SQL> insert into t1 select * from t1;
SQL> commit;
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> select count(*) from t1;

  COUNT(*)
----------
        20


--刪除,模擬破壞資料檔案,
rm -f /u01/app/oracle/oradata/ORCL/test1.dbf
SQL> alter system flush buffer_cache;



--rman恢復,可以從告警日誌中檢視詳細動作,利用歸檔或者沒有日誌切換就使用redo進行了進行恢復
run{
sql'alter database datafile 15 offline';
restore datafile 15;
recover datafile 15;
sql'alter database datafile 15 online';
}

備份是read write狀態,被破壞時是時read only

SQL> select tablespace_name,contents,status from dba_tablespaces;

TABLESPACE_NAME                CONTENTS              STATUS
------------------------------ --------------------- ---------
SYSTEM                         PERMANENT             ONLINE
SYSAUX                         PERMANENT             ONLINE
UNDOTBS1                       UNDO                  ONLINE
TEMP                           TEMPORARY             ONLINE
USERS                          PERMANENT             ONLINE
TEST1                          PERMANENT             ONLINE

--先做備份
backup tablespace test1 format '/tmp/test/test1_%s.bk';

RMAN> list backup of tablespace test1;


備份集列表
===================


BS 關鍵字  型別 LV 大小       裝置型別 經過時間 完成時間
------- ---- -- ---------- ----------- ------------ ----------
117     Full    1.12M      DISK        00:00:00     15-5月 -22
        BP 關鍵字: 117   狀態: AVAILABLE  已壓縮: NO  標記: TAG20220515T110328
段名:/tmp/test/test1_139.bk
  備份集 117 中的資料檔案列表
  File LV Type Ckp SCN    Ckp 時間 Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- ---------- ----------- ------ ----
  15      Full 4833216    15-5月 -22              NO    /u01/app/oracle/oradata/ORCL/test1.dbf



SQL> insert into t1 select * from t1;
SQL> commit;
SQL> select count(*) from t1;

  COUNT(*)
----------
     40960

--變為read only狀態,注意檢查點
SQL> select name,checkpoint_change# from v$datafile;
NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4829465
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4829465
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4829465
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4829465
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4833216

SQL> alter tablespace test1 read only;

SQL> select name,checkpoint_change# from v$datafile;
NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4829465
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4829465
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4829465
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4829465
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4833415


--生成完全檢查點
SQL> alter system checkpoint;
SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4833517
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4833517
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4833517
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4833517
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4833415

--現在是read only
SQL> select tablespace_name,contents,status from dba_tablespaces;

TABLESPACE_NAME                CONTENTS              STATUS
------------------------------ --------------------- ---------
SYSTEM                         PERMANENT             ONLINE
SYSAUX                         PERMANENT             ONLINE
UNDOTBS1                       UNDO                  ONLINE
TEMP                           TEMPORARY             ONLINE
USERS                          PERMANENT             ONLINE
TEST1                          PERMANENT             READ ONLY
SQL> select count(*) from t1;

  COUNT(*)
----------
     40960



--刪除,模擬破壞資料檔案,
rm -f /u01/app/oracle/oradata/ORCL/test1.dbf
SQL> alter system flush buffer_cache;


SQL> select count(*) from t1;

  COUNT(*)
----------
     40960

SQL> insert into t1 select * from t1;
insert into t1 select * from t1
*
第 1 行出現錯誤:
ORA-00372: 此時無法修改檔案 15
ORA-01110: 資料檔案 15: '/u01/app/oracle/oradata/ORCL/test1.dbf'


--rman恢復
run{
sql'alter database datafile 15 offline';
restore datafile 15;
recover datafile 15;
sql'alter database datafile 15 online';
}

--對比檢查點,沒有變化
SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/u01/app/oracle/oradata/ORCL/system01.dbf                     4833517
/u01/app/oracle/oradata/ORCL/sysaux01.dbf                     4833517
/u01/app/oracle/oradata/ORCL/undotbs01.dbf                    4833517
/u01/app/oracle/oradata/ORCL/pdbseed/system01.dbf             2159413
/u01/app/oracle/oradata/ORCL/pdbseed/sysaux01.dbf             2159413
/u01/app/oracle/oradata/ORCL/users01.dbf                      4833517
/u01/app/oracle/oradata/ORCL/pdbseed/undotbs01.dbf            2159413
/u01/app/oracle/oradata/ORCL/orclpdb/system01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/sysaux01.dbf             3272499
/u01/app/oracle/oradata/ORCL/orclpdb/undotbs01.dbf            3272499
/u01/app/oracle/oradata/ORCL/orclpdb/users01.dbf              3272499
/u01/app/oracle/oradata/ORCL/test1.dbf                        4833415