Oracle RDSでストレージ領域を解放する(オフライン再編成)
はじめに
瀬田@大阪オフィスです。
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でうまくいかない場合や、データが多いときにご利用いただくとお役に立てそうです。