控制檔案恢復測試
控制檔案恢復測試
參考:
http://blog.chinaunix.net/uid-17143914-id-2824664.html
http://blog.itpub.net/30162081/viewspace-1678479/
測試環境:
SQL> conn / as sysdba
SQL> show parameter control
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string /oracle/app/oracle/oradata/orcl/control01.ctl, /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl
control_management_pack_access string DIAGNOSTIC+TUNING
SQL> show parameter pfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /oracle/app/oracle/product/11.2.0/dbs/spfileorcl.ora
控制檔案損壞:
控制檔案(control file)是一個相當小的檔案(最多能增長到64M左右),其中包含Oracle需要的其他檔案的一個目錄。引數檔案告知例項控制檔案的位置,控制檔案則告知示例資料庫和線上重做日誌檔案的位置。控制檔案還告知了Oracle其他一些事情,如已發生檢查點的有關資訊、資料庫名(必須和db_name引數匹配)、建立資料庫的時間戳、歸檔重做日誌的歷史(有時這會讓控制檔案變大)、RMAN資訊等。
控制檔案應該透過硬體(RAID)多路儲存,如果不支援映象,則要透過Oracle多路儲存。應該有不止一個副本,而且它們應該儲存在不同的磁碟上,以防止萬一出現磁碟故障而丟失控制檔案。丟失控制檔案並不是致命的,但是會使恢復變得困難很多。
可以透過查詢資料庫的日誌檔案來定位損壞了的控制檔案。
本文如下3部分;
一、損壞單個控制檔案:
二、損壞所有的控制檔案:
三、控制檔案完全丟失,重新建立;
一、損壞單個控制檔案:
1. 確保資料庫已經關閉:shutdown immediate; 或shutdown abort
2. 檢視初始化檔案$ORACLE_BASE/admin/pfile/initORCL.ora,或檢視alert日誌確定所有控制檔案的路徑。
3. 用作業系統命令將其它正確的控制檔案覆蓋錯誤的控制檔案。
4. 重新啟動資料庫:startup;
5. 檢查日誌有無報錯,資料庫操作有無異常;
二、損壞所有的控制檔案:
1. 確保資料庫已經關閉,
2. 從相應的備份結果集中恢復最近的控制檔案;
restore controlfile from '/backup/c-1368494897-20160407-00';
3. 用下面的命令來建立產生資料庫控制檔案的指令碼:
startup mount;
alter database backup controlfile to trace;
具體trace檔案目錄可見alert日誌;
也可透過語句查詢:
select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));
4. 修改第三步產生的trace檔案,將其中關於建立控制檔案的一部分語句複製出來並做些修改,使得它能夠體現最新的資料庫結構。將產生的sql檔名字為createcontrol.sql.
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/oracle/app/oracle/oradata/orcl/redo01.log',
'/oracle/app/oracle/oradata/orcl/redo11.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 2 (
'/oracle/app/oracle/oradata/orcl/redo21.log',
'/oracle/app/oracle/oradata/orcl/redo02.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 3 (
'/oracle/app/oracle/oradata/orcl/redo03.log',
'/oracle/app/oracle/oradata/orcl/redo31.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 4 (
'/oracle/app/oracle/oradata/orcl/redo4_1.log',
'/oracle/app/oracle/oradata/orcl/redo4_2.log'
) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/app/oracle/oradata/orcl/system01.dbf',
'/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
'/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
'/oracle/app/oracle/oradata/orcl/users01.dbf',
'/oracle/app/oracle/oradata/orcl/tb01.dbf',
'/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
'/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET ZHS16GBK
;
-- Configure RMAN configuration record 1
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','ON');
-- Configure RMAN configuration record 2
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE','DISK TO ''/backup/%F''');
-- Configure RMAN configuration record 3
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('RETENTION POLICY','TO REDUNDANCY 2');
-- Configure RMAN configuration record 4
VARIABLE RECNO NUMBER;
EXECUTE :RECNO := SYS.DBMS_BACKUP_RESTORE.SETCONFIG('CHANNEL','DEVICE TYPE DISK FORMAT ''/backup/%U''');
5. 用下面命令重新建立控制檔案:
shutdown abort;
startup nomount;
@createcontrol.sql;
根據實際情況將歸檔日誌註冊到資料庫上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;
如不新增臨時空間檔案,則在dba_temp_files看不到該臨時檔案;
NORESETLOGS VS RESETLOGS
從trace檔案可以看出,提供了兩個建立控制檔案的指令碼,分別針對兩種不同的應用場景:NORESETLOGS適用於當前redo log可用,而RESETLOGS適用於當前redo log不可用。
NORESETLOGS重建步驟
1.執行指令碼,重建控制檔案(CREATE CONTROLFILE REUSE DATABASE "HOEGH" NORESETLOGS NOARCHIVELOG......)
2.執行介質恢復RECOVER DATABASE
3.開啟資料庫ALTER DATABASE OPEN;
4.新增臨時表空間
RESETLOGS重建步驟
1.執行指令碼,重建控制檔案(CREATE CONTROLFILE REUSE DATABASE "HOEGH" RESETLOGS NOARCHIVELOG......)
2.執行介質恢復RECOVER DATABASE USING BACKUP CONTROLFILE
3.開啟資料庫ALTER DATABASE OPEN RESETLOGS;
4.新增臨時表空間
6. 用適當的方法進行資料庫全備份。
三、控制檔案完全丟失,重新建立;
如果丟失了所有的控制檔案並且沒有任何的備份,我們可以透過重建控制檔案來開啟資料庫。其中,重建控制檔案至少需要以下資訊:
1.資料庫名
2.字符集
3.資料檔名稱
4.初始化引數,包括MAXLOGFILES、MAXLOGMEMBERS、MAXDATAFILES、MAXINSTANCES、MAXLOGHISTORY等;
1、啟動資料庫,根據引數檔案找到控制檔案,rm刪除掉;
rm /oracle/app/oracle/oradata/orcl/control01.ctl
rm /oracle/app/oracle/fast_recovery_area/orcl/control02.ctl
2、強制關閉資料庫,然後重啟資料庫,報ORA-00205錯誤。需要注意的是,此時執行shutdown immediate命令,資料庫無法正常關閉,只能關閉到mounted狀態;需要使用shutdown abort命令強制關閉資料庫。
3、獲取資料庫名
資料庫啟動報錯,但可檢視引數;
idle> show parameter db_name
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_name string orcl
idle>
4、啟動到nomount狀態,獲取字符集
idle> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII
5、獲取資料檔名稱
透過ls命令獲取資料檔案列表。
查詢各redo檔案列表
6、生成建立控制檔案指令碼
這樣,建立控制檔案所需的基本資訊都已經有了,我們來生成建立控制檔案指令碼。
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'/oracle/app/oracle/oradata/orcl/redo01.log',
'/oracle/app/oracle/oradata/orcl/redo11.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 2 (
'/oracle/app/oracle/oradata/orcl/redo21.log',
'/oracle/app/oracle/oradata/orcl/redo02.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 3 (
'/oracle/app/oracle/oradata/orcl/redo03.log',
'/oracle/app/oracle/oradata/orcl/redo31.log'
) SIZE 50M BLOCKSIZE 512,
GROUP 4 (
'/oracle/app/oracle/oradata/orcl/redo4_1.log',
'/oracle/app/oracle/oradata/orcl/redo4_2.log'
) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/app/oracle/oradata/orcl/system01.dbf',
'/oracle/app/oracle/oradata/orcl/sysaux01.dbf',
'/oracle/app/oracle/oradata/orcl/undotbs01.dbf',
'/oracle/app/oracle/oradata/orcl/users01.dbf',
'/oracle/app/oracle/oradata/orcl/tb01.dbf',
'/oracle/app/oracle/oradata/orcl/tbsalert01.dbf',
'/oracle/app/oracle/oradata/orcl/streams01.dbf'
CHARACTER SET US7ASCII
;
7、重建控制檔案
將資料庫啟動到nomount狀態下;
執行上述建立控制檔案指令碼後,資料庫狀態為mount狀態;
根據實際情況將歸檔日誌註冊到資料庫上;
-- ALTER DATABASE REGISTER LOGFILE '/oracle/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_1_%u_.arc';
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
RECOVER DATABASE
-- All logs need archiving and a log switch is needed.
ALTER SYSTEM ARCHIVE LOG ALL;
-- Database can now be opened normally.
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp01.dbf' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/app/oracle/oradata/orcl/temp02.dbf' REUSE;
如不新增臨時空間檔案,則在dba_temp_files看不到該臨時檔案;
8、總結
下面總結一下重建控制檔案的步驟:
1.獲取資料庫名;
2.獲取字符集名;
3.獲取資料檔名和redo檔名,temp檔名;
4.重建控制檔案;
5.執行介質恢復;
6.開啟資料庫,新增臨時檔案。
附錄:
當前資料庫字符集為ZHS16GBK,但在刪除控制檔案後,查詢字符集卻為US7ASCII,該字符集為ZHS16GBK子集;
idle> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------------------------------
AMERICAN_AMERICA.US7ASCII
控制檔案建立後,將資料庫open,在alert日誌中會提示資料庫字符集自動轉換。如下:
*********************************************************************
Updating character set in controlfile to ZHS16GBK
No Resource Manager plan active
**********************************************************
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2077505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- rman恢復控制檔案測試--log
- 測試恢復5==使用2進位制形式檔案恢復控制檔案
- 【管理篇備份恢復】rman恢復測試(二) 控制檔案恢復(三)
- 【管理篇備份恢復】rman恢復測試(二) 控制檔案恢復(二)
- 【管理篇備份恢復】rman恢復測試(二) 控制檔案恢復(一)
- 恢復測試:擁有當時的全部歸檔,控制檔案,恢復丟失的資料檔案。
- 控制檔案恢復—從trace檔案中恢復
- dbms_backup_restore包恢復控制檔案,資料檔案,歸檔檔案的測試案例REST
- RMAN恢復控制檔案
- 手工恢復控制檔案
- rman備份恢復-rman恢復資料檔案測試
- 控制檔案恢復—從快照中恢復
- RMAN備份與恢復(新舊控制檔案及歸檔日誌)測試
- rman恢復--丟失控制檔案的恢復
- 【備份恢復】利用 備份控制檔案到指定目錄下的控制檔案 恢復控制檔案
- cp方式恢復控制檔案
- 控制檔案丟失恢復
- 【控制檔案丟失恢復】
- 使用rman恢復控制檔案
- RMAN備份與恢復(新舊控制檔案及歸檔日誌)測試(敘)
- 控制檔案丟失恢復(二)
- 恢復丟失的控制檔案
- 控制檔案的恢復方法(一)
- 控制檔案的恢復方法(二)
- 控制檔案的恢復方法(三)
- 控制檔案的恢復方法(四)
- 控制檔案全部丟失恢復
- RMAN恢復案例:無恢復目錄,丟失全部資料檔案、控制檔案、日誌檔案恢復
- 【備份與恢復】控制檔案的恢復(不完全恢復)
- 使用舊的控制檔案備份來恢復控制檔案
- RMAN備份恢復之控制檔案的恢復(三)
- RMAN備份恢復之控制檔案的恢復(二)
- RMAN備份恢復之控制檔案的恢復(一)
- 恢復案例:無歸檔,丟失全部控制檔案、日誌檔案恢復案例
- 恢復案例:無歸檔,掉電,控制檔案全部丟失恢復
- 與控制檔案有關的恢復
- 【備份恢復】 控制檔案多路徑
- RMAN - "丟失控制檔案的恢復"