控制檔案是一個二進位檔案,在資料庫建立時自動建立,用於記錄資料庫名稱、建立時間、資料表空間名、資料檔案和記錄檔位置等等。控制檔案對於資料庫非常重要,一旦受損,那麼資料庫將無法正常工作。
一、建立控制檔案
因為某些原因可能需要重建控制檔案,例如,控制檔案中的參數設定不合理等等,建立控制檔案的文法:
CREATE CONTROLFILE
REUSE DATABASE "database_name"
[NORESETLOGS | RESETLOGS] //不清空日誌,清空日誌
[NOARCHIVELOG] //非歸檔
MAXLOGFILES integer //最大記錄檔個數
MAXLOGMEMBERS integer //日誌組中最大成員人數
MAXDATAFILES integer //最大資料檔案個數
MAXINSTANCES integer //最大執行個體個數
MAXLOGHISTORY integer //最大歷史記錄檔個數
LOGFILE
GROUP group_number log_file_name [SIZE size] [, GROUP group_number log_file_name [SIZE size] [,...]]
DATAFILE datafile_name [, ... ];
建立控制檔案,需要事先查詢資料記錄檔和資料檔案資訊
1. 查詢記錄檔 V$LOGFILE, V$LOG
樣本:
SQL> select group#, member from v$logfile;
GROUP# MEMBER
---------- ----------------------------------
1 D:\ORACLE\TEST\REDO01.LOG
3 D:\ORACLE\TEST\REDO03.LOG
2 D:\ORACLE\TEST\REDO02.LOG
查詢記錄檔大小:日誌組#1, #2, #3大小為50M,組內每個記錄檔大小與組大小相等。
SQL> select group#, bytes/1024/1024 from v$log;
GROUP# BYTES/1024/1024
---------- ---------------
1 50
3 50
2 50
2. 查詢資料檔案 V$DATAFILE
SQL> select name from v$datafile;
NAME
--------------------------------------
D:\ORACLE\TEST\SYSTEM01.DBF
D:\ORACLE\TEST\UNDOTBS01.DBF
D:\ORACLE\TEST\SYSAUX01.DBF
D:\ORACLE\TEST\USERS01.DBF
F:\UNTOTBS01.DBF
查詢當前使用的控制檔案,參數control_files記錄當前控制檔案位置(多工,三個檔案為同一個檔案,放在不同的地方)
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string D:\ORACLE\TEST\CONTROL01.CTL,
D:\ORACLE\TEST\CONTROL02.CTL,
D:\ORACLE\TEST\CONTROL03.CTL
3. 關閉資料庫
4. 備份資料檔案和記錄檔,以免建立控制檔案出錯導致資料檔案和記錄檔受損,直接複製資料檔案和記錄檔到其他位置
5. 啟動資料庫執行個體 STARTUP NOMOUNT
SQL> shutdown immediate;
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> startup nomount;
ORACLE 常式已經啟動。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 239078276 bytes
Database Buffers 364904448 bytes
Redo Buffers 7135232 bytes
6. 建立新的控制檔案
SQL> CREATE CONTROLFILE
2 REUSE DATABASE "test"
3 NORESETLOGS
4 NOARCHIVELOG
5 MAXLOGFILES 50
6 MAXLOGMEMBERS 3
7 MAXDATAFILES 50
8 MAXINSTANCES 5
9 MAXLOGHISTORY 500
10 LOGFILE
11 GROUP 1 'D:\ORACLE\TEST\REDO01.LOG' size 50M,
12 GROUP 2 'D:\ORACLE\TEST\REDO02.LOG' size 50M,
13 GROUP 3 'D:\ORACLE\TEST\REDO03.LOG' size 50M
14 DATAFILE
15 'D:\ORACLE\TEST\SYSTEM01.DBF',
16 'D:\ORACLE\TEST\UNDOTBS01.DBF',
17 'D:\ORACLE\TEST\SYSAUX01.DBF',
18 'D:\ORACLE\TEST\USERS01.DBF',
19 'F:\UNTOTBS01.DBF'
20 ;
控制檔案已建立。
查詢控制檔案:
SQL> select name from v$controlfile;
NAME
-----------------------------------------
D:\ORACLE\TEST\CONTROL01.CTL
D:\ORACLE\TEST\CONTROL02.CTL
D:\ORACLE\TEST\CONTROL03.CTL
這裡控制檔案與之前舊的控制檔案位置相同,建立的控制檔案覆蓋了已有的控制檔案。如果需要在其他地方建立新的控制檔案,在這一步之前修改參數CONTROL_FILES的值,如從D盤改到E盤
SQL> alter system set control_files=
2 'E:\ORACLE\TEST\CONTROL01.CTL',
3 'E:\ORACLE\TEST\CONTROL02.CTL',
4 'E:\ORACLE\TEST\CONTROL03.CTL'
5 scope=spfile;
系統已更改。
重啟資料庫:shutdown immediate; startup nomount;
然後執行上述指令碼,建立新的控制檔案
再此查詢控制檔案參數,控制檔案路徑發生了變化,同時在新的路徑下產生了3個控制檔案。
SQL> select name from v$controlfile;
NAME
----------------------------------------------------
E:\ORACLE\TEST\CONTROL01.CTL
E:\ORACLE\TEST\CONTROL02.CTL
E:\ORACLE\TEST\CONTROL03.CTL
7. 開啟資料庫
SQL> alter database open;
資料庫已更改。
如果建立控制檔案使用RESETLOGS選項,則開啟資料庫用:alter database open resetlogs