Oracle 12c 引入 ALTER DATABASE MOVE DATAFILE 命令,實現數據文件在線重命名、移動,無需離線表空間、無需停機,大幅提升高可用性。本文通過建立測試表空間 TBS_FILE_TO_MOVE,演示四種典型場景:基本重命名、KEEP 保留舊文件、REUSE 覆蓋目標、按文件號操作。
CREATE SMALLFILE TABLESPACE TBS_FILE_TO_MOVE
DATAFILE '/u01/app/oracle/oradata/NONCDB/file_to_move.dbf'
SIZE 100M AUTOEXTEND ON NEXT 100M LOGGING
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
驗證初始狀態:
SELECT name, status FROM v$datafile WHERE name LIKE '%file_to_move%';
-- /u01/.../file_to_move.dbf ONLINE
!ls /u01/app/oracle/oradata/NONCDB/file_to_move*
-- file_to_move.dbf
ALTER DATABASE MOVE DATAFILE
'/u01/app/oracle/oradata/NONCDB/file_to_move.dbf'
TO '/u01/app/oracle/oradata/NONCDB/file_to_move2.dbf';
結果:控制文件與 OS 目錄同步更新為 file_to_move2.dbf,狀態仍為 ONLINE。
對比:舊語法 ALTER DATABASE RENAME FILE 需離線數據文件,否則報 ORA-01121。
ALTER DATABASE MOVE DATAFILE
'/u01/app/oracle/oradata/NONCDB/file_to_move2.dbf'
TO '/u01/app/oracle/oradata/NONCDB/file_to_move1.dbf' KEEP;
效果:
file_to_move1.dbf(ONLINE)file_to_move2.dbf 與新文件ALTER DATABASE MOVE DATAFILE
'/u01/app/oracle/oradata/NONCDB/file_to_move1.dbf'
TO '/u01/app/oracle/oradata/NONCDB/file_to_move2.dbf' REUSE;
因場景二保留了 file_to_move2.dbf,直接 MOVE 會報錯「文件已存在」。REUSE 強制覆蓋,操作完成後 OS 僅剩 file_to_move2.dbf,控制文件同步更新。
SELECT file# FROM v$datafile WHERE name = '/u01/.../file_to_move2.dbf';
-- FILE# = 100
ALTER DATABASE MOVE DATAFILE 100 TO '/u01/app/oracle/oradata/NONCDB/file_to_move1.dbf';
通過 FILE# 直接定位文件,適合腳本化批量操作、避免路徑拼寫錯誤。
| 特性 | 12c MOVE DATAFILE | 傳統 RENAME FILE |
|---|---|---|
| 在線操作 | ✅ 支持 | ❌ 需 OFFLINE |
| 業務影響 | 零中斷 | 應用報錯/掛起 |
| 同步更新 | 控制文件 + OS 同步 | 需手工 OS mv + RENAME |
| KEEP/REUSE | 內建支持 | 無 |
| 文件號操作 | 支持 | 不支持 |
ONLINE、表空間 READ WRITE。ALTER DATABASE MOVE DATAFILE 是 12c 高可用性的代表性特性,配合 KEEP/REUSE/FILE# 靈活選項,覆蓋從存儲遷移、文件重命名到腳本化運維的全場景需求,徹底告別「停機移文件」時代。