PostgreSQL:TRUNCATE後にディスク領域が解放されない


12

私はTRUNCATEと呼ばれる巨大な(〜120Gb)テーブルを持っていますfiles

TRUNCATE files;
VACUUM FULL files;

テーブルサイズは0ですが、ディスク領域は解放されていません。失われたディスク容量を回収する方法はありますか?

更新: 12時間後にディスク領域が解放されましたが、何も操作しませんでした。Ubuntu 8.04サーバーを使用しています。


私は「バキュームイット!」を提案しようとしていましたが、あなたがやったことを考慮して、私はこれをpg-hackersまたはpg-performanceリストのいずれかに引き継ぐことをお勧めします1)。
デニスドバーナーディ

このリンク(postgresql.1045698.n5.nabble.com/…)から何かアドバイスはありますか?たぶん、テーブルなどにアクセスする何かがまだあるでしょう。
-DrColossos

@DrColossos:ソースのコメント(現時点では見つけられないコメント)を読んで、PostgreSQLがすべての接続に切り捨てが行われようとしていることを通知し、必要なリソースをロックしたと述べました。(テーブル自体、インデックス、シーケンス、およびトーストテーブルなど、いくつかあります。)ExecuteTruncate()をトレースすることで、以前にコメントを見つけたと確信していますが、それについて100%肯定的ではありません。
マイクシェリル 'キャットリコール'

回答:


12

よると、ソース内のコメントはtruncate新しい空のストレージ・ファイルを作成し、コミット時に古いストレージファイルを削除します。(OSは、「ストレージファイル」は単なるファイルであると示唆していますが、用語を誤解している可能性があります。)

リレーション用の新しい空のストレージファイルを作成し、relfilenode値として割り当てます。古いストレージファイルは、コミット時に削除するようにスケジュールされています。

ファイルを削除しているように見えるので、基になるオペレーティングシステムがそのスペースをすぐに解放しない場合がいくつかあります。たとえば、Windowsの場合、ストレージファイルが最終的にはごみ箱に入れられることがあると思います。しかし、私の場合、PostgreSQL 9でテーブルを切り捨てると、Windowsですぐに空き領域が増えました。

切り捨てもWALログに記録されます。どれだけの効果があるのか​​わかりません。


2
別のバックエンドプロセスが開いているファイルへのファイル記述子をまだ持っていることが考えられます。これが再び発生する場合は、他のすべてのバックエンドプロセスを終了して、違いが生じるかどうかを確認します。
ピーターアイゼントラウト

私はExecuteTruncate()がそれが起こらないことを確認することになっていることを読んだと確信しています。最終的に古いストレージファイルを削除するために必要なリソースのロックのすべての部分。しかし、ソースのどこでそれを見つけたのかわかりません。オンラインで閲覧しています。そのように迷うのは簡単です。
マイクシェリル 'キャットリコール'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.