当前位置: 首页 > news >正文

Learning PostgresSQL读书笔记: 第16章 Configuration and Monitoring

本章将涵盖以下主题:

  • 集群配置
  • 监控集群
  • 使用 pg_stat_statements 进行高级统计

集群配置

三个主要配置文件,均位于PGDATA目录:

  • postgresql.conf:主配置文件。可手工编辑。
  • postgresql.auto.conf:保存通过 ALTER SYSTEM 命令提供的设置。和postgresql.conf 一起被读取。其设置会覆盖 postgresql.conf 中的设置。不要手工编辑。
  • pg_hba.conf:客户端身份验证

检查所有配置参数

当前会话配置可查看视图pg_settings,配置文件中存储的值可查询pg_file_settings:

$ psql
psql (16.9)
Type "help" for help.postgres=# select count(*) from pg_settings;count
-------372
(1 row)postgres=# select setting from pg_settings where name = 'search_path';setting
-----------------"$user", public
(1 row)postgres=# select setting from pg_file_settings where name = 'search_path';setting
---------
(0 rows)postgres=# set search_path='hr';
SET
postgres=# select setting from pg_settings where name = 'search_path';setting
---------hr
(1 row)postgres=# select setting from pg_file_settings where name = 'search_path';setting
---------
(0 rows)

查看参数来源及是否需要重启生效:

-- 如果配置文件中的值已更改但需要重新启动,则 pending_restart 为 true。
postgres=# select name, setting, sourcefile, sourceline from pg_settings where pending_restart is true;name | setting | sourcefile | sourceline
------+---------+------------+------------
(0 rows)postgres=# select name, setting, sourcefile, sourceline from pg_settings where sourcefile is not null;name            |      setting       |               sourcefile               | sourceline
----------------------------+--------------------+----------------------------------------+------------DateStyle                  | ISO, MDY           | /var/lib/pgsql/16/data/postgresql.conf |        716default_text_search_config | pg_catalog.english | /var/lib/pgsql/16/data/postgresql.conf |        742dynamic_shared_memory_type | posix              | /var/lib/pgsql/16/data/postgresql.conf |        153lc_messages                | en_US.UTF-8        | /var/lib/pgsql/16/data/postgresql.conf |        732lc_monetary                | en_US.UTF-8        | /var/lib/pgsql/16/data/postgresql.conf |        734lc_numeric                 | en_US.UTF-8        | /var/lib/pgsql/16/data/postgresql.conf |        735lc_time                    | en_US.UTF-8        | /var/lib/pgsql/16/data/postgresql.conf |        736log_destination            | stderr             | /var/lib/pgsql/16/data/postgresql.conf |        450log_directory              | log                | /var/lib/pgsql/16/data/postgresql.conf |        463log_filename               | postgresql-%a.log  | /var/lib/pgsql/16/data/postgresql.conf |        465log_line_prefix            | %m [%p]            | /var/lib/pgsql/16/data/postgresql.conf |        565log_rotation_age           | 1440               | /var/lib/pgsql/16/data/postgresql.conf |        469log_rotation_size          | 0                  | /var/lib/pgsql/16/data/postgresql.conf |        471log_timezone               | UTC                | /var/lib/pgsql/16/data/postgresql.conf |        603log_truncate_on_rotation   | on                 | /var/lib/pgsql/16/data/postgresql.conf |        474logging_collector          | on                 | /var/lib/pgsql/16/data/postgresql.conf |        457max_connections            | 100                | /var/lib/pgsql/16/data/postgresql.conf |         65max_wal_size               | 1024               | /var/lib/pgsql/16/data/postgresql.conf |        247min_wal_size               | 80                 | /var/lib/pgsql/16/data/postgresql.conf |        248shared_buffers             | 16384              | /var/lib/pgsql/16/data/postgresql.conf |        130shared_preload_libraries   | pgaudit            | /var/lib/pgsql/16/data/postgresql.conf |        749TimeZone                   | UTC                | /var/lib/pgsql/16/data/postgresql.conf |        718
(22 rows)

SHOW显示运行时参数的值:

postgres=# \h show
Command:     SHOW
Description: show the value of a run-time parameter
Syntax:
SHOW name
SHOW ALLURL: https://www.postgresql.org/docs/16/sql-show.htmlpostgres=# show shared_buffers;shared_buffers
----------------128MB
(1 row)postgres=# show all;name                     |                setting                 |description---------------------------------------------+----------------------------------------+-------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------allow_in_place_tablespaces                  | off                                    | Allows tablespaces directly inside pg_tblspc, for testing.allow_system_table_mods                     | off                                    | Allows modifications of the structure of system tables.application_name                            | psql                                   | Sets the application name to be reported in statistics and logs.archive_cleanup_command                     |                                        | Sets the shell command that will be executed at every restart point.archive_command                             | (disabled)                             | Sets the shell command that will be called to archive a WAL file.
...

查找配置错误

postgres=# SELECT name, setting, sourcefile, sourceline, applied, error FROM pg_file_settings where name = 'log_destination';
-[ RECORD 1 ]--------------------------------------
name       | log_destination
setting    | stderr
sourcefile | /var/lib/pgsql/16/data/postgresql.conf
sourceline | 450
applied    | t
error      |

关注两个字段:

  • error:如果不为空,则显示一条错误消息,指出为什么无法应用此条目
  • applied:如果值可以成功应用,则返回 True

嵌套配置文件

指以下几个指令:

  • include:指定要读取和处理的另一个文件,就好像该文件此时被插入到配置文件中一样。
  • include_if_exists:其作用与 include 指令相同,除非引用的文件不存在或无法读取。
  • include_dir:指定要包含的配置文件的整个目录。

配置上下文

即context。

postgres=# select distinct context from pg_settings order by 1;context
-------------------backendinternalpostmastersighupsuperusersuperuser-backenduser
(7 rows)

按更改设置的难度递减顺序,它们分别是:

  • internal
    这些设置无法直接更改;它们反映内部确定的值。其中一些可以通过使用不同的配置选项重建服务器或更改提供给 initdb 的选项来调整。

  • postmaster
    这些设置只能在服务器启动时应用,因此任何更改都需要重新启动服务器。这些设置的值通常存储在 postgresql.conf 文件中,或在启动服务器时通过命令行传递。

  • sighup
    无需重新启动服务器,即可在 postgresql.conf 中更改这些设置。向 postmaster 发送 SIGHUP 信号,使其重新读取 postgresql.conf 并应用更改。postmaster 还会将 SIGHUP 信号转发给其子进程,以便它们都获取新值。

  • superuser-backend
    无需重启服务器,即可在 postgresql.conf 中更改这些设置。您也可以在连接请求数据包中为特定会话设置这些设置(例如,通过 libpq 的 PGOPTIONS 环境变量),但前提是连接用户是超级用户或已被授予相应的 SET 权限。但是,这些设置在会话启动后不会改变。如果您在 postgresql.conf 中更改这些设置,请向 postmaster 发送 SIGHUP 信号,使其重新读取 postgresql.conf。新值只会影响后续启动的会话。

  • backend
    无需重启服务器,即可在 postgresql.conf 中更改这些设置。您也可以在连接请求数据包中为特定会话设置这些设置(例如,通过 libpq 的 PGOPTIONS 环境变量);任何用户都可以对其会话进行此类更改。但是,这些设置在会话启动后不会改变。如果您在 postgresql.conf 中更改了这些设置,请向 postmaster 发送 SIGHUP 信号,使其重新读取 postgresql.conf。新值只会影响后续启动的会话。

  • superuser
    这些设置可以在 postgresql.conf 中设置,也可以在会话中使用 SET 命令进行设置;但只有超级用户和拥有相应 SET 权限的用户才能通过 SET 命令更改它们。只有在未使用 SET 命令设置会话本地值的情况下,postgresql.conf 中的更改才会影响现有会话。

  • user
    这些设置可以在 postgresql.conf 中设置,也可以在会话中使用 SET 命令进行设置。任何用户都可以更改其会话本地值。只有在未使用 SET 命令设置会话本地值的情况下,postgresql.conf 中的更改才会影响现有会话。

主要配置设置

分为以下几大类:

  • 连接和身份验证
  • 资源消耗
  • 预写日志(WAL)
  • 复制
  • 查询规划
  • 错误报告和日志记录
  • 运行时统计
  • 自动清理
  • 客户端连接默认值
  • 锁管理
  • 版本和平台兼容性
WAL 设置

详见这里。

  • wal_level
    决定写入 WAL 的信息量。默认值为 replica,表示写入的数据足以支持 WAL 归档和复制,包括在备用服务器上运行只读查询。
  • fsync
    默认值为on,PostgreSQL 服务器将尝试通过发出 fsync() 系统调用或各种等效方法(参见 wal_sync_method)来确保更新已物理写入磁盘。这确保了数据库集群在操作系统或硬件崩溃后能够恢复到一致状态。
  • synchronous_commit
    指定数据库服务器向客户端返回“成功”指示之前必须完成多少次 WAL 处理。有效值为 remote_apply、on(默认值)、remote_write、local 和 off。
  • wal_compression
    此参数使用指定的压缩方法启用 WAL 压缩。默认为off。
  • checkpoint_timeout
    自动 WAL 检查点之间的最长时间。
  • checkpoint_completion_target
    指定检查点完成的目标,以检查点之间总时间的百分比表示。

pg_test_fsync可用于确定 PostgreSQL 最快的 wal_sync_method:

$ pg_test_fsync
5 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync is Linux's default)open_datasync                      2355.955 ops/sec     424 usecs/opfdatasync                          2015.646 ops/sec     496 usecs/opfsync                              1296.674 ops/sec     771 usecs/opfsync_writethrough                              n/aopen_sync                          1100.856 ops/sec     908 usecs/opCompare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync is Linux's default)open_datasync                      1194.739 ops/sec     837 usecs/opfdatasync                          2254.153 ops/sec     444 usecs/opfsync                              1495.419 ops/sec     669 usecs/opfsync_writethrough                              n/aopen_sync                           793.885 ops/sec    1260 usecs/opCompare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB in different write
open_sync sizes.)1 * 16kB open_sync write          1383.587 ops/sec     723 usecs/op2 *  8kB open_sync writes          609.448 ops/sec    1641 usecs/op4 *  4kB open_sync writes          305.578 ops/sec    3272 usecs/op8 *  2kB open_sync writes          162.153 ops/sec    6167 usecs/op16 *  1kB open_sync writes           60.500 ops/sec   16529 usecs/opTest if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written on a different
descriptor.)write, fsync, close                 835.435 ops/sec    1197 usecs/opwrite, close, fsync                 852.263 ops/sec    1173 usecs/opNon-sync'ed 8kB writes:write                            233350.445 ops/sec       4 usecs/op
内存相关设置

详见这里。

  • shared_buffers
    设置数据库服务器用于共享内存缓冲区的内存量。默认值通常为 128 兆字节 (128MB)。
  • huge_pages
    控制是否为主共享内存区域请求大页面。
  • work_mem
    设置在写入临时磁盘文件之前查询操作(例如排序或哈希表)所使用的最大基本内存量。
  • maintenance_work_mem
    指定维护操作(例如 VACUUM、CREATE INDEX 和 ALTER TABLE ADD FOREIGN KEY)所使用的最大内存量。
  • wal_buffers
    用于尚未写入磁盘的 WAL 数据的共享内存量。

💡 shared_buffers是其中最重要的参数。按官方文档,其值应设为物理内存的25%-40%。

错误报告和日志

详见这里。

  • update_process_title
    每次服务器收到新的 SQL 命令时,启用更新进程标题。
  • cluster_name(字符串)
    设置一个名称,用于标识此数据库集群(实例),以用于各种用途。
网络相关设置

详见这里。

  • listen_addresses
    指定服务器监听客户端应用程序连接的 TCP/IP 地址。
  • max_connections
    确定数据库服务器的最大并发连接数。默认值通常为 100 个连接。
  • reserved_connections
    确定为具有 pg_use_reserved_connections 角色权限的角色保留的连接“槽”数量。
  • authentication_timeout
    完成客户端身份验证的最大时间。
  • ssl
    启用 SSL 连接。默认为关闭。
归档和复制设置

详见这里。

  • wal_level
    wal_level 决定写入 WAL 的信息量。
  • archive_mode
    启用 archive_mode 后,通过设置 archive_command 或 archive_library,已完成的 WAL 段将发送到归档存储。除了 off(禁用)之外,还有两种模式:on 和 always。在正常运行期间,这两种模式没有区别,但设置为 always 时,WAL 归档器在归档恢复或待机模式下也会启用。
  • archive_command
    用于归档已完成的 WAL 文件段的本地 Shell 命令。
  • archive_library
    用于归档已完成的 WAL 文件段的库。
  • primary_conninfo
    指定备用服务器用于连接发送服务器的连接字符串。
  • primary_slot_name
    可选地指定一个现有的复制槽,用于通过流复制连接到发送服务器时控制上游节点上的资源移除。
  • hot_standby
    指定在恢复期间是否可以连接并运行查询。
  • max_standby_archive_delay
    当热备用处于活动状态时,此参数确定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待的时间。当从 WAL 存档读取 WAL 数据(因此不是最新的)时,适用 max_standby_archive_delay。
  • max_standby_streaming_delay
    当热备处于活动状态时,此参数决定备用服务器在取消与即将应用的 WAL 条目冲突的备用查询之前应等待的时间。当通过流复制接收 WAL 数据时,max_standby_streaming_delay 适用。
  • recovery_min_apply_delay
    默认情况下,备用服务器会尽快从发送服务器恢复 WAL 记录。保留一份延时的数据副本可能会很有用,这能提供纠正数据丢失错误的机会。此参数允许您将恢复延迟指定的时间。
  • max_replication_slots
    指定可以同时跟踪多少个复制源(参见第 48 章),从而有效地限制服务器上可以创建的逻辑复制订阅的数量。
  • max_wal_senders
    指定来自备用服务器或流式基础备份客户端的最大并发连接数(即同时运行的 WAL 发送器进程的最大数量)。
  • synchronous_standby_names
    指定支持同步复制的备用服务器列表。
Vacuum 和 Autovacuum 相关设置

详见这里和第11章笔记。

优化器设置

详见这里和第13章笔记。

统计信息收集器

详见这里。

  • track_activities
    启用收集每个会话当前正在执行的命令的信息,包括其标识符和命令开始执行的时间。此参数默认启用。
  • track_counts
    启用数据库活动统计信息的收集。此参数默认启用,因为自动清理守护进程需要收集到的信息。
  • track_functions
    启用对函数调用次数和使用时间的跟踪。默认为none。
  • track_io_timing
    启用数据库 I/O 调用的计时。此参数默认关闭,因为它会反复向操作系统查询当前时间,这在某些平台上可能会造成很大的开销。您可以使用 pg_test_timing 工具来测量系统上的计时开销。I/O 计时信息显示在 pg_stat_database、pg_stat_io、使用 BUFFERS 选项时 EXPLAIN 的输出、使用 VERBOSE 选项时 VACUUM 的输出、自动清理和自动分析的 autovacuum 输出、设置 log_autovacuum_min_duration 时以及 pg_stat_statements 中。

pg_test_timing可测量时间开销。良好的结果将显示大多数(>90%)单独的计时调用所花费的时间不到一微秒。

$ pg_test_timing
Testing timing overhead for 3 seconds.
Per loop time including overhead: 82.62 ns
Histogram of timing durations:< us   % of total      count1     92.31680   335204852      7.65127    27781964      0.00916       33258      0.00012         4416      0.01032       374932      0.00736       267164      0.00408       1481128      0.00074        268256      0.00011         39512      0.00003         111024      0.00001          32048      0.00001          5

从实时系统修改配置

使用ALTER SYSTEM命令:

postgres=# \h alter system
Command:     ALTER SYSTEM
Description: change a server configuration parameter
Syntax:
ALTER SYSTEM SET configuration_parameter { TO | = } { value [, ...] | DEFAULT }ALTER SYSTEM RESET configuration_parameter
ALTER SYSTEM RESET ALLURL: https://www.postgresql.org/docs/16/sql-altersystem.html

修改的结果会存于文件postgresql.auto.conf,此文件最初为空。

示例:

postgres=# alter system set archive_mode=on;
ALTER SYSTEM
postgres=# \! cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
archive_mode = 'on'-- set = default等同于reset
postgres=# alter system set archive_mode=default;
ALTER SYSTEM
postgres=# \! cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.

配置生成器

推荐工具PGConfig。当然,这类工具不止一个,仅供参考,毕竟PG有缺省配置。
在这里插入图片描述

监控集群

系统目录(system catalog)是关系数据库管理系统存储模式元数据(例如表和列的信息以及内部簿记信息)的地方。PostgreSQL 的系统目录是常规表。

通常情况下,不应手动更改系统目录,通常可以使用 SQL 命令来执行此操作。(例如,CREATE DATABASE 会在 pg_database 目录中插入一行,实际上会在磁盘上创建数据库。)

使用累积统计视图和函数来监控收集的数据时,务必注意信息并非即时更新。每个服务器进程在进入空闲状态前都会将累积的统计信息刷新到共享内存中,但刷新频率不会超过每 PGSTAT_MIN_INTERVAL 毫秒一次(除非在构建服务器时进行更改,否则为 1 秒一次);因此,仍在进行的查询或事务不会影响显示的总数,并且显示的信息会滞后于实际活动。但是,track_activities 收集的当前查询信息始终是最新的。

💡 PGSTAT_MIN_INTERVAL 是在pgstat.c中定义的,值为500。

💡 事务块内的统计数据是“冻结的”,这意味着除非事务已完成,否则您无法观察到统计数据的变化。

💡 统计信息在集群正常关闭和重启后都会保留,但在从崩溃中恢复时,所有统计信息都将被删除,并从头开始收集。

根据文档,统计信息可以从两类视图中获得,即Dynamic Statistics View和Collected Statistics View。
他们的区别在于:

Collected Statistics ViewDynamic Statistics View
数据类型累计计数器即时、实时状态
可重置?是(pg_stat_reset())
场景长期监控、使用情况分析实时监控、立即诊断
示例pg_stat_user_tables, pg_stat_databasepg_stat_activity, pg_stat_progress_vacuum

有关正在运行的查询和会话的信息

pg_stat_activity 视图每个服务器进程有一行,显示与该进程当前活动相关的信息。

postgres=# SELECT usename, datname, client_addr, application_name,backend_start, query_start,state, backend_xid, queryFROM pg_stat_activity;
-[ RECORD 1 ]----+--------------------------------------------------------
usename          |
datname          |
client_addr      |
application_name |
backend_start    | 2025-06-28 11:37:57.144993+00
query_start      |
state            |
backend_xid      |
query            |
-[ RECORD 2 ]----+--------------------------------------------------------
usename          | postgres
datname          |
client_addr      |
application_name |
backend_start    | 2025-06-28 11:37:57.146246+00
query_start      |
state            |
backend_xid      |
query            |
-[ RECORD 3 ]----+--------------------------------------------------------
usename          | postgres
datname          | postgres
client_addr      |
application_name | psql
backend_start    | 2025-06-29 11:37:07.544105+00
query_start      | 2025-06-29 11:52:36.908007+00
state            | active
backend_xid      |
query            | SELECT usename, datname, client_addr, application_name,+|  backend_start, query_start,                           +|  state, backend_xid, query                             +|  FROM pg_stat_activity;
-[ RECORD 4 ]----+--------------------------------------------------------
...

检查锁

pg_locks 表中每个活动的可锁对象、请求的锁模式以及相关进程都包含一行信息。因此,如果多个进程持有或等待同一个可锁对象上的锁,则该对象可能会出现多次。但是,当前没有锁的对象则不会出现。

可锁对象有几种不同的类型:整个关系(例如表)、关系的单个页面、关系的单个元组、事务 ID(虚拟 ID 和永久 ID)以及通用数据库对象。

postgres=# select * from pg_locks;
-[ RECORD 1 ]------+----------------
locktype           | relation
database           | 5
relation           | 12073
page               |
tuple              |
virtualxid         |
transactionid      |
classid            |
objid              |
objsubid           |
virtualtransaction | 3/918
pid                | 25406
mode               | AccessShareLock
granted            | t
fastpath           | t
waitstart          |
-[ RECORD 2 ]------+----------------
locktype           | virtualxid
database           |
relation           |
page               |
tuple              |
virtualxid         | 3/918
transactionid      |
classid            |
objid              |
objsubid           |
virtualtransaction | 3/918
pid                | 25406
mode               | ExclusiveLock
granted            | t
fastpath           | t
waitstart          |

有趣的是,这个锁定的表正是pg_locks:

postgres=# SELECTnspname AS schema_name,relname AS table_name
FROMpg_class cJOIN pg_namespace n ON c.relnamespace = n.oid
WHEREc.oid = 12073;schema_name | table_name
-------------+------------pg_catalog  | pg_locks
(1 row)

获取锁的详细信息:

postgres=# SELECT a.usename, a.application_name, a.datname, a.query,l.granted, l.modeFROM pg_locks lJOIN pg_stat_activity a ON a.pid = l.pid;usename  | application_name | datname  |                           query                           | granted |      mode
----------+------------------+----------+-----------------------------------------------------------+---------+-----------------postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | ExclusiveLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |postgres | psql             | postgres | SELECT a.usename, a.application_name, a.datname, a.query,+| t       | AccessShareLock|                  |          |  l.granted, l.mode                                       +|         ||                  |          |  FROM pg_locks l                                         +|         ||                  |          |  JOIN pg_stat_activity a ON a.pid = l.pid;                |         |
(9 rows)

找出被阻塞的查询:

postgres=# SELECT query, backend_start, xact_start, query_start,state_change, state,now()::time - state_change::time AS locked_since,pid, wait_event_type, wait_eventFROM pg_stat_activityWHERE wait_event_type IS NOT NULLORDER BY locked_since DESC;query |         backend_start         | xact_start | query_start | state_change | state | locked_since |  pid  | wait_event_type |     wait_event
-------+-------------------------------+------------+-------------+--------------+-------+--------------+-------+-----------------+---------------------| 2025-06-28 11:37:57.144993+00 |            |             |              |       |              | 15768 | Activity        | AutoVacuumMain| 2025-06-28 11:37:57.146246+00 |            |             |              |       |              | 15769 | Activity        | LogicalLauncherMain| 2025-06-28 11:37:57.130896+00 |            |             |              |       |              | 15765 | Activity        | BgWriterMain| 2025-06-28 11:37:57.129394+00 |            |             |              |       |              | 15764 | Activity        | CheckpointerMain| 2025-06-28 11:37:57.143719+00 |            |             |              |       |              | 15767 | Activity        | WalWriterMain
(5 rows)

pg_blocking_pids返回阻止具有指定进程 ID 的服务器进程获取锁的会话的进程 ID 数组,如果不存在这样的服务器进程或该服务器进程未被阻止,则返回空数组。

检查数据库

pg_stat_database 视图将为集群中的每个数据库包含一行,外加为共享对象包含一行,显示数据库范围的统计信息。

postgres=# SELECT datname, xact_commit, xact_rollback, blks_read, conflicts, deadlocks,tup_fetched, tup_inserted, tup_updated, tup_deleted, stats_resetFROM pg_stat_database;datname       | xact_commit | xact_rollback | blks_read | conflicts | deadlocks | tup_fetched | tup_inserted | tup_updated | tup_deleted | stats_reset
--------------------+-------------+---------------+-----------+-----------+-----------+-------------+--------------+-------------+-------------+-------------|           0 |             0 |        68 |         0 |         0 |       47275 |          173 |          11 |         155 |postgres           |        4238 |            29 |       865 |         0 |         0 |       42645 |            7 |           7 |           0 |template1          |        3465 |             1 |       176 |         0 |         0 |       28463 |            0 |           0 |           0 |template0          |           0 |             0 |         0 |         0 |         0 |           0 |            0 |           0 |           0 |world_temperatures |        3467 |             1 |      9489 |         0 |         0 |       37025 |            0 |           0 |           0 |demo               |        3467 |             1 |      1285 |         0 |         0 |       28986 |            0 |           0 |           0 |restoredb          |        3864 |             5 |        90 |         0 |         0 |       36054 |          724 |          12 |           0 |sampledb           |        3485 |             6 |       143 |         0 |         0 |       30419 |          766 |          46 |           0 |
(8 rows)

最后一列stats_reset 表示这些统计数据上次重置的时间。

检查表和索引

pg_stat_all_tables 视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,显示有关对该特定表的访问的统计信息。
pg_stat_all_indexes 视图将为当前数据库中的每个索引包含一行,显示有关对该特定索引的访问的统计信息。

sampledb=> SELECT relname, seq_scan, idx_scan,n_tup_ins, n_tup_del, n_tup_upd, n_tup_hot_upd,n_live_tup, n_dead_tup,last_vacuum, last_autovacuum,last_analyze, last_autoanalyzeFROM pg_stat_user_tables;relname   | seq_scan | idx_scan | n_tup_ins | n_tup_del | n_tup_upd | n_tup_hot_upd | n_live_tup | n_dead_tup | last_vacuum | last_autovacuum | last_analyze |       last
_autoanalyze
-------------+----------+----------+-----------+-----------+-----------+---------------+------------+------------+-------------+-----------------+--------------+-----------
--------------------employees   |       15 |        0 |       107 |         0 |         0 |             0 |        107 |          0 |             |                 |              | 2025-06-2804:57:09.840269+00countries   |        3 |        0 |        25 |         0 |         0 |             0 |         25 |          0 |             |                 |              |locations   |        6 |        0 |        23 |         0 |         0 |             0 |         23 |          0 |             |                 |              |job_history |        7 |        0 |        10 |         0 |         0 |             0 |         10 |          0 |             |                 |              |regions     |        5 |        0 |         4 |         0 |         0 |             0 |          4 |          0 |             |                 |              |departments |        6 |        0 |        27 |         0 |         0 |             0 |         27 |          0 |             |                 |              |regions_bak |        0 |          |         4 |         0 |         0 |             0 |          4 |          0 |             |                 |              |jobs        |        3 |        0 |        19 |         0 |         0 |             0 |         19 |          0 |             |                 |              |
(8 rows)

last_vacuum、last_analyze、last_autovacuum 和 last_autoanalyze 列对于了解自动守护进程是否正常工作至关重要。n_live_tup 列报告当前可见的元组数量,而 n_dead_tup 列报告不再可见但仍然占用空间但将被手动或自动清理回收的元组数量。

更多统计信息

略。

使用 pg_stat_statements的高级统计信息

pg_stat_activity 目录不提供历史信息,但可以通过pg_stat_statements扩展获取。

pg_stat_statements 模块提供了一种跟踪服务器执行的所有 SQL 语句的计划和执行统计信息的方法。

安装 pg_stat_statements扩展

ALTER SYSTEM SET shared_preload_libraries to 'pg_stat_statements';
/*
实际运行的以下,因为之前我有一个pgaudit
ALTER SYSTEM SET shared_preload_libraries to 'pg_stat_statements','pgaudit';
*/
-- 重启PG
-- pg_ctl restart
CREATE EXTENSION pg_stat_statements;

使用 pg_stat_statements

sampledb=# SELECT auth.rolname,query, db.datname, calls, min_exec_time, max_exec_timeFROM pg_stat_statementsJOIN pg_authid auth ON auth.oid = useridJOIN pg_database db ON db.oid = dbidORDER BY calls DESC;rolname  |                                    query                                    | datname  | calls | min_exec_time | max_exec_time
----------+-----------------------------------------------------------------------------+----------+-------+---------------+---------------postgres | show shared_preload_libraries                                               | postgres |     2 |      0.011834 |       0.02454postgres | ALTER SYSTEM SET shared_preload_libraries to 'pg_stat_statements','pgaudit' | postgres |     1 |      5.149671 |      5.149671postgres | CREATE EXTENSION pg_stat_statements                                         | sampledb |     1 |     40.394794 |     40.394794postgres | CREATE EXTENSION pg_stat_statements                                         | postgres |     1 |     63.075177 |     63.075177
(4 rows)

重置从 pg_stat_statements收集的数据

sampledb=# SELECT pg_stat_statements_reset();pg_stat_statements_reset
--------------------------(1 row)

调整 pg_stat_statements

  • pg_stat_statements.max(整数)
    pg_stat_statements.max 是模块跟踪的最大语句数(即 pg_stat_statements 视图中的最大行数)。如果观察到的不同语句数超过该值,则会丢弃执行次数最少的语句的信息。丢弃此类信息的次数可以在 pg_stat_statements_info 视图中查看。默认值为 5000。此参数只能在服务器启动时设置。

  • pg_stat_statements.track(枚举)
    pg_stat_statements.track 控制模块统计哪些语句。指定 top 可跟踪顶级语句(客户端直接发出的语句),指定 all 可跟踪嵌套语句(例如函数内调用的语句),指定 none 可禁用语句统计信息收集。默认值为 top。只有超级用户可以更改此设置。

  • pg_stat_statements.track_utility(布尔值)
    pg_stat_statements.track_utility 控制模块是否跟踪实用程序命令。实用程序命令是指除 SELECT、INSERT、UPDATE、DELETE 和 MERGE 之外的所有命令。默认值为开启。只有超级用户可以更改此设置。

  • pg_stat_statements.save(布尔值)
    pg_stat_statements.save 指定是否在服务器关闭时保存语句统计信息。如果设置为 off,则统计信息在服务器关闭时不会保存,在服务器启动时也不会重新加载。默认值为 on。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

验证您的知识

  • 什么是配置上下文?
  • pg_settings 和 pg_file_settings的区别?
  • 除了编辑配置文件,如何通过SQL语句修改集群配置?
  • 如何获取有关正在运行的连接、事务和查询的信息?
  • pg_stat_statements 扩展有什么作用?

参考

  • 19.1. Setting Parameters
  • pg_stat_statements — track statistics of SQL planning and execution
  • Chapter 51. System Catalogs
  • 27.2. The Cumulative Statistics System
http://www.dtcms.com/a/264970.html

相关文章:

  • PostgreSQL大表创建分区实战
  • Arduino CH552 ADC的使用
  • NumPy 或 PyTorch/TensorFlow 中的张量理解
  • Servlet开发流程(包含IntelliJ IDEA项目添加Tomcat依赖的详细教程)
  • 【论文阅读】DeepEyes: Incentivizing “Thinking with Images” via Reinforcement Learning
  • 【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
  • JavaWeb笔记03
  • GC393:一款低功耗双电压比较器芯片
  • 设计模式-责任链模式
  • SpringBoot控制反转
  • vue中的toRef
  • 【Redis】StringRedisTemplate 和 RedisTemplate 的区别
  • Python 数据分析与可视化 Day 14 - 建模复盘 + 多模型评估对比(逻辑回归 vs 决策树)
  • JavaEE==网站开发
  • Liunx 安装 MySQL 8.0
  • Selenium使用教程-爬虫版(超详细)
  • 数学建模_图论
  • 重塑智能体决策路径:深入理解 ReAct 框架
  • 【前端进阶】【实战】【性能优化】前端开发中的事件监听与DOM操作优化实践
  • Linux基本命令篇 —— whereis命令
  • 利用 Claude Opus 4 自动化 GitHub 工作流:从安装到实战详解
  • 新版本AI数字人全能管家,即将推出,还是开源免费。
  • [附源码+数据库+毕业论文+答辩PPT]基于Spring+MyBatis+MySQL+Maven+vue实现的中小型企业财务管理系统,推荐!
  • 多个单片机简单通讯框架
  • GO Web 框架 Gin 完全解析与实践
  • 数据结构与算法 第三章 栈和队列
  • 第一章 快速入门
  • DPI深度检索原理和架构
  • 人脸活体识别3:C/C++实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)
  • 创客匠人解构知识付费爆单密码:产品力打造与 IP 变现的深度耦合