RMAN實戰8:控制檔案和資料檔案SCN、v$datafile_header檢視用途
阿新 • • 發佈:2019-02-20
前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>