スキップしてコンテンツを表示

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

所要時間3分
0

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

簡単な説明

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

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

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

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

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

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

解決策

**注:**次のコマンドの TABLESPACE_NAME または example-tablespace は、ご利用のテーブルスペースの名前に置き換えてください。

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

テーブルスペースタイプを特定するには、次のクエリを実行します。

SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

上記のコマンドを実行すると、次の出力を返す場合があります。

  • BIGFILE 列は、BIGFILE の場合に YESSMALL FILE の場合に NO の値が表示されます。
  • CONTENTS 列は、permanentundotemporary のいずれかです。

データファイルのサイズ、設定済みの最大クォータ、autoextend 機能が有効になっているかどうかを確認するには、次のクエリのいずれかを実行します。

permanent テーブルスペースと undo テーブルスペースの場合は、次のクエリを実行します。

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 テーブルスペースの場合は、次のクエリを実行します。

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 の値はテーブルスペースの作成時に使用したブロックサイズに左右されます。たとえば、ブロックサイズが 8 K の場合、MAX_GB の値は 32 GB です。詳細については、Oracle のウェブサイトで「Nonstandard block sizes」を参照してください。
  • テーブルスペースタイプが bigfile の場合、MAX_GB の値は 32 TB と表示されます。RDS for Oracle DB インスタンス内の単一ファイルの最大サイズは 16 TiB です。

データ定義言語 (DDL) からテーブルスペースに関する必要な情報を取得するには、次のコマンドを実行します。

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

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

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

ただし、autoextend 機能をオンにしてからテーブルスペースのサイズを変更する場合は、サイズ変更時に次のアクションを実行する必要があります。

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

    ALTER TABLESPACE example-tablespace RESIZE 50G;

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

  • smallfile テーブルスペースの場合は、次のコマンドを実行し、データファイルを追加してテーブルスペースのサイズを増やします。

    ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;
  • smallfile テーブルスペースの場合は、次のコマンドを実行し、rdsadmin_util.resize_datafile プロシージャを使用して元のデータファイルのサイズを変更します。

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

    **注:**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 テーブルスペースのサイズを小さくする

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

  1. rdsadmin_util.resize_datafile プロシージャを使用する。
    **注:**データファイルのサイズは、データファイルの最高水位標より小さい値に減らすことはできません。
  2. 新しいテーブルスペースを作成して、要件に合わせてスペースを設定する。
  3. すべてのデータを新しいテーブルスペースに手動で移動する。

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

bigfile テーブルスペースを使用する場合は、次のいずれかの方法でテーブルスペースのサイズを小さくします。

permanent テーブルスペース

permanent テーブルスペースのサイズを小さくして、テーブルスペースの最高水位標を下回る値にしようとすると、サイズ変更操作が失敗します。その場合、次のエラーメッセージが表示されます。

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

テーブルスペースのサイズが最高水位標を上回っている場合は、permanent テーブルスペースのサイズを最高水位標まで小さくすることができます。

たとえば、最高水位標が 40 GB で、テーブルスペースのサイズが 50 GB の場合、テーブルスペースを 40 GB まで小さくします。

テーブルスペースのサイズを変更するコマンドの例

ALTER TABLESPACE example-tablespace RESIZE 40G;

テーブルスペースのサイズを最高水位標と同じ値まで小さくすることができない場合は、次のアクションを実行します。

  • テーブルスペース内のオブジェクトを再編成する。
  • 新しいテーブルスペースを作成し、すべてのオブジェクトを新しいテーブルスペースに移動する。その後、古いテーブルスペースを削除する。

temporary テーブルスペース

次のコマンドを実行して temporary テーブルスペースを小さくします。

ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

リードレプリカの temporary テーブルスペースのサイズを変更するには、次のコマンドに rdsadmin.rdsadmin_util.resize_temp_tablespace を含めます。

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

または、別の temporary テーブルスペースを作成し、その新しいテーブルスペースをデフォルトに設定します。

次の手順を実行します。

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

    SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

    **注:**詳細は、Oracle のウェブサイトで「Viewing information about tablespaces」を参照してください。

  2. 次のコマンドを実行して、別の temporary テーブルスペースを作成し、必要なサイズを設定する。

    CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;
  3. 次のコマンドを実行して、新しい temporary テーブルスペースをデフォルトの temporary テーブルスペースに設定する。

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

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

  1. 次のクエリを実行して、ユーザーの現在のデフォルトの temporary テーブルスペースを確認する。

    SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';
  2. 次のコマンドを実行して、デフォルトの temporary テーブルスペースを変更する。

    ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

undo テーブルスペース

次の手順を実行します。

  1. 次のクエリを実行して、現在使用中の undo テーブルスペースを特定する。

    SHOW PARAMETER UNDO_TABLESPACE;
  2. 次のコマンドを実行して、undo テーブルスペースのサイズを小さくする。

    `ALTER TABLESPACE example-tablespace RESIZE 40G;`

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

  1. 次のコマンドを実行して、新しい undo テーブルスペースを作成する。

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

    **注:**example-new-tablespace は、新しい undo テーブルスペースの名前に置き換えてください。

  2. 次のコマンドを実行して、undo テーブルスペースをパラメータグループのデフォルトのテーブルスペースに設定する。

    UNDO_TABLESPACE = example-new-tablespace

    **注:**UNDO_TABLESPACE は動的パラメータなので、変更してもダウンタイムは発生しません。ただし、変更を加えた後は DB インスタンスを再起動するのがベストプラクティスです。詳細については、Oracle のウェブサイトで「Managing undo」を参照してください。

  3. 次のクエリを実行して、新しい undo テーブルスペースがデフォルトのテーブルスペースであることを確認する。

    SHOW PARAMETER UNDO_TABLESPACE;
  4. 次のコマンドを実行して、古い undo テーブルスペースを削除する。

    DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;

関連情報

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

Amazon RDS ストレージの自動スケーリングによる容量の自動管理

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

コメントはありません

関連するコンテンツ