Oracleのデータファイルの追加

# oracleのデータファイルを追加する
データファイルを追加する前に、事前調査を行います。
現在の設定や空き容量、oracleのブロックサイズなどを確認すると良いです。

###データファイルを追加したい表領域を確認する
テーブルは全て何かの表領域に属しています。
自分で作ったテーブルであれば、それはUSERSの表領域に属しているかもしれません。

データファイルを追加しようとしている表領域を確認してください。
表領域にはSYSTEM, TEMP, USERSなどがあります。

表領域とは？については[Oracleの表領域の管理](http://www.atmarkit.co.jp/ait/articles/0411/12/news108.html)などを参照すると良いと思います。

###参照するスキーマ
- データファイルの設定を確認するには、[DBA_DATA_FILES]((https://docs.oracle.com/cd/E16338_01/server.112/b56311/statviews_3143.htm))を参照します。

```sql
select * from DBA_DATA_FILES;
```


- データファイルの空き容量の確認は、[DBA_FREE_SPACE](https://docs.oracle.com/cd/E16338_01/server.112/b56311/statviews_3194.htm)を参照します。

```sql
select * from DBA_FREE_SPACE;
```

- oracleのブロックサイズの確認は、[DBA_TABLESPACES](https://docs.oracle.com/cd/E16338_01/server.112/b56311/statviews_5060.htm)を参照します。

```sql
select * from DBA_TABLESPACES;
```


###現在の設定を確認する

使用するクエリは、[Oracleで表領域のサイズと使用量をSQLで確認する方法](http://www.ilovex.co.jp/blog/system/oracle/oraclesql.html)や、[表領域の使用率をグラフィカルに表示します](http://otn.oracle.co.jp/otn_pl/otn_tool/code_detail?n_code_id=304)を参考にすると良いと思います。

下のような情報のサマリを表示できます。

| 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のブロック数を確認します。

```sql
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](https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_3002.htm)を使用します。

USERS表領域に、/oradata/users02.dbf(フルパス指定)ファイルで、初期サイズが128M、自動拡張で増分サイズが64M、最大32Gで追加したい場合は以下のようになります。

```sql
ALTER TABLESPACE USERS
 ADD DATAFILE '/oradata/users02.dbf' SIZE 128M
 AUTOEXTEND ON NEXT 64M MAXSIZE 32767M;
```

データファイルを追加した後は、追加されたことを再度確認しておきましょう。

```sql
select * from DBA_DATA_FILES;
```


###データファイルを削除する
データファイルを間違って作ってしまった場合、データファイルがまだ空であれば削除できます。
削除する場合は[ALTER TABLESPACE DROP](https://docs.oracle.com/cd/E57425_01/121/ADMIN/dfiles.htm#GUID-35078A43-B11C-4E9B-9404-9D4BF0EB7C77)を使用します。

```sql
ALTER TABLESPACE USERS
 DROP DATAFILE '/oradata/users02.dbf';
```

###ALTER TABLESPACE ADDのメガバイト指定の理由

データファイルを作成する際に以下のように、MAXSIZEにメガバイトを使用しました。

```sql
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](https://www.linkedin.com/pulse/how-fix-ora-03206-maximum-file-size-blocks-autoextend-raisinghani)に掲載されています。

Oracleのデータファイル形式の、smallfile/bigfileについては[Oracleリファレンス](https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_7003.htm)
を参照してください。