Oracle Database 12c のオンラインファイル移動機能を試す
データファイルの移動
Oracle Database のデータベースが管理するファイルには以下のような種類があります(Real Application Cluster環境ではもう少しあります)。
- 制御ファイル(初期化パラメーターcontrol_files)
- Redoログファイル(V$LOGFILEビュー)
- データファイル(V$DATAFILEビュー、V$TEMPFILEビュー)
- ログファイル(ADRCIコマンド等)
- 各種設定ファイル(sqlnet.ora、listener.ora)
上記のうち、実際にテーブルやインデックスのデータが格納されるファイルがデータファイルです。データファイルは表領域(TABLESPACE)の一部です。
オブジェクトを作成するDDL(CREATE TABLE文、CREATE INDEX文)にはTABLESPACE句を指定してデータの保存場所を決定します。
ここではOracle Database 12cで表領域内のデータファイルを移動する方法について説明しています。
Oracle Database 11gまでのデータファイルの移動
Oracle Database 11gまでのデータファイルの移動は、基本的に以下の手順で実行しました。
- 表領域をオフラインにする(ALTER TABLESPACE OFFLINE文)
- OSのコマンドを使ってデータファイルを移動する(mvコマンド、ASMCMDコマンド等)
- 制御ファイル内のデータファイルのパスを変更する(ALTER TABLESPACE RENAME DATAFILE文等)
- 表領域をオンラインにする(ALTER TABLESPACE ONLINE文)
この方法では、SYSTEM表領域のようにオフラインにできない表領域のデータファイルの変更はできません。また、OFFLINEにした表領域のオブジェクトにはアクセスできないため、SQLを発行できません。
Oracle Database 12cのデータファイルの移動
Oracle Database 12c Release 1以降では、ALTER DATABASE MOVE DATAFILE文のみで、データファイルの移動を行うことができるようになりました。
OSのコマンドによる移動も不要です。この機能により、あまり使用されなくなったデータが格納された表領域を安価なストレージに移動する処理をオンライン状態で行うことができるようになりました。
下記の例ではSYSTEM表領域のデータファイルsystem01.dbfを、同じフォルダ内のsystem02.dbfに変更しています。
SQL> SELECT file_id, file_name FROM dba_data_files ;
FILE_ID FILE_NAME
---------- --------------------------------------------------
7 /u01/app/oracle/oradata/db1/users01.dbf
4 /u01/app/oracle/oradata/db1/undotbs01.dbf
1 /u01/app/oracle/oradata/db1/system01.dbf
3 /u01/app/oracle/oradata/db1/sysaux01.dbf
SQL> ALTER DATABASE MOVE DATAFILE 1 TO '/u01/app/oracle/oradata/db1/system02.dbf' ;
Database altered.
内部的な動作
内部的には新しいファイルを作成して、データを移動し、リカバリ処理を行っています。このため一時的に同一サイズのデータファイルが2つ作成されます。
システムコールをトレースしてみると、サーバープロセス(oracle{SID}プロセス)が、ファイルの作成、データのコピー等、ログの出力等の処理を行っていることが分かります。
まず、新データファイルを作成し初期設定を行います。次に旧ファイルから1MB読み込み(pread)、新ファイルに1MB書き込み(pwrite)を繰り返しています。
次に制御ファイルに対してデータファイルのパスを更新します。最後に旧ファイルを削除して処理は完了です。