Oracle環境でストレージ更換やディレクトリ整理を行う際、データファイルを安全に移動する方法は必須知識です。本稿は oracle 19c/Linux前提で、オンライン移動と従来手順(オフライン+OSコピー)の2通りを、実機で通るコマンドと注意点つきで解説します。
表領域についてはコチラ。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
結論・最短手順(スニペット)
- 方法A:オンライン移動(推奨)
データベースを開いたままALTER DATABASE MOVE DATAFILEで移動。コピーを内部で行うため、一時的に元+先の空き容量が必要。完了後に新パスへ切替。 - 方法B:オフライン移動(従来)
対象表領域をOFFLINE→ OSでファイル移動 →ALTER DATABASE RENAME FILEで制御ファイル上のパスを書き換え →ONLINE。複数ファイルを一括でリネーム可能。 - OMF/ASMを使う場合
OMF(Oracle Managed Files)を有効化しておくと、MOVE DATAFILEの宛先省略やASM間の移動がシンプル。
背景と基礎(用語の整理)
- データファイルとは?
表領域(TABLESPACE)を構成するOSファイル。制御ファイルに「どの表領域の、どのファイルが、どのパスにあるか」が記録されています。移動では物理ファイルの所在と制御ファイルのポインタが揃っていることが重要です。 - オンライン移動の要点
ALTER DATABASE MOVE DATAFILEでデータベースOPENのまま移動可能。内部でコピーを作成し、切替後に旧ファイルを残すならKEEPを指定(OMFソースではKEEP不可)。PDBのファイルはPDBに接続した状態で実行します。 - オフライン移動の要点
OSでファイルを動かしただけでは制御ファイル上のパスが古いままなのでALTER DATABASE RENAME FILEで更新します。
手順・実装(前提・分岐を明示)
0) 前提(本稿の検証環境)
- OS: Oracle Linux 7/8 相当(コマンドは汎用Linux)
- DB: Oracle Database 19c 非CDB(SID例:
ORCL) - ストレージ: ファイルシステム(ASMは注記で補足)
- 実行ユーザー: SYSDBA
- 影響を避けるため、ユーザー表領域で実施(SYSTEM/UNDOは後述の注意参照)
1) デモ用の作成(ユーザー/表領域/表)
この記事のSQLはそのまま実行できます(パスは環境に合わせて変更)
-- 表領域と移動対象のデータファイルを作成
SQL> CREATE TABLESPACE tbs_demo
DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_demo01.dbf' SIZE 50M
AUTOEXTEND ON NEXT 10M MAXSIZE 1G;
-- 検証用ユーザーと権限
SQL> CREATE USER demo IDENTIFIED BY Demo1234
DEFAULT TABLESPACE tbs_demo
QUOTA UNLIMITED ON tbs_demo;
SQL> GRANT CREATE SESSION, CREATE TABLE TO demo;
-- サンプル表とデータ
SQL> CONN demo/Demo1234
SQL> CREATE TABLE t1 (id NUMBER PRIMARY KEY, payload VARCHAR2(100));
SQL> INSERT INTO t1 VALUES (1, 'before move');
SQL> COMMIT;
-- 以降の操作はSYSDBAで
SQL> CONN / AS SYSDBA;
補足:
CREATE TABLESPACEは物理ファイルを作成し、制御ファイルにパスが記録されます。AUTOEXTENDはファイル自動拡張の設定です。
2) 方法A:オンライン移動(推奨)
前提:宛先ディレクトリに元サイズ相当+αの空き容量が必要(コピーを内部で生成)。
┌────────────── 移動前(OPENのまま) ──────────────┐
│ /u01/.../tbs_demo01.dbf(使用中) │
└───────────────┬────────────────────────┘
│ 内部コピー(I/O増)
┌───────────────▼────────────────────────┐
│ /u02/.../tbs_demo01.dbf(新) ← 切替 → 旧ファイル │
└───────────────────────────────────────┘
-- 2-1) 事前確認:現在のパス
SQL> COLUMN file_name FORMAT A70
SQL> SELECT file_id, file_name, tablespace_name
FROM dba_data_files
WHERE tablespace_name='TBS_DEMO';
-- 2-2) Linux 側:宛先ディレクトリを用意(必要なら)
-- SQL*Plus から OS コマンドを実行する場合
SQL> host mkdir -p /u02/oradata/ORCL
-- 2-3) オンライン移動(DBはOPENのまま)
SQL> ALTER DATABASE MOVE DATAFILE
'/u01/app/oracle/oradata/ORCL/tbs_demo01.dbf'
TO
'/u02/oradata/ORCL/tbs_demo01.dbf';
-- 2-4) 切替後の確認
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name='TBS_DEMO';
SQL> host ls -l /u02/oradata/ORCL/tbs_demo01.dbf;
※host コマンドは sql*plus で OS コマンドを実行するためのコマンドです。
補足:
MOVE DATAFILEは内部でコピー→切替を行います。KEEPを付けない場合、通常は旧ファイルを使わなくなるため削除前に必ず存在確認とバックアップ方針を見直してください。
OMF/ASMの例(参考)
OMFを設定しておけば宛先を省略して自動命名ができます。ASM間移動も可能です。
-- OMFの宛先を定義(例)
SQL> ALTER SYSTEM SET db_create_file_dest='/u02/oradata/ORCL' SCOPE=BOTH;
-- 宛先省略:OMF名で自動作成される
SQL> ALTER DATABASE MOVE DATAFILE
'/u02/oradata/ORCL/tbs_demo01.dbf';
3) 方法B:オフライン移動(従来)
┌───────────────┐ mv(OS) ┌────────────────┐
│ /u01/.../dbf │ ─────────▶ │ /u03/.../dbf │
└─────┬─────────┘ └──────┬─────────┘
│ ALTER DATABASE RENAME FILE │
└───────────────▶ 制御ファイルのパス更新
-- 3-1) 表領域をオフライン化
SQL> ALTER TABLESPACE tbs_demo OFFLINE NORMAL;
-- 3-2) OSでファイル移動
SQL> host mkdir -p /u03/oradata/ORCL
SQL> host mv /u01/app/oracle/oradata/ORCL/tbs_demo01.dbf /u03/oradata/ORCL/tbs_demo01.dbf
※host コマンドは sql*plus で OS コマンドを実行するためのコマンドです。
-- 3-3) 制御ファイル上のパスを書き換え
SQL> ALTER DATABASE RENAME FILE
'/u01/app/oracle/oradata/ORCL/tbs_demo01.dbf'
TO
'/u03/oradata/ORCL/tbs_demo01.dbf';
-- 3-4) 表領域をオンライン化
SQL> ALTER TABLESPACE tbs_demo ONLINE;
-- 3-5) 確認
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name='TBS_DEMO';
補足:複数ファイルの一括リネームも可能(
RENAME FILE 'a','b' TO 'A','B')。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
トラブルシューティング(代表エラーの見方)
| 症状/エラー | 典型原因 | 確認・対処 |
|---|---|---|
| ORA-01511 / ORA-01516(rename時) | パスの誤り/ファイル未存在/必要な状態でない | OSで新旧パスの存在確認→SQLの綴り再確認→RENAME FILEはOS移動後に実行。詳細はエラースタック参照。 |
| ORA-01157: cannot identify/lock data file | OS側で名前変更・削除・権限不足/制御ファイルと実体の不一致 | OSで実体を確認し、正しいパスに戻すかRENAME FILEで一致させる。必要ならバックアップからリストア。 |
| ORA-01537: cannot add file – file already part of database | 既にDBに登録済みのファイル名を追加しようとした | 別名で作成する/既存を確認。 |
運用・監視・セキュリティの注意
- I/O負荷と所要時間:オンライン移動は内部コピーが走るため一時的にI/O増。ピーク時間を避ける。
- バックアップ整合:移動後、制御ファイルのパスが更新されるため、RMANは次回バックアップから新パスを認識。移動直後に任意の整合バックアップを取得しておくと安心。
- OMF/ASMの活用:OMFを有効化しておくと命名・配置の管理が容易。ASM間のオンライン移動もサポート。
- Data Guard構成:スタンバイのファイルパス差異がある場合は事前設計が必要。公式ドキュメントの手順・制約を確認。
- SYSTEM/UNDO/TEMPの扱い:
MOVE DATAFILEはSYSTEMにも適用可能になりましたが、UNDOは新UNDO表領域を作成して切替する運用の方が安全。TEMPは新規TEMPFILE追加→旧を削除が簡便です。
よくある質問(FAQ)
Q1. 稼働中でも本当に移動できますか?
A. ALTER DATABASE MOVE DATAFILE で可能です。十分な空き容量(元+先)とI/O帯域を確保してください。
Q2. PDBのデータファイルはどう移動しますか?
A. 対象のPDBに接続し直して同じコマンドを実行します。
Q3. ASMやOMFでの移動は?
A. TO '+DATA2/...'; のようにASMディスクグループを宛先に指定可能。OMFなら宛先省略で自動命名もできます。
Q4. TEMPやUNDOは?
A. TEMPは新規TEMPFILEの追加→旧削除が簡単。UNDOは新UNDO表領域を作成して切替が無停止で安全です。
まとめ(要点)
- まずはオンライン移動(
MOVE DATAFILE):短停止で安全。空き容量とI/Oを確認。 - 従来手順は:OFFLINE → OS移動 →
RENAME FILE→ ONLINE。 - OMF/ASMを活用すると運用が安定(自動命名・ASM間移動)。
- SYSTEM/UNDO/TEMPの特例に注意(UNDO/TEMPは代替手順が実務的)。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Databaseデータベース管理者ガイド 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?



コメント