ディスクFULLでTRUNCATEができない事案に遭遇したのでそのときの対処をメモで。
そもそも削除できなかった理由
PostgreSQLの場合、TRUNCATE時にも一時ディスク領域を使用するため、結局削除のために利用できるディスク領域が存在しないため、TRUNCATEができない事案に遭遇します。
対処法
1.追加ディスクをマウントする。
USBでもNFSでもなんでもOKです。
対象となるデータベースのディスクスペースの1.5倍程度の容量が必要です。
このときはサーバがデータセンターにあったので追加ディスクが
用意できなかったので、NFSサーバを緊急で立ててディレクトリをマウントしました。
2.追加ディスクにテーブルスペース保管用のディレクトリを作成する
3.対象データベースにコンソールログインする。
4.CREATE TABLESPACEで2で作ったディレクトリにディスクスペースを割り当てる
CREATE TABLESPACE backup_space LOCATION ‘追加ディスクに作成したディレクトリ’;
5.ALTER TABLE 対象テーブル SET TABLESPACE backup_space;
6.テーブルサイズが大きい場合は時間がかかります。
経験則ですが28G程度で15分くらいかかりました。
7.完了するとディスクスペースが空いていますので、TRUNCATEが実施できます。
8.バックアップしたテーブルは元のディスクスペースに戻す場合は
ALTER TABLE 対象テーブル SET TABLESPACE 元のテーブルスペース;
で戻します。
9.戻し終わったら DROP TABLESPACE backup_space;
で綺麗にしておきます。
10.追加したディスクに作成したディレクトリも削除しておきます。
11.これで復旧を再度確認し、問題がなければ完了です。