この記事は公開されてから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でうまくいかない場合や、データが多いときにご利用いただくとお役に立てそうです。