2026年9月19日
2026年9月19日
PostgreSQLのログを設定してスロークエリを検出する方法
はじめに
PostgreSQLは高性能なオープンソースデータベースシステムであり、大量のデータを効率的に管理することが可能です。しかし、不適切なSQLクエリによってパフォーマンスが低下するケースも珍しくありません。この記事では、PostgreSQLのログ設定とスロークエリの検出方法について解説します。
症状・背景
なぜ必要なのか?
- パフォーマンスの問題: 不適切なSQLクエリにより、データベースの読み込み速度が低下し、システム全体の応答性に悪影響を及ぼす可能性があります。
- メンテナンスの難しさ: 大量のログファイルから不正なクエリを見つけるのは困難で時間がかかる場合があります。
- セキュリティ上の懸念: 一部のユーザーが意図的に重いSQLクエリを投げ込んで、システムに負荷をかける可能性もあります。
手順・設定方法
ステップ1: クォータリング・パラメータの設定
# ファイルサイズとログフラグメント数を指定
sudo nano /etc/postgresql/<version>/main/postgresql.conf
# 適切な値に設定します。
logging_collector = on # ロギングを有効化するか
log_directory = "pg_log" # ログファイルが保存されるディレクトリ
log_file_mode = 0600 # ファイルアクセス権限
log_statement = 'all' # 全てのクエリをログに記録する
# パフォーマンスの問題に対応するために、ロギングを制御します。
log_min_duration_statement = 1000 # 1000ミリ秒未満のSQL文はログに記録されません
ステップ2: ログフォーマットの設定
# ファイル形式を指定します。
sudo nano /etc/postgresql/<version>/main/pg_log.conf
# 以下のように設定します。
log_line_prefix = '%t [%p-%l] %u@%d ' # ログの形式
ステップ3: スロークエリの定義と監視
# スロークエリの定義を追加します。
sudo nano /etc/postgresql/<version>/main/pg_ident.conf
# 例えば、5秒以上かかるSQL文はログに記録します。
log_min_duration_statement = 5000
ステップ4: ログファイルの検索と分析
# PostgreSQLのロギングディレクトリを確認します。
ls /var/log/postgresql/
# セルフサービスでスロークエリを抽出します。
psql -c "SELECT * FROM pg_stat_statements WHERE total_time > 5000;"
注意事項
- パフォーマンスへの影響: ロギング設定はサーバーのパフォーマンスに影響を与える可能性があります。ログ量が多い場合は、適切なロギングレベルを設定することが重要です。
- セキュリティ上の注意: 重要なデータベース情報がログに記録されるため、アクセス権限は厳格化する必要があります。
- 監視と管理: 定期的にログファイルを確認し、問題のあるクエリを見つけることが求められます。
まとめ
1. ログ設定: PostgreSQLのログ設定を行い、スロークエリを把握します。
2. パフォーマンス改善: 不適切なSQL文を修正することで、全体のパフォーマンスを向上させます。
3. セキュリティ確保: ログファイルのアクセス権限を管理し、不正なアクセスを防ぎます。
関連記事: