2020年11月2日 星期一

5.7 管理 Data File

Oracle Data File 為資料庫的實體結構,針對 Data File 可以將其 Resize 或是搬移,如果 Tablespace 空間不足時, DBA 可以選擇為其新增 Data File 或是將原本的 Data File 放大。更改 Data File 大小只需簡單的使用 resize 命令,例如將 users01.dbf 更改大小為 100M :


SQL> alter database datafile '/opt/app/oradata/orcl/users01.dbf' resize 100M;


這邊要注意的是,將 Data File 放大只要作業系統空間足夠,或是沒超過 Small File 的上限 32G 都沒問題,但是 Data File 要縮小的話就不一定能夠成功,要視此 Data File 裡面是否已經分配給資料庫所使用,如果已經被分配的空間就無法回收縮小,此時如果執行 resize 命令就會出現 ORA-03297 錯誤:

D:\Blog\picture\5-30.jpg


Data File 除了可以更改大小外,當 filesystem 空間不足時, Data File 也可以搬移至其他可用空間,搬移 Data File 需要注意的是, Data File 的實體檔案是存放在作業系統上,這個實體的位置我們可以透過作業系統的命令得知,而資料庫所認為的 Data File 位置是紀錄在 Control File 裡,也就是要透過資料庫的 view (v$datafile 或是 dba_data_files) 來得知資料庫所認為的位置,當我們搬移 Data File 時必須要注意實體位置與資料庫認為的位置要相符,否則會造成此 Data File 無法使用。


搬移 Data File 的方式取決於資料庫是否處於 Archive Log Mode,只有在資料庫為 Archive Log Mode 之下才可以線上搬移 Data File,否則就必須把資料庫 shutdown 之後開啟至 mount 模式才能夠搬移 Data File。


在 No Archive Log Mode 搬移 Data File 的步驟如下:

1. Shutdown 資料庫並開啟至 mount (startup mount)

2. 複製或搬移 Data File 實體位置,例如將 user01.dbf 從 /u01 換到 /u02: (mv 或 cp)

$ cp '/u01/app/oradata/orcl/users01.dbf' '/u02/app/oradata/orcl/users01.dbf'

3. 使用 sqlplus 進入資料庫更改 control file 裡面的紀錄:

SQL> alter database rename file '/u01/app/oradata/orcl/users01.dbf' to '/u02/app/oradata/orcl/users01.dbf';

4. 將資料庫開啟 (alter database open) 便完成 Data File 的搬移

 

在 Archive Log Mode 搬移 Data File 的步驟如下:

1. 將 Data File Offline

SQL> alter database datafile '/u01/app/oradata/orcl/users01.dbf' offline;

2. 複製或搬移 Data File 實體位置,例如將 user01.dbf 從 /u01 換到 /u02: (mv 或 cp)

$ cp '/u01/app/oradata/orcl/users01.dbf' '/u02/app/oradata/orcl/users01.dbf'

3. 使用 sqlplus 進入資料庫更改 control file 裡面的紀錄:

SQL> alter database rename file '/u01/app/oradata/orcl/users01.dbf' to '/u02/app/oradata/orcl/users01.dbf';

4. Recover Data File

SQL> recover datafile '/u02/app/oradata/orcl/users01.dbf';

5. 將 Data File Online

SQL> alter database datafile '/u02/app/oradata/orcl/users01.dbf' online;


雖然在 Archive Log 模式之下搬移 Data File 不必關閉資料庫,但是將 Data File Offline 的時候,表示此 Data File 為靜止狀態,暫時脫離資料庫的控管,而此 Data File 相關的資料也就無法讀取,直到再次 Online 的時候才可以使用。由於資料庫是一直處於運行的狀態,所以要將 Data File 再次 Online 的時候必須做 Recover 的動作,目的就是要追上資料庫這段的時間差,否則資料庫會提示 ORA-01113 錯誤:


搬移 Data File 除了使用 sqlplus 之外,另外也可以使用 RMAN 來做搬移更為方便,同樣的是以線上搬移 user01.dbf 為例:

1. 將 Data File Offline

RMAN> alter database datafile '/u01/app/oradata/orcl/users01.dbf' offline;

(11g 以前在 RMAN 裡需要使用 sql 關鍵字,12c 以後不用)

2. 複製 user01.dbf 至 /u02 底下

RMAN> copy datafile '/u01/app/oradata/orcl/users01.dbf' to '/u02/app/oradata/orcl/users01.dbf';

3. 使用 switch 命令更改 control file 裡面的紀錄

RMAN> switch datafile '/u01/app/oradata/orcl/users01.dbf' to copy;

4. Recover Data File

RMAN> recover datafile '/u02/app/oradata/orcl/users01.dbf';

5. 將 Data File Online

RMAN> alter database datafile '/u02/app/oradata/orcl/users01.dbf' online;


與 sqlplus 的差別在於,RMAN 的 copy 命令會於作業系統上複製檔案,我們不需要在另外執行作業系統命令去搬移 Data File。


到了 Oracle 12c ,推出了 Online Move Data File 的新功能,只需執行 move datafile 命令便自動幫我們搬移了,過程中無須將 Data File Offline、Online,也無須於作業系統上搬移實體檔,所有的動作都簡化由一個命令自動完成:

SQL> alter database move datafile '/u01/app/oradata/orcl/users01.dbf' to '/u02/app/oradata/orcl/users01.dbf';


經由同樣的方式,我們也可以用來搬移 Redo Log File,但差別在於 Redo Log File 的搬移必須將資料庫啟動在 mount 模式,不可以線上搬移,而且只能透過 sqlplus 來進行:

1. Shutdown 資料庫並開啟至 mount (startup mount)

2. 複製或搬移 Redo Log 實體位置,例如將 redo01.log 從 /u01 換到 /u02: (mv 或 cp)

$ cp '/u01/app/oradata/orcl/redo01.log' '/u02/app/oradata/orcl/redo01.log'

3. 使用 sqlplus 進入資料庫更改 control file 裡面的紀錄:

SQL> alter database rename file '/u01/app/oradata/orcl/redo01.log' to '/u02/app/oradata/orcl/redo01.log';

4. 將資料庫開啟 (alter database open) 便完成 Redo Log File 的搬移


最後來談一下實體結構的最後一部分,Control File 的搬移。由於 Control File 的位置是記錄在參數檔裡面,因此我們只需要更改參數 control_files 之後將資料庫重啟,就可以搬移 Control Files。例如將 Control Files 搬至 /u02:

1. 更改參數檔

SQL> alter system set control_files='/u02/app/oradata/orcl/control01.ctl' scope=spfile;

2. 關閉資料庫 (shutdown immediate)

3. 複製或搬移 Control File 實體位置

$ cp '/u01/app/oradata/orcl/control01.ctl' '/u02/app/oradata/orcl/control01.ctl'

4. 啟動資料庫 (startup)


不論我們要搬移資料庫的哪一種檔案,都要注意必須與資料庫所記錄的位置相符,因此必須要不斷的透過查詢來確認檔案位置無誤, Data File 相關的 view 為 v$datafile 、 dba_data_files; Redo Log 相關的 view 為 v$log 、 v$logfile,而 Control File 則是直接確認參數檔的內容,使用 show parameter control_files 或是查詢 v$parameter,DBA 必須熟悉這些 view ,有助於 Oracle 資料庫的管理。





沒有留言:

張貼留言