本節介紹創建控制文件的方式,並包含以下主題:
- 創建初始控制文件
- 創建更多副本,重命名和重新放置控制文件
- 創建新的控制文件
創建初始控制文件
當發出CREATE DATABASE語句時,會創建Oracle數據庫的初始控制文件。控制文件的名稱由數據庫創建期間使用的初始化參數文件中的CONTROL_FILES參數指定。在CONTROL_FILES中指定的文件名應該完全指定,並且是操作系統特定的。以下是CONTROL_FILES初始化參數的示例:
CONTROL_FILES = (/u01/oracle/prod/control01.ctl, /u02/oracle/prod/control02.ctl, /u03/oracle/prod/control03.ctl)
如果具有指定名稱的文件當前在數據庫創建時存在,則必須在CREATE DATABASE語句中指定CONTROLFILE REUSE子句,否則會發生錯誤。另外,如果舊控制文件的大小不同於新控制文件的大小參數,則不能使用REUSE子句。
控制文件的大小在Oracle數據庫的某些版本之間變化,以及控制文件中指定的文件數量發生變化時。諸如MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY,MAXDATAFILES和MAXINSTANCES等配置參數會影響控制文件的大小。
隨后可以更改CONTROL_FILES初始化參數的值以添加更多控制文件或更改現有控制文件的名稱或位置。
您的操作系統特定的Oracle文檔包含有關指定控制文件的更多信息。
創建更多副本,重命名和重新放置控制文件
您可以通過將現有控制文件復制到新位置並將文件名添加到控制文件列表來創建用於復用的附加控制文件副本。同樣,您可以通過將文件復制到其新名稱或位置並更改控制文件列表中的文件名來重命名現有控制文件。在這兩種情況下,為了確保控制文件在過程中不發生變化,請在復制控制文件之前關閉數據庫。
添加當前控制文件的復用副本或重命名控制文件:
- 關閉數據庫
- 使用操作系統命令將現有控制文件復制到新位置
- 編輯數據庫初始化參數文件中的CONTROL_FILES參數以添加新的控制文件名稱,或者更改現有的控制文件名
- 重新啟動數據庫
創建新的控制文件
本節討論何時以及如何創建新的控制文件。
何時創建新的控制文件
在以下情況下,您需要創建新的控制文件:
- 數據庫的所有控制文件已被永久損壞,並且沒有控制文件備份。
- 您想要更改數據庫名稱。
例如,如果數據庫名稱與分布式環境中的另一個數據庫名稱沖突,則可以更改它。您可以使用DBNEWID實用程序更改數據庫名稱和DBID(內部數據庫標識符)。有關使用此實用程序的信息,請參閱Oracle數據庫實用程序
- 兼容級別設置為早於10.2.0的值,並且您必須更改與CREATE DATABASE或CREATE CONTROLFILE命令中的以下任何參數相關的數據庫配置區域:MAXLOGFILES,MAXLOGMEMBERS,MAXLOGHISTORY ,和MAXINSTANCES。如果兼容性是10.2.0或更高版本,則在進行此類更改時不必創建新的控制文件;如有必要,控制文件會自動擴展以適應新的配置信息。
例如,假設您在創建數據庫或重新創建控制文件時,將MAXLOGFILES設置為3.假設您現在想要使用ALTER DATABASE命令向數據庫添加第四個重做日志文件組。如果兼容性設置為10.2.0或更高版本,則可以這樣做,並且控制文件會自動擴展以適應新的日志文件信息。但是,如果兼容性設置早於10.2.0,那么ALTER DATABASE命令會生成一個錯誤,您必須先創建新的控制文件。
有關兼容級別的信息,請參閱“關於兼容初始化參數”。
CREATE CONTROLFILE語句
您可以使用CREATE CONTROLFILE語句為數據庫創建新的控制文件。以下語句為prod數據庫(以前使用其他數據庫名稱的數據庫)創建一個新的控制文件:
CREATE CONTROLFILE SET DATABASE prod LOGFILE GROUP 1 ('/u01/oracle/prod/redo01_01.log', '/u01/oracle/prod/redo01_02.log'), GROUP 2 ('/u01/oracle/prod/redo02_01.log', '/u01/oracle/prod/redo02_02.log'), GROUP 3 ('/u01/oracle/prod/redo03_01.log', '/u01/oracle/prod/redo03_02.log') RESETLOGS DATAFILE '/u01/oracle/prod/system01.dbf' SIZE 3M, '/u01/oracle/prod/rbs01.dbs' SIZE 5M, '/u01/oracle/prod/users01.dbs' SIZE 5M, '/u01/oracle/prod/temp01.dbs' SIZE 5M MAXLOGFILES 50 MAXLOGMEMBERS 3 MAXLOGHISTORY 400 MAXDATAFILES 200 MAXINSTANCES 6 ARCHIVELOG;
- CREATE CONTROLFILE語句可能會損壞指定的數據文件和重做日志文件。省略文件名可能會導致該文件中的數據丟失或無法訪問整個數據庫。發出此聲明時請小心,並務必按照“創建新控制文件的步驟”中的說明進行操作。
- 如果數據庫在創建新控制文件之前已啟用強制日志記錄,並且希望它繼續啟用,則必須在CREATE CONTROLFILE語句中指定FORCE LOGGING子句。請參閱“指定FORCE LOGGING模式”。
Oracle數據庫SQL語言參考描述了CREATE CONTROLFILE語句的完整語法
創建新控制文件的步驟
完成以下步驟來創建一個新的控制文件
- 列出數據庫的所有數據文件和重做日志文件。
如果按照“備份控制文件”中所述遵循控制文件備份的建議,則您將擁有反映數據庫當前結構的數據文件和重做日志文件的列表。但是,如果您沒有這樣的列表,執行以下語句將生成一個。
SELECT MEMBER FROM V$LOGFILE; SELECT NAME FROM V$DATAFILE; SELECT VALUE FROM V$PARAMETER WHERE NAME = 'control_files';
如果您沒有這樣的列表,並且控制文件已損壞,導致數據庫無法打開,請嘗試查找構成數據庫的所有數據文件和重做日志文件。一旦創建新的控制文件,任何未在步驟5中指定的文件都無法恢復。此外,如果您省略組成SYSTEM表空間的任何文件,則可能無法恢復數據庫。
- 關閉數據庫
如果數據庫已打開,請盡可能正常關閉數據庫。僅使用IMMEDIATE或ABORT子句作為最后的手段。 - 備份數據庫的所有數據文件和重做日志文件
- 啟動一個新實例,但不安裝或打開數據庫:
STARTUP NOMOUNT
- 使用CREATE CONTROLFILE語句為數據庫創建一個新的控制文件。
創建新的控制文件時,如果除了控制文件以外,還丟失了任何重做日志組,請指定RESETLOGS子句。在這種情況下,您需要從丟失重做日志中恢復(步驟8)。如果您已重命名數據庫,則必須指定RESETLOGS子句。否則,請選擇NORESETLOGS子句。 - 將新控制文件的備份存儲在脫機存儲設備上。有關創建備份的說明,請參閱“備份控制文件”。
- 編輯數據庫的CONTROL_FILES初始化參數,以指示所有控制文件現在是步驟5中創建的數據庫的一部分(不包括備份控制文件)。如果要重命名數據庫,請編輯實例參數文件中的DB_NAME參數以指定新名稱。
- 如有必要恢復數據庫。如果您沒有恢復數據庫,請跳至步驟9。
如果您要創建控制文件作為恢復的一部分,請恢復數據庫。如果新控制文件是使用NORESETLOGS子句(步驟5)創建的,則可以通過完全關閉的數據庫恢復來恢復數據庫。
如果新控制文件是使用RESETLOGS子句創建的,則必須指定USING BACKUP CONTROL FILE。如果您丟失了聯機或歸檔重做日志或數據文件,請使用恢復這些文件的過程。
Oracle數據庫備份和恢復用戶指南“,獲取有關恢復數據庫的信息以及恢復丟失的控制文件的方法
使用以下方法之一打開數據庫:
- 如果您沒有執行恢復,或者您在步驟8中執行了完整的關閉數據庫恢復,請正常打開數據庫。
ALTER DATABASE OPEN;
- 如果您在創建控制文件時指定了RESETLOGS,請使用ALTER DATABASE語句指示RESETLOGS。
ALTER DATABASE OPEN RESETLOGS;
數據庫現在已打開並可供使用。
參考資料
https://docs.oracle.com/cd/E11882_01/server.112/e25494/control.htm#ADMIN10064