2016-09-11 17 views
2

PostgreSQL 9.5で、完全なvacuumを並列実行するためのオプション-jobsを使用して、データベース全体でvacuumdbを実行すると、デッドロックエラー/PostgreSQL --jobsパラメータを使用したときにデッドロックを引き起こす方法を見つけ出す方法

私はちょうどいくつかのプロセス番号とテーブル名を取得しています...これを防ぐにはどうすれば私はsuccessfuly並列にデータベース上の完全な真空を行うことができますか?

答えて

1

負荷のあるVACUUM FULLを完成させることはかなり難しい作業です。問題は、Postgresがテーブルによって占有されている空間を縮小しているため、データ操作がそれを妨害することです。真空テーブルへ

  • ロックアクセス:これらのオプションを持っている完全な真空を達成するため

    。ただし、排他的なロックを取得すると役立つかどうかはわかりません。アプリケーションレベルでテーブルへのアクセスを禁止する必要があるかもしれません。

  • create new table - swap (rename tables) - move data - drop originalテクニックを使用してください。この方法では、元のテーブルの下にスペースを縮小しないで、単にテーブルを落とすだけで解放できます。もちろん、すべてのインデックスを再構築して、FKなどをリダイレクトしています。

もう1つ質問があります。VACUUM FULLが必要ですか? VACUUM ANALYZEは、ファイルシステム上のテーブルを縮小していません。ディスクスペースにあまり制限されていない場合は、それほど完全な真空を行う必要はありません。

希望に役立ちます。

+0

パフォーマンスのためにVACUUM FULLが良いと思いました。データベースは1か月後にサイズが350GBを超え、VACUUM FULLの後は240GBに縮小されています...多くの更新と削除のためにテーブルやインデックスにはゴミがたくさんあると思います。また、VACUUM FULLサイズが小さくなり、索引が再構築されるため、データベースのパフォーマンスが向上します。どういうことだと思います...この場合のパフォーマンスのために私はすべきでしょうか? –

+1

'VACUUM ANALYZE'はパフォーマンス面で必要なすべてを行います。これは、テーブルとインデックスを消去し(さらに使用統計を更新する)、割り当てられた領域を残します。プロシージャの後に、以前に割り当てられた領域が再利用されるため、テーブルのサイズがしばらく大きくならないことがわかります。だから、もしあなたがディスクスペースが必死でなければ、私は生産環境で 'VACUUM ANALYZE'だけを行うよう助言します。 'VACUUM FULL'はいくつかの空きディスク容量を除いて何も追加しません。 –

関連する問題