部分的に構築され、停電によって終了したインデックスによって使用されたスペースを再利用する方法


9

Mac(10.10.4)でpostgres(postgis)9.4.2を実行しています。

私はいくつかの大きなテーブル(数TB)を持っています。

そのうちの1つで約1週間かかるインデックス作成中に、停電がバッテリーユニットとシステムよりも長く続いたときにインデックスが終了するポイントに近いと予想されるので、利用可能なHDスペースの低下を観察しました降りた。fillfactor=100静的データソースであるため、私はバッファをオフにしていて、ビルド中にそれを行いました。再起動時に、ドライブに残っている使用可能なスペースは、インデックスビルドのほぼ終了時とまったく同じです。真空分析はスペースを解放しません。

テーブルを落として再度取り込みましたが、スペースは落ちませんでした。現在、インデックスを作成するための十分なスペースがない場所にいます。

インデックスの構築中に生成されたファイルは、停電中にマシンがダウンした方法が原因でシステムによって削除できない場所でスタックしていますか?

テーブルサイズとデータベース内のインデックス(そのドライブ上の唯一のデータ)を見ると、合計で6TBです。ドライブです8TB未満、そこにある500ギガバイトは、インデックスがあったであろうという大きさです1.5TB失われたどこかに約あるようですので、ドライブに残しました。

何か案は?


インデックスはまだこのようなクエリでリストされていますか? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
Kassandry 2015

いいえ、そのクエリの結果には表示されません。
dkitchel

1
リストにSELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;あなたに与えるものはありますか?
dezso

いいえ、それは空になります。
dkitchel

回答:


5

通常、postgresを再起動すると、クラッシュリカバリプロセスにより、ロールバックされたインデックスに関連するファイルがデータディレクトリから削除されたはずです。

それが機能しなかった、または少なくとも手動でチェックする必要があると仮定しましょう。

datadirにあるファイルのリストは、次のようなクエリで設定できます。

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0デフォルトのテーブルスペース用です。問題のあるインデックスがデフォルト以外のテーブルスペースに作成された場合、これ0はのOIDで置き換える必要がありますpg_tablespace

i、r、t、S、mはrelkindそれぞれ、インデックス、テーブル、トーストスペース、シーケンス、マテリアライズドビューに対応しています。これらすべてのオブジェクトは、名前が一致するファイルにデータを持っていますpg_relation_filenode(oid)

ディスクでは、データファイルは下に$PGDATA/base/oid/あります。oidoidによって取得されたデータベースのselect oid,datname from pg_databaseです。デフォルトのテーブルスペースについて話していない場合はbasePG_version_somelabel代わりにに置き換えられます。

そのディレクトリでrelfilenodesに一致するファイルを一覧表示して並べ替えます。

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(実際には1Gbより大きいリレーションの最初のセグメントのみが保持されます。何にも接続されていない残存セグメントがある場合は、個別に検討する必要があります)

上記のクエリの結果でそのファイルを比較します。

dbが認識しているオブジェクトに対応しない残存データファイルがある場合、それらはその差分に表示されます。


驚くばかり!選択リストに表示されないファイルがdatadirに1つ見つかりました。そのファイルを安全に削除できますか?
dkitchel

実際には、それはドットの後に反復がある約800個のファイルに対応しています-すべて499807.484などです。これらのファイルを安全に削除できますか?
dkitchel

@dkitchel:巨大なインデックスの場合、それはそれぞれ1Gbのセグメントになります。それらのタイムスタンプが、インデックスの作成が実行されていたときと一致していることを確認してください。それらを削除することについては、まあ、私は上記の私の推論が正しいことを願っていますが、それはあなたのデータなので、最終的にはあなたの決定です!
DanielVérité2015

はい、タイムスタンプはインデックスが作成された時期と一致しており、ファイルサイズの合計はインデックスの大きさに対応しています。あなたの推論はしっかりしているようです。自信を持ってやっていきます。トンありがとう。
dkitchel

フォローアップするだけで、同じ窮地に陥っている他の人が@DanielVeriteのソリューションを安心して使用できます。彼の解決策は確かに私にとって完璧に機能しました。
dkitchel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.