Amazon RDS for Oracle DB インスタンスの表領域のサイズを変更するにはどうすればよいですか?

最終更新日: 2021 年 11 月 3 日

Amazon Relational Database Service (Amazon RDS) for Oracle DB インスタンスの表領域を管理またはサイズ変更する方法を知りたいと考えています。

簡単な説明

Amazon RDS for Oracle DB インスタンスのデフォルトの表領域のタイプは bigfile です。bigfile 表領域は、データファイルをユーザーにとって透過的にします。したがって、基盤となる各データファイルを管理する代わりに、表領域に対してオペレーションを直接実行できます。bigfile 表領域では、新しいデータファイルを追加したり、複数のファイルを処理したりする必要性を排することにより、データファイルの管理が簡素化されています。RDS for Oracle インスタンスには smallfile 表領域を使用しないようにすることがベストプラクティスです。

RDS for Oracle インスタンスに smallfile 表領域がある場合、次の制限があります。

  • データファイルのサイズを変更することはできません。ただし、表領域に新しいデータファイルを追加することで、表領域のサイズを変更できます。
  • ALTER DATABASE クエリを実行して、データファイルのサイズやその設定を変更することはできません。これは、RDS for Oracle では ALTER DATABASE コマンドがサポートされていないためです。詳細については、RDS for Oracle の制限事項を参照してください。
  • db_files パラメータを手動で管理して、データベース内のデータファイルの最大数を定義する必要があります。データファイルの数がこの制限に達すると、db_files の微調整が必要になる場合があります。

デフォルトでは、RDS for Oracle の表領域は bigfile で、AUTOEXTEND がオンになっています。bigfile 表領域の最大サイズは 16 TiB です。表領域にデータを挿入すると、表領域は、その表領域用に設定された最大制限または RDS インスタンス用に設定された割り当て済みストレージのいずれか小さい方まで、必要に応じて大きくなります。RDS インスタンス用の割り当て済みストレージが完全に使用されている場合、インスタンスは STORAGE_FULL 状態に切り替わり、表領域を拡張できません。この問題を解決するには、インスタンスにストレージ領域を追加する必要があります。詳細については、Amazon RDS DB インスタンスでのストレージ不足時に発生する問題を解決するにはどうすればよいですか? を参照してください。

表領域からデータが削除されても、表領域のサイズは縮小されません。空きブロックは、新しいデータが挿入されたときに再利用できます。未使用の領域を再利用するには、表領域のサイズを手動で変更する必要があります。

解決方法

RDS for Oracle インスタンスの表領域のサイズを変更するには、次の手順を実行します。

  1. 表領域の設定を確認します。
  2. ユースケースに基づいて、表領域のサイズを増減します。

表領域の設定を確認する

1.    次のようなクエリを実行して、表領域が次のいずれの状態であるかを確認します。

  • PERMANENT、UNDO、または TEMPORARY
  • smallfile または bigfile
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    次のようなクエリを実行して、自動拡張機能がオンになっているかどうか、データファイルの現在のサイズ、および設定されている最大制限を確認します。

PERMANENT 表領域と UNDO 表領域の場合:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

TEMPORARY 表領域の場合:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

これらのクエリの出力には、次の内容が含まれているのを目にするかもしれません。

  • 自動拡張機能がオンになっていない場合、MAX_GB の値は 0 になります。
  • 表領域が smallfile の場合、MAX_GB の値は表領域の作成に使用されたブロックサイズによって異なります。例えば、使用されるブロックサイズが 8K の場合、MAX_GB の値は 32 GB になります。詳細については、Oracle のドキュメントの Nonstandard Block Sizes を参照してください。
  • 表領域が bigfile の場合、MAX_GB の値は 32 TB と表示されます。ただし、RDS for Oracle の OS の制限により、ファイルは最大 16 TiB までしか拡張できません。

オプションで、次のクエリを実行して、表領域の作成に使用される DDL を取得できます。

SQL> SET LINESIZE 400
SQL> SET LONG 99999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

返された DDL から、表領域に関する必要な情報を取得できます。

表領域のサイズを大きくする

自動拡張機能をオンにした場合は、表領域のタイプにかかわらず、表領域のサイズを大きくする必要はありません。この場合、表領域は必要に応じて自動的にサイズ変更されます。

自動拡張機能をオンにしておらず、表領域のサイズを変更する場合は、次の操作を実行します。

bigfile 表領域の場合: ALTER TABLESPACE コマンドを使用して表領域のサイズを変更します。サイズは、キロバイト (K)、メガバイト (M)、ギガバイト (G)、またはテラバイト (T) で指定できます。bigfile 表領域には単一のデータファイルがあり、このコマンドは表領域に関連付けられた基盤となる単一のデータファイルのサイズを変更します。

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

smallfile 表領域の場合: 表領域にデータファイルを追加することによってのみ、表領域のサイズを変更できます。現在のデータファイルのサイズや設定は変更できません。

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

表領域のサイズを小さくする

表領域が smallfile の場合、基盤となるデータファイルを管理できません。表領域のサイズを大きくするには、新しいデータファイルを追加します。新しいデータファイルを追加するときは、AUTOEXTEND、SIZE、および MAXSIZE に正しい値を選択してください。これらの値は後で変更できません。smallfile 表領域のサイズを小さくするには、必要な領域を持つ新しい表領域を作成し、すべてのデータを新しい表領域に手動で移動します。

表領域が bigfile の場合は、次のいずれかの方法を選択して、表領域のデータ型に基づいて表領域のサイズを小さくします。

PERMANENT 表領域: PERMANENT 表領域のサイズを、表領域のハイウォータマークより小さい値にすることはできません。これが試行された場合、サイズ変更オペレーションは次のエラーで失敗します。

ORA-03297: file contains used data beyond requested RESIZE value

ただし、表領域のサイズが 50 GB で、ハイウォータマークが 40 GB であると仮定した場合、次のようなクエリを実行して、表領域のサイズを 40 GB まで小さくすることができます。

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

表領域のサイズをハイウォータマークより小さい値にすることはできません。このような場合は、次のいずれかを実行できます。

  • 表領域内のオブジェクトを再編成します。
  • 新しい表領域を作成し、すべてのオブジェクトを新しい表領域に移行します。その後、古い表領域を削除します。

TEMPORARY 表領域: TEMPORARY 表領域のサイズを小さくするには、SHRINK コマンドを使用します。

例:

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

リードレプリカの TEMPORARY 表領域のサイズを変更するには、rdsadmin.rdsadmin_util.resize_temp_tablespace パッケージを使用します。

SQL> EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

詳細については、リードレプリカの TEMPORARY 表領域のサイズ変更を参照してください。

- または -

任意のサイズで別の TEMPORARY 表領域を作成し、この新しい TEMPORARY 表領域をデフォルトの TEMPORARY 表領域として設定できます。

1.    次のクエリを実行して、現在のデフォルトの TEMPORARY 表領域を表示します。

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

2.    次のクエリを実行して、新しい TEMPORARY 表領域を作成します。

SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;

3.    次のクエリを実行して、新しい TEMPORARY 表領域をデフォルトの TEMPORARY 表領域として設定します。

SQL> EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

特定のユーザーの TEMPORARY 表領域を変更するには、次の操作を実行します。

1.    次のクエリを実行して、ユーザーの現在のデフォルトの TEMPORARY 表領域を表示します。

SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';

2.    次のクエリを実行して、ユーザーのデフォルトの TEMPORARY 表領域を変更します。

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

UNDO 表領域: まず、ALTER TABLESPACE コマンドを使用して、UNDO 表領域のサイズの縮小を試みます。

次のクエリを実行して、現在使用中の UNDO 表領域を特定します。

SQL> SHOW PARAMETER UNDO_TABLESPACE;

UNDO 表領域のサイズを小さくするには、次のようなクエリを実行します。

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

削除する必要のある UNDO セグメントがストレージにない場合、このクエリは正常に実行されます。

上記のクエリが正常に実行されない場合は、次の操作を実行します。

1.    新しい UNDO 表領域を作成します。

次のようなクエリを実行して、新しい UNDO 表領域を作成します。

SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

2.    新しく作成した表領域をデフォルトの UNDO 表領域として設定します。

パラメータグループの UNDO_TABLESPACE 初期化パラメータを、新しく作成された表領域をポイントするように設定します。詳細については、DB パラメータグループのパラメータの変更を参照してください。

例:

UNDO_TABLESPACE = example-new-tablespace

このパラメータは動的なパラメータであり、変更を適用するためのダウンタイムは発生しません。ただし、この変更後に DB インスタンスを再起動するのがベストプラクティスです。詳細については、Managing Undo を参照してください。

次のクエリを実行して、新しい UNDO 表領域がデフォルトの表領域であることを確認します。

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    古い UNDO 表領域を削除します。

次のようなクエリを実行して、古い UNDO 表領域を削除します。

SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;