1. 程式人生 > >RMAN實戰8:控制檔案和資料檔案SCN、v$datafile_header檢視用途

RMAN實戰8:控制檔案和資料檔案SCN、v$datafile_header檢視用途

前6篇都是講的RMAN的一些基礎理論和備份的東西,從今天開始進入恢復演練,恢復生產資料庫是每個DBA都不願意看到,但必須去面對。平時還要做好應急情況的預演練。

ORACLE啟動時資料文科和控制檔案的SCN對比

ORACLE進行正常關閉的時候,會把記憶體中的髒資料都寫入磁碟,使用當前的SCN標記每個資料標頭檔案和控制檔案。啟動資料庫的時候比較資料檔案和控制檔案中的SCN如果相等就正常啟動,如果控制檔案SCN大於資料檔案SCN說明需要恢復,小於則說明控制檔案是舊的資料檔案。

通過下面的sql來比較二者的SCN,分別看下可插拔資料庫12C中的和10G的:

即使正常請情況下12C中的每個資料檔案的SCN不一定全一樣,二十每個容器的資料檔案SCN一致:

--SQL語句如下:
SET LINES 182
COL name FORM a80
COL status FORM A8
COL file# FORM 9999
COL con_id FORM 9999
COL control_file_SCN FORM 999999999999999
COL datafile_SCN FORM 999999999999999
--
SELECT
a.name
,a.status
,a.file#
,a.con_id
,a.checkpoint_change# control_file_SCN
,b.checkpoint_change# datafile_SCN
,CASE
WHEN ((a.checkpoint_change# - b.checkpoint_change#) = 0) THEN 'Startup Normal' WHEN ((b.checkpoint_change#) = 0) THEN 'File Missing?' WHEN ((a.checkpoint_change# - b.checkpoint_change#) > 0) THEN 'Media Rec. Req.' WHEN ((a.checkpoint_change# - b.checkpoint_change#) < 0) THEN 'Old Control File' ELSE
'what the ?' END datafile_status FROM v$datafile a -- control file SCN for datafile ,v$datafile_header b -- datafile header SCN WHERE a.file# = b.file# ORDER BY a.con_id,a.file#;
--執行結果如下: sys@CYANG> SET LINES 182 sys@CYANG> COL name FORM a70 sys@CYANG> COL status FORM A8 sys@CYANG> COL file# FORM 9999 sys@CYANG> COL con_id FORM 9999 sys@CYANG> COL control_file_SCN FORM 999999999999999 sys@CYANG> COL datafile_SCN FORM 999999999999999 sys@CYANG> col name form a66 sys@CYANG> / NAME STATUS FILE# CON_ID CONTROL_FILE_SCN DATAFILE_SCN DATAFILE_STATUS ------------------------------------------------------------------ -------- ----- ------ ---------------- ---------------- ---------------- C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSTEM_BYCLTN26_.DBF SYSTEM 1 1 4098689 4098689 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSAUX_BYCLRWV7_.DBF ONLINE 3 1 4098689 4098689 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_UNDOTBS1_BYCLWPHZ_.DBF ONLINE 5 1 4098689 4098689 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_USERS_BYCLWOB1_.DBF ONLINE 6 1 4098689 4098689 Startup Normal C:\APP\ORACLE\RECCATLODDIR\RECCAT01.DBF ONLINE 11 1 4098689 4098689 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSTEM_BYCM0ZWL_.DBF SYSTEM 2 2 2453693 2453693 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSAUX_BYCM0ZW8_.DBF ONLINE 4 2 2453693 2453693 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSTEM_BYCMNHWC_.DBF SYSTEM 7 3 3868150 3868150 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_SYSAUX_BYCMNHW0_.DBF ONLINE 8 3 3868150 3868150 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_USERS_BYCMNHWP_.DBF ONLINE 9 3 3868150 3868150 Startup Normal C:\APP\ORACLE\ORADATA\CYANG\DATAFILE\O1_MF_EXAMPLE_BYCMNHVM_.DBF ONLINE 10 3 3868150 3868150 Startup Normal 已選擇 11 行。

而在不是可插拔結構的資料庫中,正常情況下SCN都是一致的,如10G中的:

--sql語句如下:
SET LINES 188
COL name FORM a50
COL status FORM A8
COL file# FORM 9999
COL con_id FORM 9999
COL control_file_SCN FORM 999999999999999
COL datafile_SCN FORM 999999999999999
--
SELECT
a.name
,a.status
,a.file#
,a.checkpoint_change# control_file_SCN
,b.checkpoint_change# datafile_SCN
,CASE
WHEN ((a.checkpoint_change# - b.checkpoint_change#) = 0) THEN 'Startup Normal'
WHEN ((b.checkpoint_change#) = 0) THEN 'File Missing?'
WHEN ((a.checkpoint_change# - b.checkpoint_change#) > 0) THEN 'Media Rec. Req.'
WHEN ((a.checkpoint_change# - b.checkpoint_change#) < 0) THEN 'Old Control File'
ELSE 'what the ?'
END datafile_status
FROM v$datafile a -- control file SCN for datafile
,v$datafile_header b -- datafile header SCN
WHERE a.file# = b.file#
ORDER BY a.file#;
--結果如下
sys@ALMTEST> /

NAME                                               STATUS   FILE# CONTROL_FILE_SCN     DATAFILE_SCN DATAFILE_STATUS
-------------------------------------------------- -------- ----- ---------------- ---------------- ----------------
/almtest/oracle/oradata/almtest/system01.dbf       SYSTEM       1    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/undotbs01.dbf      ONLINE       2    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/sysaux01.dbf       ONLINE       3    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/users01.dbf        ONLINE       4    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/alm01.dbf          ONLINE       5    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/alm02.dbf          ONLINE       6    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/alm03.dbf          ONLINE       7    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/reccat01.dbf       ONLINE       8    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/users02.dbf        ONLINE      10    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/EAM.dbf            ONLINE      11    9476193352337    9476193352337 Startup Normal
/almtest/oracle/oradata/almtest/ARCH.dbf           ONLINE      12    9476193352337    9476193352337 Startup Normal

11 rows selected.

在v$datafile_header 動態檢視中確認是否需要恢復

用下面這個sql來確認,error和recover 列中都能報告問題,如recover中的值為yesl和null值說明出現問題:

select  file#,status,error,recover from v$datafile_header;
--12C 中根容器下執行下,發現只有根容器的幾個資料檔案不需要恢復。種子容器的可以忽略,pdb中的資料檔案也為nll,推斷是pdb沒有啟動
sys@CYANG> select  con_id,file#,status,error,recover from v$datafile_header order by con_id;

CON_ID FILE# STATUS   ERROR                                                             REC
------ ----- -------- ----------------------------------------------------------------- ---
     1     1 ONLINE                                                                     NO
     1     6 ONLINE                                                                     NO
     1    11 ONLINE                                                                     NO
     1     5 ONLINE                                                                     NO
     1     3 ONLINE                                                                     NO
     2     4 ONLINE
     2     2 ONLINE
     3    10 ONLINE
     3     7 ONLINE
     3     9 ONLINE
     3     8 ONLINE

已選擇 11 行。


--連線pdb,並啟動
sys@CYANG> conn sys/******@localhost:1521/pyang1 as sysdba
已連線。
idle>  select  con_id,file#,status,error,recover from v$datafile_header order by con_id;

    CON_ID      FILE# STATUS  ERROR                                                             REC
---------- ---------- ------- ----------------------------------------------------------------- ---
         0          5 ONLINE                                                                    NO
         3         10 ONLINE
         3          9 ONLINE
         3          7 ONLINE
         3          8 ONLINE
--啟動,再查下發現沒有需要恢復的了
idle> startup
插接式資料庫已開啟。
idle> /

    CON_ID      FILE# STATUS  ERROR                                                             REC
---------- ---------- ------- ----------------------------------------------------------------- ---
         0          5 ONLINE                                                                    NO
         3         10 ONLINE                                                                    NO
         3          9 ONLINE                                                                    NO
         3          7 ONLINE                                                                    NO
         3          8 ONLINE                                                                    NO

--重新連線cdb,再查下發現除了種子資料庫的兩個資料檔案,其他的都沒有需要恢復的了。
idle> conn sys/**** as sysdba
已連線。
sys@CYANG> show con_id

CON_ID
------------------------------
1
sys@CYANG>  select  con_id,file#,status,error,recover from v$datafile_header order by con_id;

    CON_ID      FILE# STATUS  ERROR                                                             REC
---------- ---------- ------- ----------------------------------------------------------------- ---
         1          1 ONLINE                                                                    NO
         1          6 ONLINE                                                                    NO
         1         11 ONLINE                                                                    NO
         1          5 ONLINE                                                                    NO
         1          3 ONLINE                                                                    NO
         2          4 ONLINE
         2          2 ONLINE
         3         10 ONLINE                                                                    NO
         3          7 ONLINE                                                                    NO
         3          9 ONLINE                                                                    NO
         3          8 ONLINE                                                                    NO

已選擇 11 行。

sys@CYANG>