内容提要
SQL Server DBA 转向 Postgres 时,常惊讶于性能数据默认未被记录。Postgres 监控配置灵活但默认保守:pg_stat_statements 需预加载并重启,日志需手动开启。关键设置包括 log_line_prefix、log_min_duration_statement 及采样,并确保日志目录可被监控用户访问。核心差异是 Postgres 要求提前决定记录内容,否则事后无法补救。
延伸解读
监控哲学差异:从查询时到记录时
SQL Server 的监控数据大多默认记录,DBA 在需要时查询即可。而 Postgres 要求提前决定记录什么,否则事后无法补救。例如,pg_stat_statements 需预加载并重启,日志需手动开启。这种差异意味着从 SQL Server 转来的 DBA 必须改变思维:监控配置不再是事后调优,而是事前规划。
关键配置:日志与统计信息
Postgres 日志配置中,log_line_prefix 至关重要,它决定了每行日志的上下文信息。推荐使用 '%m [%p] %q[user=%u,db=%d,app=%a] ',其中 %q 可避免非会话进程输出无用字段。同时,log_min_duration_statement 应设置阈值(如 1000ms),并配合采样(log_min_duration_sample 和 log_statement_sample_rate)来平衡开销与可见性。pg_stat_statements 则需在 shared_pre
权限与日志访问的常见陷阱
监控用户需要 pg_monitor 角色来查看完整查询文本,而非超级用户。日志目录若默认在 $PGDATA 内,由于数据目录权限限制(0700),监控代理无法遍历访问。应将日志目录移至外部(如 /var/log/postgresql),并确保代理用户属于日志文件所属组。修改组后需重启代理服务。验证时务必以代理用户身份测试,而非 root。
与 SQL Server 的取舍:缺失与优势
Postgres 缺少 Query Store 和 sys.dm_exec_query_plan,无法事后获取已执行查询的计划,必须依赖 auto_explain 在运行时捕获。但 Postgres 也有优势:日志为纯文本,可灵活路由到多个目的地;log_min_duration_statement 在无慢查询时几乎无开销;auto_explain 能捕获生产环境真实执行计划,而 SQL Server 需预先设置会话。
Q&A
从 SQL Server 转到 Postgres 的 DBA,为什么常常发现性能数据没有记录?
因为 Postgres 的监控配置默认非常保守,许多关键统计和日志功能需要手动开启。例如 pg_stat_statements 需要预加载并重启,日志相关设置也需要主动配置。如果事先没有开启,事后无法补救。
Postgres 的 pg_stat_statements 如何启用?需要注意什么?
pg_stat_statements 是一个 contrib 模块,必须通过 shared_preload_libraries 预加载并完全重启服务器(不是重载配置)。重启后,在每个需要查询的数据库中执行 CREATE EXTENSION。常见错误是只执行了 CREATE EXTENSION 而没有预加载,导致查询视图时报错。
Postgres 中如何配置日志才能让监控工具读取?
需要设置 logging_collector = on,并指定 log_directory 为数据目录之外的路径(如 /var/log/postgresql),同时设置 log_file_mode = 0640 和合适的 log_filename。确保监控代理用户属于日志目录的属组,并验证该用户能访问日志文件。
Postgres 的 log_line_prefix 应该怎么设置?为什么重要?
log_line_prefix 是文本日志中唯一能标识每行来源的地方。推荐设置为 '%m [%p] %q[user=%u,db=%d,app=%a] ',其中 %q 让非会话进程不输出用户/数据库信息。如果不设置,日志中缺少数据库、用户和应用信息,无法分组或分析趋势。
Postgres 中如何监控查询性能?有哪些关键设置?
主要依靠 pg_stat_statements 和日志。关键日志设置包括 log_min_duration_statement(记录慢查询)、log_min_duration_sample 和 log_statement_sample_rate(采样)、log_lock_waits、log_temp_files、log_checkpoints、log_autovacuum_min_duration 等。避免使用 log_statement = 'all' 或 log_duration = on,以免产生过多日志。
Postgres 和 SQL Server 在监控方面主要有哪些差异?
Postgres 没有 Query Store,DMV 等价物较少,且没有 sys.dm_exec_query_plan 来查询已执行查询的计划。Postgres 的日志是主要记录,但需要提前决定记录内容;SQL Server 则默认记录更多,可事后查询。Postgres 的 pg_stat_activity 是快照,不累积等待统计,而 SQL Server 有 sys.dm_os_wait_stats。