Oracle RDSでストレージ領域を解放する(オフライン再編成)

2019.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

瀬田@大阪オフィスです。

Postgresqlマンとして生きてきましたが、RDSにあるんじゃあ触るしかないOracle様。データ断片化によるストレージ圧迫と再編成について調査しました。

なぜ領域は確保され続けるか

データをDELETEすればストレージ容量がイメージとしては減りそうですよね。しかし、現実はそうではありません。今までデータが挿入されたことがある最後尾のブロックまでストレージが確保されます(HWM)。DELETE文ではこのHWMの位置を変更することができないため、領域解放には他の手段が必要となります。

ハイウォーターマークについては以下ドキュメントが詳しいです。
ハイウォーターマークを知る

対応方法

以下の対応方法がありますが、今回はALTER TABLE MOVEによるオフラインでのテーブル移行を試してみます。移行中はテーブルの読み書きができなくなるので気をつけてください。

  • TRUNCATEして全データを削除する。
  • Export/Importで再作成。
  • ALTER TABLE MOVEテーブルを移行する。
  • ALTER TABLE SHRINK SPACEで断片化を解消。

コマンド

以下の例ではデフォルトで存在するUSERSテーブルスペースを利用しています。

【ご注意】本番環境で実施する前に必ず検証環境で試してください。

// 1. 移行先のテーブルスペースに対して、ユーザーが領域を許可できるよう、QUOTAを変更します
 ALTER USER ユーザ名 QUOTA UNLIMITED ON USERS;
 
// 2. 移行対象のオブジェクト名および種類(テーブル、インデックス)を調べます
SELECT SEGMENT_NAME, SEGMENT_TYPE, OWNER,BYTES FROM DBA_SEGMENTS WHERE OWNER = 'オーナー名' ORDER BY BYTES DESC;

// 3. 対象のテーブルをALTER TABLE MOVE TABLESPACE文により移行します
ALTER TABLE オーナー名.セグメント名 MOVE TABLESPACE USERS;

// 4. インデックスの場合、ALTER INDEX REBUILD TABPESACE文を利用します
ALTER INDEX オーナー名.セグメント名 REBUILD TABLESPACE USERS;

最後に

Export/Imporでうまくいかない場合や、データが多いときにご利用いただくとお役に立てそうです。