oracleのデータファイルを追加する
データファイルを追加する前に、事前調査を行います。
現在の設定や空き容量、oracleのブロックサイズなどを確認すると良いです。
###データファイルを追加したい表領域を確認する
テーブルは全て何かの表領域に属しています。
自分で作ったテーブルであれば、それはUSERSの表領域に属しているかもしれません。
データファイルを追加しようとしている表領域を確認してください。
表領域にはSYSTEM, TEMP, USERSなどがあります。
表領域とは?についてはOracleの表領域の管理などを参照すると良いと思います。
###参照するスキーマ
- データファイルの設定を確認するには、DBA_DATA_FILESを参照します。
select * from DBA_DATA_FILES;
- データファイルの空き容量の確認は、DBA_FREE_SPACEを参照します。
select * from DBA_FREE_SPACE;
- oracleのブロックサイズの確認は、DBA_TABLESPACESを参照します。
select * from DBA_TABLESPACES;
###現在の設定を確認する
使用するクエリは、Oracleで表領域のサイズと使用量をSQLで確認する方法や、表領域の使用率をグラフィカルに表示しますを参考にすると良いと思います。
下のような情報のサマリを表示できます。
FILE_NAME | FILE_ID | TABLE_SPACE_NAME | BYTES | BLOCKS | STATUS | RELATIVE_FNO | AUTOEXTENSIBLE | MAXBYTES | MAXBLOCKS | INCREMENT_BY | USER_BYTES | USER_BLOCKS | ONLINE_STATUS |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/oradata/users01.dbf | 4 | USERS | 461373440 | 56320 | AVAILABLE | 4 | YES | 34359721984 | 4194302 | 1280 | 461307904 | 56312 | ONLINE |
###increment_by列から増分を求める
このうち、increment_by列の情報はブロック数なので、実際のバイト数を知りたい場合は、oracleのブロック数を確認します。
select * from DBA_TABLESPACES;
TABLESPACE_NAME | BLOCK_SIZE | INITIAL_EXTENT | NEXT_EXTENT |
---|---|---|---|
USERS | 8192 | 65536 | (null) |
BLOCK_SIZE列がブロックサイズなので、データファイルを追加したい表領域のブロックサイズを確認します。
ここでは8,192です。
increment_byが1,280だった場合は、以下のように計算できます。
1,280 x 8,192 = 10,485,760 = 10M
###データファイルを追加する
oracleにデータファイルを追加する時は、ALTER TABLESPACE ADDを使用します。
USERS表領域に、/oradata/users02.dbf(フルパス指定)ファイルで、初期サイズが128M、自動拡張で増分サイズが64M、最大32Gで追加したい場合は以下のようになります。
ALTER TABLESPACE USERS
ADD DATAFILE '/oradata/users02.dbf' SIZE 128M
AUTOEXTEND ON NEXT 64M MAXSIZE 32767M;
データファイルを追加した後は、追加されたことを再度確認しておきましょう。
select * from DBA_DATA_FILES;
###データファイルを削除する
データファイルを間違って作ってしまった場合、データファイルがまだ空であれば削除できます。
削除する場合はALTER TABLESPACE DROPを使用します。
ALTER TABLESPACE USERS
DROP DATAFILE '/oradata/users02.dbf';
###ALTER TABLESPACE ADDのメガバイト指定の理由
データファイルを作成する際に以下のように、MAXSIZEにメガバイトを使用しました。
ALTER TABLESPACE USERS
ADD DATAFILE '/oradata/users02.dbf' SIZE 128M
AUTOEXTEND ON NEXT 64M MAXSIZE 32767M;
32,767Mの指定を、ギガバイト指定(32G)で置き換えることは一応可能ですが、
データファイルをsmallfileで作成している場合は、32Gと指定すると、以下のようなエラーが発生します。
SQLエラー: ORA-03206: AUTOEXTEND句で(4194304)ブロックの最大ファイル・サイズが範囲外です。
03206. 00000 - "maximum file size of (%s) blocks in AUTOEXTEND clause is out of range"
*Cause: The maximum file size for an autoextendable file has
exceeded the maximum number of blocks allowed.
*Action: Reduce the size and retry.
これはoracleのsmallfileのデータ形式の限界です。
従って、32Gのメガバイト 32768M - 1M = 32767M を最大サイズに指定します。
この方法はHow to fix ORA-03206に掲載されています。
Oracleのデータファイル形式の、smallfile/bigfileについてはOracleリファレンス
を参照してください。