Oracleデータベースの世界に足を踏み入れると、最初に理解しておくべき重要な概念の1つが「表領域(Tablespace)」です。この記事では、初心者向けに表領域について簡単に説明し、その役割や設定方法について解説します。
1. 表領域(Tablespace)とは?
表領域とは、Oracleデータベース内の物理的なデータの保管場所を論理的に管理するための単位です。データベースに含まれるデータ(テーブル、インデックスなど)は表領域に格納され、表領域は物理的なデータファイル(ディスク上に存在するファイル)にマッピングされています。
表領域はデータベース全体を効率よく管理するための論理的な単位であり、データベースの運用や管理において非常に重要な役割を果たします。
2. 表領域の役割
表領域は主に次のような役割を持っています:
- データ格納: データベースのテーブルやインデックスなどのデータが保存される場所。
- 論理的なデータの管理: 物理ファイルを意識することなく、データを効率的に配置・管理することができる。
- パフォーマンス最適化: 複数の表領域を使用してデータの分散やストレージの最適化を図り、パフォーマンスの向上を目指せる。
- データセキュリティ: 表領域ごとにアクセス制御や暗号化の設定を行うことで、セキュリティを強化できる。
3. 表領域を分けるメリット/デメリット
表領域を分けることには、Oracleデータベースの運用においてさまざまなメリットとデメリットがあります。表領域を分ける(複数の表領域を作成してデータを格納する)ことで、データの効率的な管理やパフォーマンス向上が期待できる一方で、管理の複雑さが増すこともあります。
表領域を分けるメリット
1. パフォーマンスの向上
- I/O負荷の分散: 複数の表領域を利用することで、データが格納されているデータファイルが異なるディスクにまたがるように設定できます。これにより、ディスクのI/O(入力/出力)負荷を分散させ、データベースの全体的なパフォーマンスが向上します。例えば、読み込みが頻繁なデータと書き込みが頻繁なデータを別の表領域に分けることで、アクセスの衝突を減らすことができます。
2. メンテナンスの柔軟性
- データ移動が容易: データベースが運用中に、特定の表領域だけをバックアップしたり、移動したりすることが可能です。これにより、データの一部を移動したい場合に、システム全体に影響を与えずに作業を進めることができます。
3. ストレージ管理の最適化
- 異なるストレージ特性を活用: 重要なデータを高速なストレージに、頻繁にアクセスされないデータをコストの低いストレージに配置することで、ストレージの効率的な使用が可能です。たとえば、アクセス頻度が高いデータをSSDに配置し、アーカイブデータをHDDに配置することで、コストとパフォーマンスのバランスを取れます。
4. データ保護とセキュリティ
- アクセス制御の強化: 表領域ごとに異なる権限やセキュリティポリシーを適用できるため、特定の表領域に格納されたデータへのアクセスを制限できます。これにより、機密データを他のデータから分離し、セキュリティリスクを軽減できます。
5. 障害対応の効率化
- 表領域単位でのバックアップとリカバリ: データベース全体ではなく、特定の表領域だけをバックアップ・リカバリすることが可能です。これにより、部分的なデータ損失や障害時に、復旧作業を効率的に行えます。
表領域を分けるデメリット
1. 管理の複雑さ
- 設定・運用の手間が増加: 表領域が増えると、それに伴い管理すべきデータファイルや設定が多くなります。ディスク容量の割り当てや、各表領域のバックアップ、監視などのメンテナンスが複雑になります。特に、複数の表領域を頻繁に追加・削除する場合、管理が煩雑になることがあります。
2. リソースの浪費
- ストレージの無駄遣い: 表領域ごとにデータファイルを作成するため、ストレージ容量を過剰に割り当てるリスクがあります。特に、小規模なデータのために複数の表領域を作成すると、必要以上のディスクスペースを消費してしまう可能性があります。
3. 複雑な依存関係
- 依存関係の増加: 表領域間で依存関係が発生すると、データの削除や移動が難しくなることがあります。たとえば、異なる表領域に格納されたオブジェクトが相互に依存している場合、片方の表領域を削除することが困難になることがあります。
4. パフォーマンスの逆効果のリスク
- パフォーマンスの低下: 表領域を適切に分けない場合、かえってパフォーマンスが低下するリスクがあります。たとえば、頻繁にアクセスされるデータを複数の表領域に分散しすぎると、データのアクセスパターンが複雑化し、逆にパフォーマンスが低下する場合があります。
5. バックアップやリカバリの複雑化
- 運用上のミスのリスク: 複数の表領域を管理する際、表領域ごとに異なるバックアップスケジュールを設定している場合、表領域単位のリカバリ作業が複雑になることがあります。特定の表領域だけをリカバリしなければならない状況では、整合性を保つために慎重な管理が必要です。
4. 表領域の種類
Oracleでは、表領域は大きく次の3つに分類されます。
- SYSTEM表領域: データベースの作成時に自動的に作成され、データベースのシステムデータが格納されます。非常に重要な表領域で、削除や変更は慎重に行う必要があります。
- SYSAUX表領域: SYSTEM表領域を補完するためのもので、主にデータベース管理情報(データベースの監視機能や統計情報など)が保存されます。
- ユーザー定義表領域: 一般的なデータ(テーブルやインデックスなど)が格納される場所です。管理者や開発者が新しく作成することができ、アプリケーションごとに専用の表領域を作成することがよくあります。
5. 表領域の作成方法
では、実際に新しい表領域を作成する方法について見ていきましょう。表領域はSQL*PlusやSQL Developerなどを使って作成できます。
例:表領域の作成
次のSQL文を使用して新しい表領域を作成できます:CREATE TABLESPACE <表領域名>
DATAFILE '<データファイルのフルパス>'
SIZE <サイズ>
AUTOEXTEND [ ON | OFF ]
;
【コマンド例】CREATE TABLESPACE users_data
DATAFILE '/u01/app/oracle/oradata/V19/users_data01.dbf'
SIZE 50M
AUTOEXTEND ON;
このSQL文の説明:
CREATE TABLESPACE
: 新しい表領域を作成するためのコマンド。users_data
: 作成する表領域の名前。DATAFILE
: 表領域が使用する物理データファイルのパスと名前を指定。SIZE 50M
: 初期サイズを50MBに指定。AUTOEXTEND ON
: データが追加されると、データファイルが自動的に拡張される設定。
【実行例】
SQL> CREATE TABLESPACE users_data
2 DATAFILE '/u01/app/oracle/oradata/V19/users_data01.dbf'
3 SIZE 50M
4 AUTOEXTEND ON;
表領域が作成されました。
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files;
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users01.dbf USERS 5242880 YES
/u01/app/oracle/oradata/V19/undotbs01.dbf UNDOTBS1 760217600 YES
/u01/app/oracle/oradata/V19/system01.dbf SYSTEM 1226833920 YES
/u01/app/oracle/oradata/V19/sysaux01.dbf SYSAUX 723517440 YES
/u01/app/oracle/oradata/V19/users_data01.dbf USERS_DATA ★ 52428800 YES
データファイルは、Oracleデータベースでデータを保存するための物理的なOS上のファイルです。
データベース内の表領域(Tablespace)は、データファイルによって物理的に構成されています。
つまり、テーブルやインデックスといったデータベースオブジェクトが格納されるのがデータファイルです。
6. 表領域の管理
Oracleデータベースで表領域を作成した後、次のようなコマンドでその状態を確認したり、管理したりすることができます。
- 表領域の確認:
SELECT tablespace_name, status FROM dba_tablespaces;
【実行例】
SQL> SELECT tablespace_name, status FROM dba_tablespaces;
TABLESPACE_NAME STATUS
-------------------- ---------------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS ONLINE
- 表領域のデータファイル確認:
SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files;
【実行例】
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files;
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users01.dbf USERS 5242880 YES
/u01/app/oracle/oradata/V19/undotbs01.dbf UNDOTBS1 760217600 YES
/u01/app/oracle/oradata/V19/system01.dbf SYSTEM 1226833920 YES
/u01/app/oracle/oradata/V19/sysaux01.dbf SYSAUX 723517440 YES
- 表領域のサイズ変更:
ALTER DATABASE DATAFILE ‘<データファイルフルパス>’ RESIZE <サイズ>;
【コマンド例】ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/V19/users_data01.dbf' RESIZE 200M;
【実行例】
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/V19/users_data01.dbf' RESIZE 200M;
データベースが変更されました。
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files
2 WHERE file_name='/u01/app/oracle/oradata/V19/users_data01.dbf';
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users_data01.dbf USERS_DATA 209715200 YES
- データファイルの追加:
ALTER TABLESPACE users_data
ADD DATAFILE ‘<データファイルフルパス>’
SIZE <サイズ>
AUTOEXTEND [ ON | OFF ];
【コマンド例】ALTER TABLESPACE users_data
;
ADD DATAFILE '/u01/app/oracle/oradata/V19/users_data02.dbf'
SIZE 100M
AUTOEXTEND ON
このSQL文の説明:
ALTER TABLESPACE
: 既存の表領域に変更を加えるためのコマンド。ADD DATAFILE
: 新しいデータファイルを追加。'/u01/app/oracle/oradata/DB1/users_data02.dbf'
: 新しいデータファイルのパスと名前。SIZE 100M
: 追加するデータファイルの初期サイズを100MBに指定。AUTOEXTEND ON
: データが追加されると、データファイルが自動的に拡張される設定。
【実行例】
SQL> ALTER TABLESPACE users_data
2 ADD DATAFILE '/u01/app/oracle/oradata/V19/users_data02.dbf'
3 SIZE 100M
4 AUTOEXTEND ON;
表領域が変更されました。
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files
2 WHERE tablespace_name='USERS_DATA';
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users_data01.dbf USERS_DATA 209715200 YES
/u01/app/oracle/oradata/V19/users_data02.dbf USERS_DATA 104857600 YES
- データファイルの削除:
Oracleデータベースでは、データファイルを物理的に削除することは推奨されていません。データファイルを誤って削除すると、データベースが壊れる可能性があります。もし不要なデータファイルがある場合は、その表領域全体を削除するか、データファイルのサイズを縮小する方法を検討することが一般的です。
データファイルのサイズを縮小するには、次のSQL文を使用します:
例:データファイルのサイズを縮小ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/V19/users_data02.dbf' RESIZE 50M;
【実行例】
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/V19/users_data02.dbf' RESIZE 50M;
データベースが変更されました。
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files
2 WHERE file_name='/u01/app/oracle/oradata/V19/users_data02.dbf';
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users_data02.dbf USERS_DATA 52428800 YES
このSQL文は、指定したデータファイルのサイズを50MBに縮小します。ただし、縮小するサイズよりも大きなデータがデータファイルに含まれている場合はエラーが発生します。
- 表領域の削除:
不要になった表領域を削除するには、DROP TABLESPACE
コマンドを使用します。表領域を削除する際には、注意が必要です。表領域を削除すると、その表領域に格納されていた全てのデータが失われるため、バックアップを取っておくことをお勧めします。
例:表領域の削除(データファイルは保持)DROP TABLESPACE <表領域名>;
このコマンドは、users_data
という名前の表領域を削除しますが、関連するデータファイルはディスク上に残ります。後でファイルを手動で削除することが可能です。
例:表領域の削除(データファイルも削除)DROP TABLESPACE <表領域名> INCLUDING CONTENTS AND DATAFILES;
INCLUDING CONTENTS
: 表領域内の全データを削除。AND DATAFILES
: 表領域に関連するデータファイルも一緒に削除。
【実行例】
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files
2 WHERE tablespace_name='USERS_DATA';
FILE_NAME TABLESPACE_NAME BYTES AUTOEXTEN
-------------------------------------------------- -------------------- ---------- ---------
/u01/app/oracle/oradata/V19/users_data01.dbf USERS_DATA 209715200 YES
/u01/app/oracle/oradata/V19/users_data02.dbf USERS_DATA 52428800 YES
SQL> DROP TABLESPACE users_data INCLUDING CONTENTS AND DATAFILES;
表領域が削除されました。
SQL> SELECT file_name, tablespace_name, bytes, autoextensible FROM dba_data_files
2 WHERE tablespace_name='USERS_DATA';
レコードが選択されませんでした。 ★削除された
SQL> host ls -l /u01/app/oracle/oradata/V19
total 3489756
-rw-r-----. 1 oracle oinstall 10600448 Oct 9 12:12 control01.ctl
-rw-r-----. 1 oracle oinstall 10600448 Oct 9 12:12 control02.ctl
-rw-r-----. 1 oracle oinstall 209715712 Oct 9 11:43 redo01.log
-rw-r-----. 1 oracle oinstall 209715712 Oct 9 11:43 redo02.log
-rw-r-----. 1 oracle oinstall 209715712 Oct 9 12:12 redo03.log
-rw-r-----. 1 oracle oinstall 765468672 Oct 9 12:12 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 1226842112 Oct 9 12:09 system01.dbf
-rw-r-----. 1 oracle oinstall 165683200 Nov 26 2023 temp01.dbf
-rw-r-----. 1 oracle oinstall 760225792 Oct 9 12:12 undotbs01.dbf
-rw-r-----. 1 oracle oinstall 5251072 Oct 9 11:43 users01.dbf
SQL> ★データファイルも残っていない
このコマンドは、表領域と関連するデータファイルを全て削除するので、表領域が不要になった場合に便利です。ただし、復元ができなくなるため、十分な注意が必要です。
表領域を削除する際に注意すべき点をいくつか挙げます。
・バックアップの確認: 表領域を削除する前に、必ずデータのバックアップが取れていることを確認してください。削除後はデータの復元が難しくなります。
・依存関係の確認: 削除しようとしている表領域に他のオブジェクトが依存している可能性があります。特に、重要なテーブルやインデックスがその表領域に存在していないか確認しましょう。
・SYSTEM表領域は削除不可: Oracleデータベースの動作に不可欠な表領域(SYSTEMやSYSAUXなど)は削除することができません。
7. まとめ
今回の記事では、表領域にデータファイルを追加する方法や表領域の削除方法について解説しました。表領域の管理は、Oracleデータベースの運用において重要なスキルです。表領域のサイズや構成を適切に管理することで、データベースのパフォーマンスを維持し、効率的に運用することができます。
ポイントのまとめ:
- データファイルの追加は、表領域のストレージ容量を増やすために使用される。
- データファイルの削除は推奨されないが、サイズの縮小は可能。
- 表領域の削除は、
DROP TABLESPACE
コマンドで行い、データファイルも削除する場合はINCLUDING CONTENTS AND DATAFILES
を使用。 - 削除前には必ずバックアップと依存関係の確認を行う。
[参考]
SQL言語リファレンス – CREATE TABLESPACE
SQL言語リファレンス – ALTER TABLESPACE
SQL言語リファレンス – DROP TABLESPACE
コメント