Oracle數據庫更改數據文件位置

前言

近期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';

 至此,日誌文件位置更改結束。

 當所有文件位置均更改結束時,測試數據庫的可用性;如果無問題,可以刪除舊數據目錄下的文件。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章