Amazon RDS for Oracle DB インスタンスでテーブルスペースのサイズを変更する方法を教えてください。

所要時間3分
0

Oracle DB インスタンスで、Amazon Relational Database Service (Amazon RDS) のテーブルスペースを管理したり、サイズを変更したりする方法を知りたいです。

簡単な説明

Amazon RDS for Oracle インスタンス用のデフォルトのテーブルスペースタイプは、bigfile です。RDS for Oracle インスタンスに smallfile テーブルスペースを使用することは、ベストプラクティスではありません。

smallfile テーブルスペースを使用する RDS for Oracle インスタンスには、次の制限が適用されます。

  • ALTER DATABASE コマンドは RDS for Oracle ではサポートされていないため、ALTER DATABASE クエリを実行してデータファイルのサイズを変更したり、構成を変更したりすることはできません。詳細については、「Oracle DBA 権限の制限事項」をご覧ください。
  • データベース内のデータファイルの最大数を定義するには、db_files パラメータを手動で管理する必要があります。データファイルの数がこの制限に近づいたら、db_files パラメータを変更します。

データファイルサイズを指定しない場合、テーブルスペースを作成すると AUTOEXTEND ON がデフォルトで有効になります。bigfile テーブルスペースの最大サイズは 16 TiB です。テーブルスペースにデータを挿入すると、テーブルスペースは、そのテーブルスペースが必要とする設定済みの最大制限まで増加します。または、テーブルスペースが RDS インスタンスに割り当てられるストレージの最大制限まで増加します。

RDS インスタンスに割り当てられたストレージがいっぱいになると、インスタンスは STORAGE_FULL 状態に切り替わり、テーブルスペースを拡張できなくなります。この問題を解決するには、インスタンスにストレージスペースを追加する必要があります。詳細については、「Amazon RDS DB インスタンスのストレージが不足したときに発生する問題を解決する方法を教えてください」を参照してください。

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

解決策

RDS for Oracle インスタンスのテーブルスペースのサイズを変更するには、次の手順を実行します。

テーブルスペースの設定を確認する

次の手順を実行します。

  1. テーブルスペースの種類を識別するには、次の例のようなクエリを実行します。
    SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;
    テーブルスペースの種類は、permanentundotemporarysmallfilebigfile のいずれかであることに注意してください。
  2. データファイルのサイズ、設定されている最大制限を確認し、autoextend 機能が有効になっているかどうかを確認するには、次のクエリを実行します。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;

これらのクエリの出力には、次の詳細が表示される場合があります。

  • autoextend 機能が有効になっていない場合、MAX_GB の値は 0 に等しくなります。
  • テーブルスペースの種類が smallfile の場合、MAX_GB の値はテーブルスペースの作成に使用されたブロックサイズに左右されます。たとえば、使用するブロックサイズが 8K の場合、MAX_GB の値は 32 GB です。詳細については、Oracle のウェブサイトで「非標準ブロックサイズ」を参照してください。
  • テーブルスペースの種類が bigfile の場合、MAX_GB の値は 32 TB と表示されます。RDS for Oracle DB インスタンス内の単一ファイルの最大サイズは 16 TiB です。

テーブルスペースのデータ記述言語 (DDL) を取得するには、次のクエリを実行します。

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

返された DDL から、テーブルスペースに関する必要な情報を取得できます。

テーブルスペースのサイズを増やす

autoextend 機能を有効にした場合、テーブルスペースのサイズを増やす必要はありません。

ただし、autoextend 機能を有効にしてからテーブルスペースのサイズを変更する場合は、次の要件を満たす必要があります。

bigfile テーブルスペースの場合、テーブルスペースのサイズを変更するには、ALTER TABLESPACE コマンドを実行します。

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

詳細については、Oracle のウェブサイトで ALTER TABLESPACE を参照してください。サイズをキロバイト (K)、メガバイト (M)、ギガバイト (G)、またはテラバイト (T) で指定します。bigfile テーブルスペースには単一のデータファイルがあり、ALTER TABLESPACE コマンドでそのテーブルスペースに属するデータファイルのサイズを変更します。

smallfile テーブルスペースの場合、データファイルを追加してテーブルスペースのサイズを増やします。

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

smallfile テーブルスペースにある元のデータファイルのサイズを変更するには、rdsadmin_util.resize_datafile を実行します。

SQL> select file_id,file_name, bytes/1024/1024/1024 gb from dba_data_files where tablespace_name='TEST';

出力の例を次に示します。

FILE_ID FILE_NAME                                                   GB
=======================================================================
6      /rdsdbdata/db/TESTDB_A/datafile/o1_mf_test_m03xlfq8_.dbf      1
SQL> exec rdsadmin.rdsadmin_util.resize_datafile(6,'2G')

PL/SQL procedure successfully completed.
SQL> select file_id,file_name, bytes/1024/1024/1024 gb from dba_data_files where tablespace_name='TEST';
FILE_ID FILE_NAME                                                     GB
=========================================================================
 6      /rdsdbdata/db/TESTDB_A/datafile/o1_mf_test_m03xlfq8_.dbf      2

テーブルスペースのサイズを小さくする

smallfile テーブルスペースのサイズを減らすには、次の手順を実行します。

  1. smallfile ファイルテーブルスペースのサイズを減らすには、rdsadmin_util.resize_datafile を実行します。
    注: データファイルのサイズは、データファイルの上限より小さい値に減らすことはできません。
  2. 新しいテーブルスペースを作成し、必要に応じてそのスペースで設定を行います。次に、すべてのデータを新しいテーブルスペースに手動で移動します。

テーブルスペースが bigfile である場合、テーブルスペースの種類に基づいてテーブルスペースのサイズを減らすには、次の方法のいずれかを行います。

permanent テーブルスペースの場合、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;

リードレプリカの一時テーブルスペースのサイズを変更するには、rdsadmin.rdsadmin_util.resize_temp_tablespace を実行します。

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

または、

別の一時テーブルスペースを作成し、必要なサイズを設定します。次に、新しい temporary テーブルスペースをデフォルトの temporary テーブルスペースに設定します。

  1. 現在のデフォルトの一時テーブルスペースを確認するには、次のクエリを実行します。

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

    詳細は、Oracle のウェブサイトで「表領域に関する情報を閲覧する」を参照してください。

  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');

特定のユーザーの一時テーブルスペースを変更するには、次の手順を実行します。

  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 テーブルスペースのサイズを減らすには、次のクエリ例と同様のクエリを実行します。

クエリが正常に実行されない場合は、次の手順を実行してください。

  1. 新しい undo テーブルスペースを作成します。

    SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;
  2. 新しく作成したテーブルスペースをデフォルトの undo テーブルスペースに設定します。

    UNDO_TABLESPACE = example-new-tablespace

    パラメータグループで、UNDO_TABLESPACE 初期化パラメータが新しく作成されたテーブルスペースを指すように設定します。
    詳細については、「DB パラメータグループを使用する」をご参照ください。
    UNDO_TABLESPACE 初期化パラメータは動的パラメータであり、変更を適用してもダウンタイムは発生しません。ただし、変更を加えた後は DB インスタンスを再起動するのがベストプラクティスです。詳細については、Oracle のウェブサイトで「undo の管理」を参照してください。
    新しい undo テーブルスペースがデフォルトのテーブルスペースであることを確認するには、次のクエリを実行します。

    SQL> SHOW PARAMETER UNDO_TABLESPACE;
  3. 以前の undo テーブルスペースを削除するには、テーブルスペースの削除クエリを実行します。

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

関連情報

CloudWatch アラームを作成して Amazon RDS の空きストレージ容量を監視し、ストレージフルの問題を防ぐ方法を教えてください

Amazon RDS ストレージの自動スケーリングを使用して容量を自動管理する

Amazon RDS for Oracle DB インスタンスが予想よりも多くのストレージを使用している理由を教えてください

コメントはありません