質問

「ちょっとした」問題があるんです。1 週間前、データベースのディスク容量がいっぱいになりました。ディスク領域を解放しようとして、さまざまなテーブルの多くの行を削除しました。その後、完全な真空引きを実行しようとしましたが、完了しませんでした。

私が知りたいのは。バキュームの完全な完了を停止すると、手動で削除する必要がある一時ファイルがディスク上に残りますか?現在、データベースのディスク容量が 100% になっていますが、言うまでもなく、これは大きな問題です。

ディスク容量を解放するためのヒントはありますか?

postgres 8.1.4 データベースで SUSE を実行しています。

役に立ちましたか?

解決

初めに:

アップグレード

8.2、8.3、または 8.4 にアップグレードできない場合でも、少なくとも最新の 8.1 (現時点では 8.1.17 ですが、1 ~ 2 日以内に 8.1.18 になります) にアップグレードしてください。

2番目:何が問題なのかを診断します。

使用 デュ スペースが正確にどこに行ったかを診断するツール。どのディレクトリが多くのスペースを占有しているのでしょうか?

確認する DF 使用されている合計スペースがどれくらいかを確認し、そのうち PostgreSQL ディレクトリがどのくらいのスペースを占めているかを確認します。

最良の選択肢は次のとおりです。

cd YOUR_PGDATA_DIR
du -sk *
cd base
du -sk *
cd LARGEST DIR FROM PREVIOUS COMMAND
du -sk * | sort -nr | head

これで、PGDATA 内のどのディレクトリがスペースを使用しているかがわかったので、それに対して何かを行うことができます。

ログまたは pg_temp の場合 - pg を再起動するか、ログを削除します (pg_clog と pg_xlog は、一般的な意味でのログではありません。そこから何も削除しないでください)。

それがベースディレクトリにある場合は、次のようにします。

ベースディレクトリ内の数値ディレクトリはデータベースに関連します。次のようにして確認できます。

select oid, datname from pg_database;

ほとんどのスペースを使用しているデータベースがわかったら、それに接続し、どのファイルがスペースのほとんどを使用しているかを確認します。

ファイル名は、オプションの「.digits」接尾辞が付いた数値になります。この接尾辞は(今のところ)無関係です。次のコマンドを実行すると、ファイルが正確に何を表しているかを確認できます。

select relname from pg_class  where relfilenode = <NUMBER_FROM_FILE_NAME>;

どのテーブル/インデックスがスペースの大部分を使用しているかがわかったら、VACUUM FULL を実行するか、(はるかに良い) コマンドを発行することができます。 集まる 彼らに命令してください。

他のヒント

問題に新たに接したものについては、データベース内の何が多くのスペースを使用しているかを調べることができます。 クエリ. 。これは、削除された情報を含むも​​のをクリーンアップするために十分な作業スペースを再利用するために、TRUNCATE の候補を見つけるのに役立ちます。

大量の行を削除しても、ディスク容量を維持できるほど頻繁に VACUUM を実行しないと、インデックスの肥大化と呼ばれる状態が発生することが多く、VACUUM FULL ではまったく解決しないことに注意してください。私が提案したクエリで、スペースのほとんどが通常のテーブルではなくインデックスによって占められていることが示されれば、そこにいることはわかります。この問題から回復するには、すべてを再構築するためにテーブル自体と同じくらいの空きディスク領域を必要とする CLUSTER が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top