📘

Aurora PostgresのVACUUM運用

2023/03/03に公開

参考

https://www.postgresql.jp/document/13/html/maintenance.html
https://www.2ndquadrant.com/en/blog/postgresql-vacuum-and-analyze-best-practice-tips/
https://aws.amazon.com/jp/blogs/database/understanding-autovacuum-in-amazon-rds-for-postgresql-environments/
https://qiita.com/neustrashimy/items/b3d64b749582b32ad0ff

目的

PostgreSQLのVACUUMコマンドは以下の理由により定期的にそれぞれのテーブルを処理しなければならない。

  • 更新、あるいは削除された行によって占められたディスク領域の復旧または再利用。
  • PostgreSQL問い合わせプランナによって使用されるデータ統計情報の更新。
  • 可視性マップの更新。 これによりインデックスオンリースキャンが高速化される。
  • トランザクションIDの周回またはマルチトランザクションIDの周回による非常に古いデータの損失を防止。

考え方

  • 定常的なVACUUMはAUTO VACUUMに任せる
  • AUTO VACUUMが適切に実行されているかをモニタリングし、必要に応じて関連パラメータをチューニングする
  • AUTO VACUUMが何らかの理由で適切に実行されてない場合、対象TABLEへの手動 VACUUM実行を検討する
  • 何らかのメンテナンス等でテーブル内レコードの大半が書き換わったり、明確なパフォーマンス劣化が発生した場合にスポット対応で VACUUME FULL 実行を検討する(TABLE、INDEXが再作成される)

AUTO VACUUMのモニタリング項目

Postgresテスト環境を建てNewrelic Dashboardでモニタリングするデモ用コード
https://github.com/kubokkey/newrelic-lab.git

  • VACUUM処理時間
    • log_autovacuum_min_duration パラメータを設定し、時間のかかっている処理があったらログ出力する
  • VACUUM、ANALYSEの最終実行時間、実行回数
  • TABLEレコード数、サイズ
  • TABLE dead tuple数、率
SELECT
  relname,
  n_live_tup,
  n_dead_tup,
  CASE n_dead_tup WHEN 0 THEN 0 ELSE round(n_dead_tup*100/(n_live_tup+n_dead_tup) ,2) END AS ratio
FROM
  pg_stat_user_tables ;
         relname          | n_live_tup | n_dead_tup | ratio  
--------------------------+------------+------------+--------
 follow_requests          |          0 |          7 | 100.00
 oauth_access_grants      |         24 |         18 |  42.00
 oauth_applications       |        177 |          0 |      0
 mentions                 |      55841 |        124 |   0.00
 notifications            |       1000 |        106 |   9.00
 conversations            |     445718 |        411 |   0.00
 web_settings             |         61 |         21 |  25.00
 blocks                   |         25 |          8 |  24.00
 web_push_subscriptions   |         34 |         34 |  50.00
 imports                  |          0 |          2 | 100.00
 schema_migrations        |        125 |          0 |      0
 statuses_tags            |      77548 |        334 |   0.00
 statuses                 |     454747 |      32883 |   6.00
 domain_blocks            |         19 |         51 |  72.00
 account_domain_blocks    |          1 |          2 |  66.00
 media_attachments        |      50458 |       3729 |   6.00
 status_pins              |          3 |          3 |  50.00
 preview_cards            |      11106 |        179 |   1.00
 preview_cards_statuses   |      15567 |        950 |   5.00
 tags                     |       7414 |          0 |      0
 oauth_access_tokens      |        297 |         70 |  19.00
 stream_entries           |       9662 |          0 |      0
 session_activations      |        167 |         78 |  31.00
--MORE--

Discussion