前言
近期IPCC服務器的數據庫數據目錄/oradata磁盤空間不足,由於無法添加磁盤來擴容,需要將數據庫數據目錄從/oradata更改爲/home/oracle/oradata。
由於數據庫文件和表空間具有不同的性質,將數據文件位置更改分爲四個步驟:控制文件位置更改、數據文件位置更改(不包括臨時數據文件)、臨時數據文件位置更改、日誌文件位置更改。
一、控制文件位置更改
停止數據庫監聽,防止有應用連接對數據庫進行修改。
控制文件有3個:/oradata/ipcc/control01.ctl、/oradata/ipcc/control02.ctl、/oradata/ipcc/control02.ctl。
在數據庫open的狀態下:
alter system set
control_files='/home/oracle/oradata/ipcc/control01.ctl','/home/oracle/oradata/ipcc/control02.ctl','/home/oracle/oradata/ipcc/control03.ctl' scope=spfile;
然後將數據庫shutdown。
SQL> shutdown immediate;
將控制文件移動到新目錄/home/oracle/oradata/ipcc下。
mv /oradata/ipcc/control* /home/oracle/oradata/ipcc/
將數據庫啓動到mount狀態,至此,控制文件位置更改結束。
二、數據文件位置更改(不包括臨時數據文件)
數據文件位置更改也分爲兩部分:system表空間和默認undo表空間數據文件、普通表空間數據文件,因爲system表空間和默認undo表空間是不能被offline的,只能在mount狀態對其文件位置進行修改。
1. system表空間和默認undo表空間數據文件位置更改
數據庫必須在mount狀態。
將 system表空間和默認undo表空間數據文件複製到/home/oracle/oradata目錄下。
用以下SQL語句生成更改文件位置的SQL語句。
SELECT 'alter database rename file ''' || Ddf.File_Name || ''' to ''' ||
'/home/oracle' || Ddf.File_Name || ''';'
FROM Dba_Data_Files Ddf
WHERE Ddf.Tablespace_Name = 'SYSTEM'
OR Ddf.Tablespace_Name = 'UNDOTBS1';
生成的SQL語句如下,使用sysdba賬戶執行。
alter database rename file '/oradata/ipcc/undotbs01.dbf' to '/home/oracle/oradata/ipcc/undotbs01.dbf';
alter database rename file '/oradata/ipcc/system01.dbf' to '/home/oracle/oradata/ipcc/system01.dbf';
alter database rename file '/oradata/ipcc/undotbs02.dbf' to '/home/oracle/oradata/ipcc/undotbs02.dbf';
使用sysdba賬戶執行以上語句。
2. 普通表空間數據文件位置更改
數據庫需要在open狀態下。
需要先將表空間全部offline,使用以下語句生成表空間offline的SQL語句。
SELECT 'alter tablespace ' || Dt.Tablespace_Name || ' offline;'
FROM Sys.Dba_Tablespaces Dt
WHERE Dt.Contents <> 'TEMPORARY'
AND Dt.Tablespace_Name <> 'UNDOTBS1'
AND Dt.Tablespace_Name <> 'SYSTEM';
生成的SQL語句如下,使用sysdba賬戶執行。
alter tablespace SYSAUX offline;
alter tablespace USERS offline;
......
將這些表空間的數據文件複製到新目錄/home/oracle/oradata目錄下,數據文件rename的時候,需要兩邊都有數據文件。
使用以下語句生成rename數據文件的SQL語句。
SELECT 'alter tablespace ' || Ddf.Tablespace_Name || ' rename datafile ''' ||
Ddf.File_Name || ''' to ''' || '/home/oracle' || Ddf.File_Name ||
''';'
FROM Sys.Dba_Data_Files Ddf
WHERE Ddf.Tablespace_Name <> 'SYSTEM'
AND Ddf.Tablespace_Name <> 'UNDOTBS1';
生成的SQL語句如下,使用sysdba賬戶執行。
alter tablespace USERS rename datafile '/oradata/ipcc/users01.dbf' to '/home/oracle/oradata/ipcc/users01.dbf';
alter tablespace SYSAUX rename datafile '/oradata/ipcc/sysaux01.dbf' to '/home/oracle/oradata/ipcc/sysaux01.dbf';
......
執行結束之後,將表空間全部online,使用以下語句生成表空間online的SQL語句。
SELECT 'alter tablespace ' || Dt.Tablespace_Name || ' online;'
FROM Sys.Dba_Tablespaces Dt
WHERE Dt.Contents <> 'TEMPORARY'
AND Dt.Tablespace_Name <> 'UNDOTBS1'
AND Dt.Tablespace_Name <> 'SYSTEM';
生成的SQL語句如下,使用sysdba賬戶執行。
alter tablespace SYSAUX online;
alter tablespace USERS online;
......
至此,數據文件位置更改結束。
三、臨時數據文件位置更改
臨時表空間比較特殊,不能將臨時表空間offline,需要將臨時表空間的臨時數據文件offline。
數據庫在open狀態下。
生成臨時數據文件offline的SQL語句如下。
SELECT 'alter database tempfile ''' || File_Name || ''' offline;'
FROM Dba_Temp_Files
ORDER BY File_Id;
生成的SQL語句如下,使用sysdba賬戶執行。
alter database tempfile '/oradata/ipcc/temp01.dbf' offline;
alter database tempfile '/oradata/ricd_temp10' offline;
......
將臨時數據文件複製到/home/oracle/oradata目錄下。
生成rename臨時數據文件的SQL語句如下。
SELECT 'alter database rename file ''' || File_Name || ''' to ''' ||
'/home/oracle' || File_Name || ''';'
FROM Dba_Temp_Files
ORDER BY File_Id;
生成的SQL語句如下,使用sysdba賬戶執行。
alter database rename file '/oradata/ipcc/temp01.dbf' to '/home/oracle/oradata/ipcc/temp01.dbf';
alter database rename file '/oradata/ricd_temp10' to '/home/oracle/oradata/ricd_temp10';
......
執行結束之後,將臨時數據文件online,生成臨時數據文件online的SQL語句如下。
SELECT 'alter database tempfile ''' || File_Name ||
''' online;'
FROM Dba_Temp_Files
ORDER BY File_Id;
生成的SQL語句如下,使用sysdba賬戶執行。
alter database tempfile '/home/oracle/oradata/ipcc/temp01.dbf' online;
alter database tempfile '/home/oracle/oradata/ricd_temp10' online;
......
至此,臨時數據文件位置更改結束。
四、日誌文件位置更改
數據庫可以在mount狀態或open狀態下。
查看日誌文件狀態
SQL> select group#,thread#,sequence#,members,archived,status from v$log;
GROUP# THREAD# SEQUENCE# MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
1 1 8746 2 YES ACTIVE
2 1 8747 2 YES ACTIVE
3 1 8748 2 YES ACTIVE
4 1 8749 2 NO CURRENT
5 1 8745 2 YES ACTIVE
SQL> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/oradata/ipcc/redo11.log
/oradata/ipcc/redo12.log
/oradata/ipcc/redo21.log
/oradata/ipcc/redo41.log
/oradata/ipcc/redo42.log
/oradata/ipcc/redo51.log
/oradata/ipcc/redo52.log
/oradata/ipcc/redo22.log
/oradata/ipcc/redo31.log
/oradata/ipcc/redo32.log
當日志文件狀態不爲current的時候,將日誌文件複製到新目錄/home/oracle/oradata下,然後可以切換日誌文件位置。也可以使用alter system switch logfile,切換日誌文件狀態。
SQL> alter database rename file '/oradata/ipcc/redo11.log' to '/home/oracle/oradata/ipcc/redo11.log';
SQL> alter database rename file '/oradata/ipcc/redo12.log' to '/home/oracle/oradata/ipcc/redo12.log';
SQL> alter database rename file '/oradata/ipcc/redo21.log' to '/home/oracle/oradata/ipcc/redo21.log';
SQL> alter database rename file '/oradata/ipcc/redo22.log' to '/home/oracle/oradata/ipcc/redo22.log';
SQL> alter database rename file '/oradata/ipcc/redo31.log' to '/home/oracle/oradata/ipcc/redo31.log';
SQL> alter database rename file '/oradata/ipcc/redo32.log' to '/home/oracle/oradata/ipcc/redo32.log';
SQL> alter database rename file '/oradata/ipcc/redo41.log' to '/home/oracle/oradata/ipcc/redo41.log';
SQL> alter database rename file '/oradata/ipcc/redo42.log' to '/home/oracle/oradata/ipcc/redo42.log';
SQL> alter database rename file '/oradata/ipcc/redo51.log' to '/home/oracle/oradata/ipcc/redo51.log';
SQL> alter database rename file '/oradata/ipcc/redo52.log' to '/home/oracle/oradata/ipcc/redo52.log';
至此,日誌文件位置更改結束。
當所有文件位置均更改結束時,測試數據庫的可用性;如果無問題,可以刪除舊數據目錄下的文件。