【Oracle】如何修改資料檔案和日誌檔案的路徑

恩強Boy發表於2021-02-03

在許多場景下,我們必須透過Oracle 內部命令來 rename 資料檔案或日誌檔案,來為資料檔案和日誌檔案重新定義一個新的物理名稱或新的位置,例如:

- 由於某種原因,我們想移動資料庫檔案到一個新的磁碟

- 我們想從備份還原一個資料檔案,但是它原本的磁碟已經滿了,只能將資料檔案恢復到新的磁碟上。

- 我們在作業系統層面移動或重新命名該資料檔案,導致 Oracle 找不到它。在啟動時候,會報錯 ORA-01157 ORA-01110 。如果資料庫已經啟動,我們嘗試正常關閉資料庫,則會得到 ORA-01116 ORA-01110

- 在同一臺機器上有多個資料庫,需要重新命名這些資料檔案,防止衝突和混淆

本文將會幫助你解決以下三個問題

1.  在資料庫開啟時,重新命名或移動資料檔案

2.  在資料庫關閉時,重新命名或移動資料檔案

3.  重新命名或移動日誌檔案(redolog

注意,如果要重新命名或移動system 表空間資料檔案,必須關庫執行。因為不能將 system 表空間 offline

一、  在資料庫開啟時,重新命名或移動資料檔案

在資料庫開啟時,可以重新命名或移動資料檔案,但是,該表空間必須是隻讀的。這樣是為了防止使用者從表空間中進行insert update delete 操作。修改只讀表空間資料檔案的時間取決於資料檔案的大小以及將資料檔案複製到其他位置所需的時間。將表空間設定為只讀會凍結檔案頭,防止對檔案頭進行更新。由於該資料檔案處於只讀狀態,所以可以在資料庫 open 狀態時複製該資料檔案。

操作步驟如下:

1)  確定表空間有多少資料檔案

SQL> SELECT FILE_NAME, STATUS FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TEST_TBS';

FILE_NAME                                             STATUS

-------------------------------------------------- ---------

/u01/app/oracle/oradata/orcl/test01.dbf            AVAILABLE

/u01/app/oracle/oradata/orcl/test02.dbf            AVAILABLE

2)  確保所有資料檔案的狀態都是AVAILABLE

3)  確保表空間只讀

SQL> alter tablespace test_tbs read only;

4)  查詢表空間是否只讀

SQL> SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'TEST_TBS';

TABLESPACE_NAME                STATUS

------------------------------ ---------

TEST_TBS                       READ ONLY

5)  使用copy 命令將資料檔案複製到新位置

$ cd /u01/app/oracle/oradata/orcl/

$ cp test01.dbf test02.dbf  /u01/app/oracle/oradata/new/

6)  將資料檔案複製到新位置後,將表空間offline

SQL> alter tablespace test_tbs offline;

7)  重新命名資料檔案到新位置,會更新控制檔案裡面的資訊

SQL> alter database rename file  

'/u01/app/oracle/oradata/ orcl /test01.dbf' to

'/u01/app/oracle/oradata/ new /test01.dbf';

SQL> alter database rename file '/u01/app/oracle/oradata/ orcl /test02.dbf' to '/u01/app/oracle/oradata/ new /test02.dbf';

同樣可以使用alter tablespace .... rename datafile 語法操作。

8)  將表空間online

SQL> alter tablespace test_tbs online;

9)  將表空間read write

SQL> alter tablespace test_tbs read write;

10)  驗證控制檔案是否更新

SQL> SELECT FILE_NAME, STATUS FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'TEST_TBS';

FILE_NAME                                             STATUS

-------------------------------------------------- ---------

/u01/app/oracle/oradata/new/test01.dbf             AVAILABLE

/u01/app/oracle/oradata/new/test02.dbf             AVAILABLE

11)  刪除舊路徑下的檔案即可

二、  在資料庫關閉時,移動或重新命名資料檔案

1)  如果資料庫時open, 需要關閉

SQL> shutdown immediate;

2)  複製資料檔案到新路徑

$ cd /u01/app/oracle/oradata/orcl/

$ cp test01.dbf test02.dbf  /u01/app/oracle/oradata/new/

3)  開啟資料庫至mount

SQL> startup mount;

4)  rename 資料檔案

SQL> alter database rename file

'/u01/app/oracle/oradata/ orcl /test01.dbf' to

'/u01/app/oracle/oradata/ new /test01.dbf';

SQL> alter database rename file

'/u01/app/oracle/oradata/ orcl /test02.dbf' to

'/u01/app/oracle/oradata/ new /test02.dbf';

5)  開始資料庫至open

SQL> alter database open;

6)  查詢資料檔案是否改變

SQL> SELECT * FROM V$DBFILE;

7)  刪除舊路徑下的資料檔案即可

三、  重新命名或移動日誌檔案

1)  查詢當前日誌檔案路徑

SQL> select group#,member from v$logfile;

    GROUP# MEMBER

---------- ----------------------------------------

         3 /u01/app/oracle/oradata/orcl/redo03.log

         2 /u01/app/oracle/oradata/orcl/redo02.log

         1 /u01/app/oracle/oradata/orcl/redo01.log

2)  關閉資料庫

SQL> shutdown immediate;

3)  複製日誌檔案到新路徑

$ cp /u01/app/oracle/oradata/orcl/redo03.log /u01/app/oracle/oradata/new/

4)  開啟資料庫至mount

SQL> startup mount;

5)  rename 該日誌檔案

SQL> alter database rename file  

'/u01/app/oracle/oradata/orcl/redo03.log' to  

'/u01/app/oracle/oradata/new/redo03.log';

6)  開啟資料庫

SQL> alter database open;

7)  再次檢視日誌檔案資訊

SQL> select group#,member from v$logfile;

    GROUP# MEMBER

---------- -----------------------------------------

         3 /u01/app/oracle/oradata/new/redo03.log

         2 /u01/app/oracle/oradata/orcl/redo02.log

         1 /u01/app/oracle/oradata/orcl/redo01.log

8)  刪除舊路徑下的日誌檔案即可

 

---- end ----


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529886/viewspace-2755803/,如需轉載,請註明出處,否則將追究法律責任。

相關文章