9.3 9.4 9.5 9.6 10 11 12 13 14 Current(15)
阿里云PostgreSQL 问题报告 纠错本页面

28.2. 累计统计系统

28.2.1. 统计收集配置
28.2.2. 查看统计信息
28.2.3. pg_stat_activity
28.2.4. pg_stat_replication
28.2.5. pg_stat_replication_slots
28.2.6. pg_stat_wal_receiver
28.2.7. pg_stat_recovery_prefetch
28.2.8. pg_stat_subscription
28.2.9. pg_stat_subscription_stats
28.2.10. pg_stat_ssl
28.2.11. pg_stat_gssapi
28.2.12. pg_stat_archiver
28.2.13. pg_stat_bgwriter
28.2.14. pg_stat_wal
28.2.15. pg_stat_database
28.2.16. pg_stat_database_conflicts
28.2.17. pg_stat_all_tables
28.2.18. pg_stat_all_indexes
28.2.19. pg_statio_all_tables
28.2.20. pg_statio_all_indexes
28.2.21. pg_statio_all_sequences
28.2.22. pg_stat_user_functions
28.2.23. pg_stat_slru
28.2.24. Statistics Functions

PostgreSQL累积统计系统支持收集和报告有关服务器活动的信息。 目前,对表和索引的访问以磁盘块和单个行的术语进行计数。每个表中的总行数, 以及每个表的清理和分析操作的信息也被计数。如果启用,对用户定义函数的调用 和每个函数中花费的总时间也会被计数。

PostgreSQL也支持报告关于系统当前正在发生的情况的动态信息, 例如其他服务器进程当前正在执行的确切命令,以及系统中存在哪些其他连接。此功能独立于累积统计系统。

28.2.1. 统计收集配置

因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。这由配置参数控制,它们通常在postgresql.conf中设置(关于设置配置参数的细节请见第 20 章)。

参数track_activities允许监控当前被任意服务器进程执行的命令。

参数track_counts控制是否收集关于表和索引访问的累积统计信息。

参数track_functions启用对用户定义函数使用的跟踪。

参数track_io_timing启用对块读写次数的监控。

参数 track_wal_io_timing 启用WAL写时间的监控。

通常这些参数被设置在postgresql.conf中,这样它们会应用于所有服务器进程,但是可以在单个会话中使用SET命令打开或关闭它们(为了阻止普通用户对管理员隐藏他们的活动,只有超级用户被允许使用SET来改变这些参数)。

累积统计数据存储在共享内存中。每个PostgreSQL进程在本地收集统计数据, 然后在适当的间隔更新共享数据。当服务器,包括物理副本,正常关闭时,统计数据的永久副本存储在 pg_stat子目录中,以便统计数据可以在服务器重新启动时保留。相反,当从不干净的 关闭开始(例如,立即关闭后,服务器崩溃,从基本备份开始和时间点恢复),所有统计计数器都会被重置。

28.2.2. 查看统计信息

有几个预定义的视图,列在表 28.1中, 可用于显示系统的当前状态。还有几个其他视图,列在表 28.2中,可用于显示累积统计信息。 或者,可以使用底层的累积统计函数构建自定义视图,如在第 28.2.24 节中讨论的那样。

当使用累积统计视图和函数来监视收集的数据时,重要的是要意识到信息不会立即更新。每个单独的服务器进程在空闲之前将累积的统计信息刷新到共享内存中,但不会频繁于每PGSTAT_MIN_INTERVAL毫秒(1秒,除非在构建服务器时更改)一次;因此,仍在进行中的查询或事务不会影响显示的总计,显示的信息滞后于实际活动。然而,由track_activities收集的当前查询信息始终是最新的。

另一个重要的观点是,当服务器进程被要求显示任何累积的统计信息时,在默认配置中,访问的值会被缓存直到当前事务结束。因此,只要您继续当前事务,统计信息将显示静态信息。类似地,当在事务中首次请求任何当前会话的查询信息时,会收集关于所有会话当前查询的信息,并且相同的信息将在整个事务中显示。这是一个特性,而不是一个错误,因为它允许您在统计信息上执行多个查询并将结果相关联,而不必担心数字在您眼前发生变化。 在交互式分析统计信息或使用昂贵的查询时,访问各个统计信息之间的时间差可能导致缓存统计信息中出现显著的偏差。为了最小化偏差,可以将stats_fetch_consistency设置为snapshot,但这会增加用于缓存不需要的统计数据的内存使用量。相反,如果已知统计信息只被访问一次,那么缓存访问的统计信息是不必要的,可以通过将stats_fetch_consistency设置为none来避免。 您可以调用pg_stat_clear_snapshot()来丢弃当前事务的统计快照或缓存的值(如果有)。下一次使用统计信息时(在快照模式下),将会创建一个新的快照,或者(在缓存模式下)将访问的统计信息缓存起来。

事务还可以在视图pg_stat_xact_all_tablespg_stat_xact_sys_tablespg_stat_xact_user_tablespg_stat_xact_user_functions中看到自己的统计信息 (尚未刷新到共享内存统计信息)。这些数字不像上面所述那样起作用; 相反,它们在事务期间持续更新。

动态统计视图中显示的一些信息在表 28.1中受到安全限制。 普通用户只能查看关于他们自己会话的所有信息(属于他们是成员的角色的会话)。在关于其他会话的行中,许多列将为空。 但是,请注意,所有用户都可以看到会话的存在以及其一般属性,如会话用户和数据库。超级用户和具有内置角色pg_read_all_stats特权的角色(另请参阅第 22.5 节)可以查看所有会话的所有信息。

表 28.1. 动态统计视图

视图名称描述
pg_stat_activity 每个服务器进程一行,显示与那个进程的当前活动相关的信息,例如状态和当前查询。详见pg_stat_activity
pg_stat_replication每一个 WAL 发送进程一行,显示有关到该发送进程连接的后备服务器的复制的统计信息。 详见pg_stat_replication.
pg_stat_wal_receiver只有一行,显示来自 WAL 接收器所连接服务器的有关该接收器的统计信息。详见 pg_stat_wal_receiver
pg_stat_recovery_prefetch只有一行,显示了恢复过程中预取的块的统计信息。 详细信息请参见 pg_stat_recovery_prefetch
pg_stat_subscription每个订阅至少一行,显示有关该订阅的工作者的信息。详见 pg_stat_subscription
pg_stat_ssl每个连接(常规的或者复制)一行,显示在这个连接上使用的SSL的信息。详见 pg_stat_ssl
pg_stat_gssapi每个连接(常规和复制)有一行,显示关于GSSAPI验证和加密的信息。详情请参阅 pg_stat_gssapi
pg_stat_progress_analyze每个运行ANALYZE的后端(包括自动清理工作者进程)的行,显示当前进度。参见第 28.4.1 节
pg_stat_progress_create_index每个后台运行CREATE INDEXREINDEX的后端都有一行,显示当前的进度。参见第 28.4.2 节
pg_stat_progress_vacuum每个运行着VACUUM的后端(包括autovacuum工作者进程)一行,显示当前的进度。详见第 28.4.3 节
pg_stat_progress_cluster每个运行着CLUSTERVACUUM FULL的后端一行,显示当前进度。参见 第 28.4.4 节
pg_stat_progress_basebackup每一个WAL发送者进程的行显示一个基础备份,显示当前进度。参见第 28.4.5 节
pg_stat_progress_copy对每个后端运行COPY的行, 显示当前进度。 参见 第 28.4.6 节

表 28.2. 已收集统计信息的视图

视图名称描述
pg_stat_archiver只有一行,显示有关 WAL 归档进程活动的统计信息。详见 pg_stat_archiver
pg_stat_bgwriter只有一行,显示有关后台写进程的活动的统计信息。详见 pg_stat_bgwriter
pg_stat_wal仅一行,显示WAL活动的统计信息。 详请参见 pg_stat_wal
pg_stat_database每个数据库一行,显示数据库范围的统计信息。详见 pg_stat_database
pg_stat_database_conflicts 每个数据库一行,显示数据库范围的统计信息, 这些信息的内容是关于由于与后备服务器的恢复过程 发生冲突而被取消的查询。详见 pg_stat_database_conflicts
pg_stat_all_tables 当前数据库中每个表一行,显示有关访问指定表的统计信息。详见 pg_stat_all_tables
pg_stat_sys_tablespg_stat_all_tables一样,但只显示系统表。
pg_stat_user_tablespg_stat_all_tables一样,但只显示用户表。
pg_stat_xact_all_tablespg_stat_all_tables相似,但计数动作只在当前事务内发生(还没有被包括在pg_stat_all_tables和相关视图中)。用于生存和死亡行数量的列以及清理和分析动作在此视图中不出现。
pg_stat_xact_sys_tablespg_stat_xact_all_tables一样,但只显示系统表。
pg_stat_xact_user_tablespg_stat_xact_all_tables一样,但只显示用户表。
pg_stat_all_indexes 当前数据库中的每个索引一行,显示:表OID、索引OID、模式名、表名、索引名、 使用了该索引的索引扫描总数、索引扫描返回的索引记录数、使用该索引的简 单索引扫描抓取的活表(livetable)中数据行数。 当前数据库中的每个索引一行,显示与访问指定索引有关的统计信息。详见 pg_stat_all_indexes
pg_stat_sys_indexespg_stat_all_indexes一样,但只显示系统表上的索引。
pg_stat_user_indexespg_stat_all_indexes一样,但只显示用户表上的索引。
pg_statio_all_tables 当前数据库中每个表一行(包括TOAST表),显示:表OID、模式名、表名、 从该表中读取的磁盘块总数、缓冲区命中次数、该表上所有索引的磁盘块读取总数、 该表上所有索引的缓冲区命中总数、在该表的辅助TOAST表(如果存在)上的磁盘块读取总数、 在该表的辅助TOAST表(如果存在)上的缓冲区命中总数、TOAST表的索引的磁盘块读 取总数、TOAST表的索引的缓冲区命中总数。 当前数据库中的每个表一行,显示有关在指定表上 I/O 的统计信息。详见 pg_statio_all_tables
pg_statio_sys_tablespg_statio_all_tables一样,但只显示系统表。
pg_statio_user_tablespg_statio_all_tables一样,但只显示用户表。
pg_statio_all_indexes 当前数据库中每个索引一行,显示:表OID、索引OID、模式名、 表名、索引名、该索引的磁盘块读取总数、该索引的缓冲区命中总数。 当前数据库中的每个索引一行,显示与指定索引上的 I/O 有关的统计信息。详见 pg_statio_all_indexes
pg_statio_sys_indexespg_statio_all_indexes一样,但只显示系统表上的索引。
pg_statio_user_indexespg_statio_all_indexes一样,但只显示用户表上的索引。
pg_statio_all_sequences 当前数据库中每个序列对象一行,显示:序列OID、模式名、序列名、序列的磁盘读取总数、序列的缓冲区命中总数。 当前数据库中的每个序列一行,显示与指定序列上的 I/O 有关的统计信息。详见 pg_statio_all_sequences
pg_statio_sys_sequencespg_statio_all_sequences一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。
pg_statio_user_sequencespg_statio_all_sequences一样,但只显示用户序列。
pg_stat_user_functions 对于所有跟踪功能,函数的OID,模式,名称,数量 通话总时间,和自我的时间。自我时间是 在函数本身所花费的时间量,总时间包括 它调用函数所花费的时间。时间值以毫秒为单位。 每一个被跟踪的函数一行,显示与执行该函数有关的统计信息。详见 pg_stat_user_functions
pg_stat_xact_user_functionspg_stat_user_functions相似,但是只统计在当前事务期间的调用(还没有被包括在pg_stat_user_functions中)。
pg_stat_slru每个SLRU一行, 显示操作的统计信息。参见 pg_stat_slru for details.
pg_stat_replication_slots每个复制槽一行,显示关于复制槽的利用率的统计信息。 详请参见 pg_stat_replication_slots
pg_stat_subscription_stats每个订阅的一行,显示有关错误的统计信息。 有关详细信息,请参见 pg_stat_subscription_stats

针对每个索引的统计信息对于判断哪个索引正被使用以及它们的效果特别有用。

pg_statio_视图主要用于确定缓存的有效性。当实际磁盘读取次数远小于缓存命中次数时, 则缓存可以满足大多数读取请求而不需要调用内核。然而,这些统计数据并不能完全说明问题:由于PostgreSQL 处理磁盘I/O的方式,不在PostgreSQL缓存中的数据可能仍然驻留在内核的I/O缓存中,因此可能仍然可以在不需要 物理读取的情况下获取。有兴趣获取更详细的PostgreSQL I/O行为信息的用户建议结合操作系统工具使用 PostgreSQL统计视图,以了解内核对I/O的处理方式。

28.2.3. pg_stat_activity

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

表 28.3. pg_stat_activity 视图

列类型

描述

datid oid

这个后端连接到的数据库的OID

datname name

这个后端连接到的数据库的名称

pid integer

这个后端的进程 ID

leader_pid integer

并行组组长的进程ID,如果该进程是并行查询工作者。如果该进程是一个并行组的组长或不参与并行查询,则为NULL

usesysid oid

登录到这个后端的用户的 OID

usename name

登录到这个后端的用户的 OID

application_name text

连接到这个后端的应用的名称

client_addr inet

连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。

client_hostname text

已连接的客户端的主机名,由client_addr的反向 DNS 查找报告。 这个字段将只对 IP 连接非空,并且只有 log_hostname被启用时才会非空。

client_port integer

客户端用于与此后端通信的TCP端口号,如果使用Unix套接字,则为-1。如果该字段为空,它表示这是一个内部服务器进程。

backend_start timestamp with time zone

这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。

xact_start timestamp with time zone

这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于query_start列。

query_start timestamp with time zone

当前活动查询被开始的时间,如果state不是active,则为上一个查询开始的时间

state_change timestamp with time zone

state上一次被改变的时间

wait_event_type text

后端等待的事件类型,如果有的话;否则NULL。参见表 28.4

wait_event text

如果后端当前正在等待,则等待事件名称,否则为NULL。参见表 28.5表 28.13

state text

这个后端的当前总体状态。可能的值为:

  • active: 后端正在执行一个查询。

  • idle: 后端正在等待一个新的客户端命令。

  • idle in transaction: 后端在一个事务中,但是当前没有正在执行一个查询。

  • idle in transaction (aborted): 这个状态与 idle in transaction相似,除了在该事务中的一个语句导致了一个错误。

  • fastpath function call: 后端正在执行一个 fast-path 函数。

  • disabled: 如果在这个后端中track_activities被禁用,则报告这个状态。

backend_xid xid

这个后端的顶层事务标识符,如果存在。

backend_xmin xid

当前后端的xmin范围。

query_id bigint

这个后端的最近查询的标识符。 如果stateactive,这个字段显示当前正在执行的查询的标识符。 在所有其他状态,它显示执行的最后一个查询的标识符。 默认不计算查询标识符,因此该字段将为空,除非启用compute_query_id参数或配置了计算查询标识符的第三方模块。

query text

这个后端最近查询的文本。如果stateactive,这个字段显示当前正在执行的查询。 在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至1024个字节,这个值可以通过参数track_activity_query_size更改。

backend_type text

当前后端的类型。可能的类型为 autovacuum launcher, autovacuum worker, logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, archiver, startup, walreceiver, walsender and walwriter. 除此以外,由扩展注册的后台Worker可能有额外的类型。


注意

wait_eventstate列是独立的。如果一个后端处于active状态,它可能是也可能不是某个事件上的waiting。如果状态是active并且wait_event为非空,它意味着一个查询正在被执行,但是它被阻塞在系统中某处。

表 28.4. 等待事件类型

等待事件类型描述
Activity服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。 wait_event将识别特定的等待点;参见表 28.5
BufferPin服务器进程正在等待对数据缓冲的独占访问。 如果另一个进程持有一个打开的游标,该游标最后一次从相关缓冲区读取数据,则缓冲区销等待可能是漫长的。 参见表 28.6
Client服务器进程正在等待连接到用户应用程序的套接字上的活动。 因此,服务器预计发生一些独立于其内部进程的事情。wait_event将识别特定的等待点;参见表 28.7
Extension服务器进程正在等待扩展模块定义的某个条件。参见表 28.8
IO服务器进程正在等待一个I/O操作完成。wait_event将识别特定的等待点;参见表 28.9
IPC服务器进程正在等待与另一个服务器进程进行交互。wait_event将识别特定的等待点;参见表 28.10
Lock服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简单锁,主要保护表等SQL可见对象。 然而,它们也用于确保某些内部操作的互斥,例如关系扩展。wait_event将识别等待的锁的类型;参见表 28.11
LWLock 服务器进程正在等待一个轻量级锁。大多数这样的锁保护共享内存中的特定数据结构。 wait_event将包含标识轻量级锁用途的名称。 (有些锁有特定的名称;其他锁是一组锁的一部分,每个锁具有类似的目的。)参见表 28.12
Timeout服务器进程正在等待超时过期。wait_event将识别特定的等待点;参见表 28.13

表 28.5. Activity类型的等待事件

Activity 等待事件描述
ArchiverMain在归档进程的主循环中等待。
AutoVacuumMain在自动清理启动过程的主循环中等待。
BgWriterHibernate在后台写进程中等待,休眠状态。
BgWriterMain在后台写进程主循环中等待。
CheckpointerMain在校验指针进程的主循环中等待。
LogicalApplyMain在逻辑复制应用进程的主循环中等待。
LogicalLauncherMain在逻辑复制启动器进程的主循环中等待。
RecoveryWalStream流恢复期间,在启动进程主循环等待WAL到达。
SysLoggerMain在syslogger进程的主循环中等待。
WalReceiverMain在WAL接收器进程的主循环中等待。
WalSenderMain在WAL发送者进程的主循环中等待。
WalWriterMain在WAL写入进程的主循环中等待。

表 28.6. BufferPin类型的等待事件

BufferPin 等待事件描述
BufferPin等待获得缓冲区上的独占销。

表 28.7. Client类型的等待事件

Client 等待事件描述
ClientRead等待从客户端读取数据。
ClientWrite等待写入数据到客户端。
GSSOpenServer在建立GSSAPI会话时等待从客户端读取数据。
LibPQWalReceiverConnect在WAL接收器等待与远程服务器建立连接。
LibPQWalReceiverReceive在WAL接收器中等待从远程服务器接收数据。
SSLOpenServer在尝试连接时等待SSL。
WalSenderWaitForWAL在WAL发送器进程中等待WAL被刷新。
WalSenderWriteData在WAL发送器进程中处理WAL接收器的回复时,等待任何活动。

表 28.8. Extension类型的等待事件

Extension 等待事件描述
Extension在扩展中等待。

表 28.9. IO类型的等待事件

IO 等待事件描述
BaseBackupRead等待基础备份从文件中读取。
BaseBackupSync等待由基本备份写入的数据达到持久存储。
BaseBackupWrite等待基本备份写入文件。
BufFileRead等待从缓冲文件中读取。
BufFileWrite等待对缓冲文件的写入。
BufFileTruncate等待一个缓冲文件被截断。
ControlFileRead等待读取pg_control文件。
ControlFileSync等待pg_control文件到达持久存储。
ControlFileSyncUpdate等待更新pg_control文件以达到持久存储。
ControlFileWrite等待写入pg_control文件。
ControlFileWriteUpdate等待写入更新pg_control文件。
CopyFileRead在文件复制操作期间等待读取。
CopyFileWrite在文件拷贝操作期间等待写入。
DSMFillZeroWrite等待用零填充动态共享内存备份(backing)文件。
DataFileExtend等待关系数据文件被扩展。
DataFileFlush等待关系数据文件达到持久存储。
DataFileImmediateSync等待关系数据文件到持久存储的立即同步。
DataFilePrefetch等待关系数据文件的异步预取。
DataFileRead等待对关系数据文件的读取。
DataFileSync等待对关系数据文件的更改达到持久存储。
DataFileTruncate等待关系数据文件被截断。
DataFileWrite等待对关系数据文件的写入。
LockFileAddToDataDirRead在向数据目录锁文件中添加一行时等待读取。
LockFileAddToDataDirSync等待数据到达持久存储,同时向数据目录锁文件添加一行。
LockFileAddToDataDirWrite在向数据目录锁文件中添加一行时等待写操作。
LockFileCreateRead创建数据目录锁文件时等待读取。
LockFileCreateSync在创建数据目录锁文件时等待数据到达持久存储。
LockFileCreateWrite在创建数据目录锁文件时等待写操作。
LockFileReCheckDataDirRead在重新检查数据目录锁文件期间等待读取。
LogicalRewriteCheckpointSync等待逻辑重写映射到在检查点到达持久存储。
LogicalRewriteMappingSync在逻辑重写期间等待映射数据到达持久存储
LogicalRewriteMappingWrite在逻辑重写期间等待映射数据的写入。
LogicalRewriteSync等待逻辑重写映射到达持久存储。
LogicalRewriteTruncate等待在逻辑重写期间截断映射数据。
LogicalRewriteWrite等待逻辑重写映射的写入。
RelationMapRead等待关系映射文件的读取。
RelationMapSync等待关系映射文件到达持久存储。
RelationMapWrite等待对关系映射文件的写入。
ReorderBufferRead在重新排序缓冲区管理期间等待读取。
ReorderBufferWrite在重新排序缓冲区管理期间等待写操作。
ReorderLogicalMappingRead在重新排序缓冲区管理期间等待读取逻辑映射。
ReplicationSlotRead等待从复制槽位控制文件读取。
ReplicationSlotRestoreSync等待复制槽控制文件到达持久存储,同时将其恢复到内存中。
ReplicationSlotSync等待复制槽控制文件到达持久存储。
ReplicationSlotWrite等待对复制槽控制文件的写入。
SLRUFlushSync在检查点或数据库关闭期间等待SLRU数据到达持久存储。
SLRURead等待读取SLRU页面。
SLRUSync在写页面后等待SLRU数据到达持久存储。
SLRUWrite等待SLRU页面的写入。
SnapbuildRead等待读取序列化的历史目录快照。
SnapbuildSync等待序列化历史目录快照到达持久存储。
SnapbuildWrite等待串行历史目录快照的写入。
TimelineHistoryFileSync等待通过流复制接收的时间线历史文件到达持久存储。
TimelineHistoryFileWrite等待通过流复制接收的时间线历史文件的写入。
TimelineHistoryRead等待读取时间线历史文件。
TimelineHistorySync等待新创建的时间线历史文件到达持久存储。
TimelineHistoryWrite等待写入新创建的时间线历史文件。
TwophaseFileRead等待读取两阶段状态文件。
TwophaseFileSync等待两阶段状态文件到达持久存储。
TwophaseFileWrite等待对两阶段状态文件的写入。
VersionFileSync等待版本文件达到持久存储,同时创建数据库。
VersionFileWrite在创建数据库时等待版本文件被写入。
WALBootstrapSync在引导过程中等待WAL达到持久存储。
WALBootstrapWrite在引导过程中等待WAL页面的写入。
WALCopyRead通过复制一个已有WAL段来创建一个新的WAL段时等待读取。
WALCopySync等待通过复制一个已有WAL段到持久存储来创建一个新的WAL段。
WALCopyWrite通过复制一个已有WAL段来创建一个新的WAL段时等待写入。
WALInitSync等待一个新初始化的WAL文件到持久存储。
WALInitWrite在初始化一个新的WAL文件时等待写入。
WALRead等待WAL文件的读取。
WALSenderTimelineHistoryRead在walsender时间线命令期间等待从时间线历史文件读取。
WALSync等待WAL文件到达持久存储。
WALSyncMethodAssign等待数据到达持久存储,同时分配一个新的WAL同步方法。
WALWrite等待写入WAL文件。

表 28.10. IPC类型的等待事件

IPC 等待事件描述
AppendReady等待 Append 计划节点的子计划节点准备好。
ArchiveCleanupCommand等待archive_cleanup_command完成。
ArchiveCommand等待archive_command完成。
BackendTermination等待另一个后端终止。
BackupWaitWalArchive等待备份所需的WAL文件成功存档。
BgWorkerShutdown等待后台工作者关闭。
BgWorkerStartup等待后台工作者启动。
BtreePage正等待继续并行B-树扫描所需的页号变得可用。
BufferIO等待缓冲I/O结束。
CheckpointDone等待检查点完成。
CheckpointStart等待检查点开始。
ExecuteGather在执行Gather 计划节点时,等待子进程的活动。
HashBatchAllocate等待一个选定的并行哈希参与者分配哈希表。
HashBatchElect等待选择一个并行哈希参与者来分配哈希表。
HashBatchLoad等待其他并行哈希参与者完成哈希表的加载。
HashBuildAllocate等待一个选定的并行哈希参与者分配初始哈希表。
HashBuildElect等待选择一个并行哈希参与者来分配初始哈希表。
HashBuildHashInner等待其他并行哈希参与者完成内部关系的散列。
HashBuildHashOuter等待其他Parallel 哈希参与者完成对外部关系的分区。
HashGrowBatchesAllocate等待选定的并行哈希参与者分配更多批处理。
HashGrowBatchesDecide等待选择一个并行哈希参与者来决定未来的批处理增长。
HashGrowBatchesElect等待选择一个Parallel 哈希参与者来分配更多批处理。
HashGrowBatchesFinishWaiting for an elected Parallel Hash participant to decide on future batch growth.
HashGrowBatchesRepartition等待一个选定的并行哈希参与者决定未来的批处理增长。
HashGrowBucketsAllocate等待选定的并行哈希参与者完成更多bucket的分配。
HashGrowBucketsElect等待选择一个并行哈希参与者来分配更多的buckets。
HashGrowBucketsReinsert等待其他Parallel 哈希参与者完成将元组插入到新buckets中。
LogicalSyncData等待逻辑复制远程服务器发送用于初始表同步的数据。
LogicalSyncStateChange等待逻辑复制远程服务器更改状态。
MessageQueueInternal等待另一个进程附加到共享消息队列。
MessageQueuePutMessage等待将协议消息写入共享消息队列。
MessageQueueReceive等待从共享消息队列接收字节。
MessageQueueSend等待将字节发送到共享消息队列。
ParallelBitmapScan等待并行位图扫描被初始化。
ParallelCreateIndexScan等待并行CREATE INDEX 工作者完成堆扫描。
ParallelFinish等待并行工作人员完成计算。
ProcArrayGroupUpdate等待组领导在并行操作结束时清除事务ID。
ProcSignalBarrier等待屏障事件被所有后端处理。
Promote等待备用系统提升。
RecoveryConflictSnapshot等待vacuum清理的恢复冲突解决。
RecoveryConflictTablespace等待恢复冲突解决删除表空间。
RecoveryEndCommand等待recovery_end_command完成。
RecoveryPause等待恢复继续进行。
ReplicationOriginDrop等待复制源变为非活动状态,以便可以删除它。
ReplicationSlotDrop等待复制槽变为非活动状态,以便可以删除它。
RestoreCommand等待restore_command完成。
SafeSnapshot等待获取READ ONLY DEFERRABLE事务的有效快照。
SyncRep在同步复制期间等待远程服务器的确认。
WalReceiverExit等待WAL接收器退出。
WalReceiverWaitStart等待启动进程为流复制发送初始数据。
XactGroupUpdate等待分组组长在并行操作结束时更新事务状态。

表 28.11. Lock类型的等待事件

Lock 等待事件描述
advisory等待获得一个建议用户锁。
extend等待扩展一个关系。
frozenid等待升级 pg_database.datfrozenxidpg_database.datminmxid.
object等待获取非关系数据库对象上的锁。
page等待获取一个关系页面上的锁。
relation等待获得一个关系的锁。
spectoken等待获取推测的插入锁。
transactionid等待事务完成。
tuple等待获取元组上的锁。
userlock等待获取用户锁。
virtualxid等待获取虚拟事务ID锁。

表 28.12. LWLock类型的等待事件

LWLock 等待事件描述
AddinShmemInit等待管理共享内存中的扩展空间分配。
AutoFile等待更新postgresql.auto.conf文件。
Autovacuum等待读取或更新自动清理工作者的当前状态。
AutovacuumSchedule等待确保选择为自动清理的表仍然需要清理。
BackgroundWorker等待读取或更新后台工作者状态。
BtreeVacuum等待读取或更新b-树索引的清理相关信息。
BufferContent等待访问内存中的数据页。
BufferMapping等待将数据块与缓冲池中的缓冲区关联。
CheckpointerComm等待管理fsync请求。
CommitTs等待读取或更新事务提交时间戳的最后一个值集。
CommitTsBuffer在提交时间戳SLRU缓冲区上等待I/O。
CommitTsSLRU等待访问提交时间戳SLRU缓存。
ControlFile等待读取或更新pg_control文件或创建一个新的WAL文件。
DynamicSharedMemoryControl等待读取或更新动态共享内存分配信息。
LockFastPath等待读取或更新进程的快速路径锁信息。
LockManager等待读取或更新关于heavyweight锁。
LogicalRepWorker等待读取或更新逻辑复制工作器的状态。
MultiXactGen等待读取或更新共享的multixact状态。
MultiXactMemberBuffer在multixact成员SLRU缓冲区上等待I/O。
MultiXactMemberSLRU等待访问multixact成员SLRU缓存。
MultiXactOffsetBuffer在multixact 偏移 SLRU缓冲区上等待I/O。
MultiXactOffsetSLRU等待访问multixact 偏移 SLRU缓存。
MultiXactTruncation等待读取或截断multixact信息。
NotifyBufferNOTIFY 消息 SLRU缓冲区上等待I/O。
NotifyQueue等待读取或更新NOTIFY 消息。
NotifyQueueTail等待NOTIFY消息存储上的更新限制。
NotifySLRU等待访问NOTIFY消息SLRU缓存。
OidGen等待分配一个新的OID。
OldSnapshotTimeMap等待读取或更新旧的快照控制信息。
ParallelAppend在并行附加计划执行期间等待选择下一个子计划。
ParallelHashJoin在并行哈希连接计划执行期间等待同步工作器。
ParallelQueryDSA等待并行查询动态共享内存分配。
PerSessionDSA等待并行查询动态共享内存分配。
PerSessionRecordType等待访问有关复合类型的并行查询信息。
PerSessionRecordTypmod等待访问有关标识匿名记录类型的类型修饰符的并行查询信息。
PerXactPredicateList在并行查询期间等待访问当前可序列化事务持有的谓词锁列表。
PredicateLockManager等待访问可序列化事务使用的谓词锁信息。
ProcArray等待访问每个进程共享的数据结构(通常情况,是获取快照或报告会话的事务ID)。
RelationMapping等待读取或更新pg_filenode.map文件(用于跟踪某些系统目录的文件节点分配)。
RelCacheInit等待读取或更新pg_internal.init关系缓存初始化文件。
ReplicationOrigin等待创建、删除或使用复制源。
ReplicationOriginState等待读取或更新一个复制源的进度。
ReplicationSlotAllocation等待分配或释放复制槽。
ReplicationSlotControl等待读取或更新复制槽状态。
ReplicationSlotIO在复制槽位上等待I/O。
SerialBuffer在可串行事务冲突的SLRU缓冲区上等待I/O。
SerializableFinishedList等待访问已完成的可序列化事务列表。
SerializablePredicateList等待访问可序列化事务持有的谓词锁列表。
PgStatsDSA等待统计动态共享内存分配器访问
PgStatsHash等待统计共享内存哈希表访问
PgStatsData等待共享内存统计数据访问
SerializableXactHash等待读取或更新关于可序列化事务的信息。
SerialSLRU等待访问可序列化事务冲突SLRU缓存。
SharedTidBitmap在并行位图索引扫描期间等待访问共享的TID位图。
SharedTupleStore在并行查询期间等待访问共享元组存储。
ShmemIndex等待在共享内存中找到或分配空间。
SInvalRead等待从共享目录失效队列中检索消息。
SInvalWrite等待向共享编目失效队列添加消息。
SubtransBuffer在子事务SLRU缓冲区上等待I/O。
SubtransSLRU等待访问子事务SLRU缓存。
SyncRep等待读取或更新有关同步复制状态的信息。
SyncScan等待选择同步表扫描的起始位置。
TablespaceCreate等待创建或删除表空间。
TwoPhaseState等待读取或更新已准备事务的状态。
WALBufMapping等待在WAL缓冲区中替换一个页面。
WALInsert等待将WAL数据插入内存缓冲区。
WALWrite等待WAL缓冲区写入磁盘。
WrapLimitsVacuum等待更新事务id和multixact消费的限制。
XactBuffer在事务状态的SLRU缓冲区上等待I/O。
XactSLRU等待访问事务状态的SLRU缓存。
XactTruncation等待执行pg_xact_status或更新它可用的最早的事务ID。
XidGen等待分配新的事务ID。

注意

扩展可以将LWLock类型添加到表 28.12所示的列表中。 在某些情况下,扩展名分配的名称不能在所有服务器进程中使用;因此LWLock等待事件可能只被报告为extension,而不是扩展名分配的名称。

表 28.13.  Timeout类型的等待事件

Timeout 等待事件描述
BaseBackupThrottle当有限流活动时在基础备份期间等待。
CheckpointWriteDelay在执行检查点时写入之间的等待时间。
PgSleep由于调用pg_sleep或同类函数而等待。
RecoveryApplyDelay由于延迟设置,在恢复期间等待应用WAL。
RecoveryRetrieveRetryInterval当WAL数据无法从任何来源(pg_wal,存档或流)获得时,在恢复期间等待。
RegisterSyncRequest在发送同步请求到检查点程序时等待,因为请求队列已满。
VacuumDelay在一个基于代价的清理延迟点。
VacuumTruncate等待获取独占锁以截断被清理的表末尾的空页面。

这里是一个查看等待事件的示例:

SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL;
 pid  | wait_event_type | wait_event
------+-----------------+------------
 2540 | Lock            | relation
 6644 | LWLock          | ProcArray
(2 rows)

28.2.4. pg_stat_replication

pg_stat_replication视图将在每个WAL发送方进程中包含一行,显示关于复制到发送方连接的备用服务器的统计信息。 只有直接连接的备用设备被列出;没有关于下游备用服务器的信息。

表 28.14. pg_stat_replication 视图

列类型

描述

pid integer

一个 WAL 发送进程的进程 ID

usesysid oid

登录到这个 WAL 发送进程的用户的 OID

usename name

登录到这个 WAL 发送进程的用户的名称

application_name text

连接到这个 WAL 发送进程的应用的名称

client_addr inet

连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个Unix 套接字连接。

client_hostname text

已连接的客户端的主机名,由client_addr的反向 DNS 查找报告。 这个字段将只对 IP 连接非空,并且只有 log_hostname被启用时才会非空。

client_port integer

客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为-1

backend_start timestamp with time zone

这个进程开始的时间,即客户端是何时连接到这个WAL 发送进程的。

backend_xmin xid

hot_standby_feedback报告的这个后备机的xmin水平线。

state text

当前的 WAL 发送进程状态。 可能的值是:

  • startup: 这个WAL发送器正在启动。

  • catchup: 这个WAL发送者连接的备用服务器正在赶上主服务器。

  • streaming: 在其连接的备用服务器赶上主服务器之后,这个WAL发送方正在流化变化。

  • backup: 这个WAL发送器正在发送一个备份。

  • stopping: 这个WAL发送器正在停止。

sent_lsn pg_lsn

在这个连接上发送的最后一个预写式日志的位置

write_lsn pg_lsn

被这个后备服务器写入到磁盘的最后一个预写式日志的位置

flush_lsn pg_lsn

被这个后备服务器刷入到磁盘的最后一个预写式日志的位置

replay_lsn pg_lsn

被重放到这个后备服务器上的数据库中的最后一个预写式日志的位置

write_lag interval

从本地刷新近期的WAL与接收到此备用服务器已写入WAL的通知(但尚未刷新或应用它)之间的时间经过。 如果将此服务器配置为同步备用服务器,则可以使用此参数来衡量在提交时synchronous_commit级别remote_write所导致的延迟。

flush_lag interval

在本地刷写近期的WAL与接收到后备服务器已经写入并且刷写它(但还没有应用)的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时synchronous_commit的级别on所导致的延迟。

replay_lag interval

在本地刷写近期的WAL与接收到后备服务器已经写入它、刷写它并且应用它的通知之间流逝的时间。 如果这台服务器被配置为一个同步后备,这可以用来计量在提交时synchronous_commit的级别remote_apply所导致的延迟。

sync_priority integer

在基于优先的同步复制中,这台后备服务器被选为同步后备的优先级。在基于规定数量的同步复制中,这个值没有效果。

sync_state text

这一台后备服务器的同步状态。 可能的值是:

  • async: 这台后备服务器是异步的。

  • potential: 这台后备服务器现在是异步的,但可能在当前的同步后备失效时变成同步的。

  • sync: 这台后备服务器是同步的。

  • quorum: 这台后备服务器被当做规定数量后备服务器的候选。

reply_time 带时区的时间戳

从备用服务器收到的最后一条回复信息的发送时间


pg_stat_replication视图中报告的滞后时间近期的WAL被写入、刷写并且重放以及发送器知道这一切所花的时间的度量。如果远程服务器被配置为一台同步后备,这些时间表示由每一种同步提交级别所带来(或者是可能带来)的提交延迟。对于一台异步后备,replay_lag列是最近的事务变得对查询可见的延迟时间的近似值。如果后备服务器已经完全追上了发送服务器并且没有WAL活动,在短时间内将继续显示最近测到的滞后时间,再然后就会显示为NULL。

对于物理复制会自动测量滞后时间。逻辑解码插件可能会选择性地发出跟踪消息,如果它们没有这样做,跟踪机制将把滞后显示为NULL。

注意

报告的滞后时间并非按照当前的重放速率该后备还有多久才能追上发送服务器的预测。在新的WAL被生成期间,这样一种系统将显示类似的时间,但是当发送器变为闲置时会显示不同的值。特别是当后备服务器完全追上时,pg_stat_replication显示的是写入、刷写及重放最近报告的WAL位置所花的时间而不是一些用户可能预期的零。这种做法与为近期的写事务测量同步提交和事务可见性延迟的目的一致。为了降低用户预期一种不同的滞后模型带来的混淆,在一个完全重放完的闲置系统上,lag列会在一段比较短的时间后回复成NULL。监控系统应该选择将这种情况表示为缺失数据、零或者继续显示最近的已知值。

28.2.5. pg_stat_replication_slots

pg_stat_replication_slots视图将包含每个逻辑复制槽的一行,显示关于其使用情况的统计信息。

表 28.15. pg_stat_replication_slots View

列类型

描述

slot_name text

唯一的,复制槽的集群范围标识符

spill_txns bigint

当逻辑解码在解码来自WAL的更改时所使用的内存超过logical_decoding_work_mem,溢出到磁盘的事务数。 顶级事务和子事务的计数器都是递增的。

spill_count bigint

在为该槽位解码来自WAL的更改时,事务溢出到磁盘的次数。 此计数器在每次事务被溢出时递增,并且同一事务可能被溢出多次。

spill_bytes bigint

在对来自WAL的更改执行解码时,已解码的事务数据溢出到磁盘的数量。 这个和其他溢出计数器可用于测量逻辑解码期间发生的I/O,并且允许调优logical_decoding_work_mem

stream_txns bigint

在逻辑解码在解码来自该槽位的WAL更改的时候,所使用的内存超过logical_decoding_work_mem之后,流到解码输出插件的正在进行的事务数。 流仅对顶级事务有效(子事务不能独立流),因此子事务的计数器不会增加。

stream_countbigint

在为该槽位解码来自WAL的更改时,将正在进行的事务流到解码输出插件的次数。 此计数器在每次事务流化时递增,并且同一事务可能被流化多次。

stream_bytesbigint

在为该槽位解码来自WAL的更改时,为将正在进行的事务流到解码输出插件而解码的事务数据的数量。 这个和针对此槽位的其他流计数器可用于调优logical_decoding_work_mem

total_txns bigint

针对此槽的,发送到解码输出插件的已解码事务数。 这只计算顶级事务,对子事务不会增加。 注意,这包括流化和/或溢出的事务。

total_bytesbigint

在对此槽位的WAL进行解码时,为将事务发送到解码输出插件而解码的事务数据量。 注意这包括流和/或溢出的数据。

stats_reset timestamp with time zone

这些统计最后重置的时间


28.2.6. pg_stat_wal_receiver

pg_stat_wal_receiver事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。

表 28.16. pg_stat_wal_receiver 视图

列类型

描述

pid integer

WAL接收器进程的进程ID

status text

WAL接收进程的活动状态

receive_start_lsn pg_lsn

WAL接收器启动时使用的第一个写前日志位置

receive_start_tli integer

WAL接收器启动时使用的第一个时间线数字

written_lsn pg_lsn

已经接收并写入磁盘的最后一个预写式日志位置,但没有刷入。这不能用于数据完整性检查。

flushed_lsn pg_lsn

已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动WAL接收器时使用的第一个日志位置

received_tli integer

接收并刷入到磁盘的最后一个预写式日志位置的时间线数字,该字段的初始值为启动WAL接收器时使用的第一个日志位置的时间线数字

last_msg_send_time timestamp with time zone

从源头WAL发送器收到的最后一条信息的发送时间

last_msg_receipt_time timestamp with time zone

从源头WAL发送器收到的最后一条信息的接收时间

latest_end_lsn pg_lsn

向源头WAL发送器报告的最后的预写式日志位置

latest_end_time timestamp with time zone

向源头WAL发送方报告的最后一次写前日志位置的时间

slot_name text

这个WAL接收器使用的复制槽的名称

sender_host text

这个WAL接收器连接到的PostgreSQL实例的主机。 这可以是主机名、IP地址,或者目录路径,如果连接是通过Unix套接字进行的。(路径的情况可以区分,因为它总是以/开头的绝对路径。)

sender_port integer

这个WAL接收器连接的PostgreSQL实例的端口号。

conninfo text

这个WAL接收器使用的连接字符串,对安全敏感的字段进行了模糊处理。


28.2.7. pg_stat_recovery_prefetch

pg_stat_recovery_prefetch视图将只包含一行。 wal_distanceblock_distanceio_depth列显示当前值,其他列显示可以使用 pg_stat_reset_shared函数重置的累积计数器。

表 28.17. pg_stat_recovery_prefetch 视图

列类型

描述

stats_reset 时间戳与时区

这些统计数据上次重置的时间

prefetch bigint

因为不在缓冲池中,所以预取的块数

hit bigint

因为它们已经在缓冲池中,所以未预取的块数

skip_init bigint

未预取的块数,因为它们将被初始化为零

skip_new bigint

未预取的块数,因为它们尚不存在

skip_fpw bigint

由于WAL中包含完整页图像而未预取的块数

skip_rep bigint

由于最近已经预取过而未预取的块数

wal_distance int

预取器向前查看多少字节

block_distance int

预取器正在查看多少个块之前

io_depth int

已启动但尚未完成的预取数量


28.2.8. pg_stat_subscription

表 28.18. pg_stat_subscription View

列类型

描述

subid oid

订阅的OID

subname name

订阅的名称

pid integer

订阅工作者进程的进程ID

relid oid

工作器正在同步的关系的OID;Null用于主应用工作器

received_lsn pg_lsn

接收到的最后一个预写式日志位置,该字段的初始值为0

last_msg_send_time timestamp with time zone

从源头WAL发送器收到的最后一条信息的发送时间

last_msg_receipt_time timestamp with time zone

从源头WAL发送器收到的最后一条信息的接收时间

latest_end_lsn pg_lsn

向源头WAL发送器报告的最后的预写式日志位置

latest_end_time timestamp with time zone

向WAL发送器报告的最后一次预写式日志位置的时间


28.2.9. pg_stat_subscription_stats

pg_stat_subscription_stats视图将包含每个订阅的一行。

表 28.19. pg_stat_subscription_stats 视图

列类型

描述

subid oid

订阅的OID

subname name

订阅的名称

apply_error_count bigint

应用更改时发生错误的次数

sync_error_count bigint

在初始表同步期间发生错误的次数

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


28.2.10. pg_stat_ssl

pg_stat_ssl视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。 可以把它与pg_stat_activity或者pg_stat_replication通过pid列连接来得到更多有关该连接的细节。

表 28.20. pg_stat_ssl 视图

列类型

描述

pid integer

后端或WAL发送器进程ID

ssl boolean

如果在此连接上使用SSL,则为真

version text

使用SSL的版本,如果此连接上没有使用SSL则为NULL

cipher text

正在使用的SSL密码的名称,如果此连接上没有使用SSL则为NULL

bits integer

使用的加密算法中的位数,如果此连接上没有使用SSL则为NULL

client_dn text

区别名称(DN,Distinguished Name)字段与使用的客户端证书,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 如果DN字段长于NAMEDATALEN(标准构建中为64个字符),则该字段将被截断。

client_serial numeric

客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。

issuer_dn text

客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。该字段像client_dn一样被截断。


28.2.11. pg_stat_gssapi

pg_stat_gssapi视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。 它可以加入到pg_stat_activitypg_stat_replication上的pid列,获取更多关于连接的详细信息。

表 28.21. pg_stat_gssapi 视图

列类型

描述

pid integer

后端进程ID

gss_authenticated boolean

如果此连接使用了GSSAPI身份验证,则为True

principal text

用于验证此连接的主体,如果未使用GSSAPI对此连接进行身份验证,则为NULL。 如果主体长度超过NAMEDATALEN(标准构建中为64个字符),则该字段被截断。

encrypted boolean

如果在此连接上使用了GSSAPI加密,则为真


28.2.12. pg_stat_archiver

pg_stat_archiver视图总是有一行,其中包含关于集群的存档进程的数据。

表 28.22. pg_stat_archiver 视图

列类型

描述

archived_count bigint

已成功存档的WAL文件数

last_archived_wal text

最近成功归档的WAL文件的名称

last_archived_time timestamp with time zone

最近成功归档操作的时间

failed_count bigint

记录WAL文件归档失败次数

last_failed_wal text

最近一次归档操作失败的WAL文件的名称

last_failed_time timestamp with time zone

最近一次归档操作失败的时间

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


通常,WAL文件按照顺序进行归档,从最旧到最新,但这并不是保证,也不适用于特殊情况,比如在推广备用机或崩溃恢复后。因此,不能安全地假设所有早于 last_archived_wal的文件也已成功归档。

28.2.13. pg_stat_bgwriter

pg_stat_bgwriter视图始终只有一行,其中包含集群的全局数据。

表 28.23. pg_stat_bgwriter View

列类型

描述

checkpoints_timed bigint

已执行的预定检查点数

checkpoints_req bigint

请求已执行的检查点数

checkpoint_write_time double precision

检查点处理中将文件写入磁盘的部分所花费的总时间,以毫秒为单位

checkpoint_sync_time double precision

检查点处理中将文件同步到磁盘的部分所花费的总时间,以毫秒为单位

buffers_checkpoint bigint

检查点期间写入的缓冲区数

buffers_clean bigint

后台写入器写入的缓冲区数

maxwritten_clean bigint

后台写入器因为写入太多缓冲区而停止清理扫描的次数

buffers_backend bigint

后端直接写入的缓冲区数

buffers_backend_fsync bigint

后端必须执行自己的fsync调用的次数(通常后台写入器处理这些,即使后端执行自己的写入)

buffers_alloc bigint

分配的缓冲区数

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


28.2.14. pg_stat_wal

pg_stat_wal 视图一直有一行,包含关于集群的WAL活动的数据。

表 28.24. pg_stat_wal View

列类型

描述

wal_records bigint

生成的WAL记录的总数

wal_fpi bigint

生成的WAL全页映像的总数

wal_bytes numeric

生成的WAL总数,以字节计

wal_buffers_full bigint

因为缓冲区已满,WAL数据被写入磁盘的次数

wal_write bigint

通过XLogWrite请求,WAL缓冲区被写入到磁盘的次数。 有关内部WAL函数XLogWrite的更多信息,请参见第 30.5 节

wal_sync bigint

通过issue_xlog_fsync 请求将WAL文件同步到磁盘的次数(如果fsynconwal_sync_methodfdatasync, fsyncfsync_writethrough,否则为零)。 有关内部WAL函数issue_xlog_fsync的更多信息,参见第 30.5 节

wal_write_time double precision

通过XLogWrite请求将WAL缓冲区写入磁盘所消耗的总时间,以毫秒计(如果track_wal_io_timing是启用的,否则为零)。 这包括当wal_sync_methodopen_datasyncopen_sync时的同步时间。

wal_sync_time double precision

通过issue_xlog_fsync请求将WAL文件同步到磁盘所消耗的总时间,以毫秒计(如果 track_wal_io_timing 被启用,fsync is on, 和 wal_sync_methodfdatasync, fsyncfsync_writethrough, 否则为零).

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


28.2.15. pg_stat_database

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

表 28.25. pg_stat_database 视图

列类型

描述

datid oid

该数据库的OID,属于共享关系的对象为0

datname name

这个数据库的名称,或者共享对象为NULL

numbackends integer

当前连接到此数据库的后端数,对于共享对象则为NULL。 这是该视图中唯一返回反映当前状态的值的列;所有其他列返回自上次重置以来累积的值。

xact_commit bigint

此数据库中已提交的事务数

xact_rollback bigint

该数据库中已回滚的事务数

blks_read bigint

在该数据库中读取的磁盘块数

blks_hit bigint

在缓存中发现磁盘块的次数,因此读取不是必需的(这只包括在PostgreSQL缓存中,而不是在操作系统的文件系统缓存中)

tup_returned bigint

由顺序扫描获取的活动行数和由索引扫描返回的索引条目数

tup_fetched bigint

该数据库中由索引扫描检索的活动行数

tup_inserted bigint

查询在该数据库中插入的行数

tup_updated bigint

这个数据库中查询更新的行数

tup_deleted bigint

这个数据库中被查询删除的行数

conflicts bigint

由于与此数据库中的恢复冲突而取消的查询数。(冲突只发生在备用服务器上;详请参见 pg_stat_database_conflicts。)

temp_files bigint

这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或散列),也不考虑log_temp_files设置。

temp_bytes bigint

这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑log_temp_files设置。

deadlocks bigint

在此数据库中检测到的死锁数

checksum_failures bigint

在此数据库(或共享对象)中检测到的数据页校验码失败数,如果没有启用数据校验码则为NULL。

checksum_last_failure timestamp with time zone

在此数据库(或共享对象)中检测到最后一个数据页校验码失败的时间,如果没有启用数据校验码则为NULL。

blk_read_time double precision

在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了track_io_timing,否则为零)

blk_write_time double precision

在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了track_io_timing,否则为零)

session_time double precision

此数据库中数据库会话所消耗的时间,以毫秒计(注意统计信息仅在会话状态发生变化时更新,因此如果会话空闲很长时间,则不包括此空闲时间)

active_time double precision

此数据库中执行SQL语句所消耗的时间,以毫秒计(这对应于 pg_stat_activity中的 activefastpath function call 状态)

idle_in_transaction_time double precision

此数据库中事务空闲所消耗的时间,以毫秒计(这对应于 pg_stat_activity中的 idle in transactionidle in transaction (aborted) 状态)

sessions bigint

此数据库建立的会话总数

sessions_abandoned bigint

此数据库因为到客户端的连接丢失而被终止的数据库会话数

sessions_fatal bigint

此数据库因为致命错误而被终止的数据库会话数

sessions_killed bigint

此数据库因为操作者介入而被终止的数据库会话数

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


28.2.16. pg_stat_database_conflicts

pg_stat_database_conflicts视图为每一个数据库包含一行,用来显示数据库范围内由于与后备服务器上的恢复过程冲突而被取消的查询的统计信息。 这个视图将只包含后备服务器上的信息,因为冲突会不发生在主服务器上。

表 28.26. pg_stat_database_conflicts 视图

列类型

描述

datid oid

数据库的OID

datname name

数据库的名称

confl_tablespace bigint

这个数据库中由于删除表空间而取消的查询的数量

confl_lock bigint

此数据库中由于锁定超时而被取消的查询数

confl_snapshot bigint

此数据库中由于旧快照而取消的查询数

confl_bufferpin bigint

此数据库中由于固定缓冲区而被取消的查询数

confl_deadlock bigint

此数据库中由于死锁而被取消的查询数


28.2.17. pg_stat_all_tables

pg_stat_all_tables视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。 pg_stat_user_tablespg_stat_sys_tables视图包含相同的信息,但是被过滤得分别只显示用户和系统表。

表 28.27. pg_stat_all_tables 视图

列类型

描述

relid oid

表的OID

schemaname name

该表所在的模式的名称

relname name

这个表的名称

seq_scan bigint

在此表上启动的顺序扫描数

seq_tup_read bigint

连续扫描获取的实时行数

idx_scan bigint

对这个表发起的索引扫描数

idx_tup_fetch bigint

索引扫描获取的实时行数

n_tup_ins bigint

插入的行数

n_tup_upd bigint

更新的行数(包括HOT更新的行

n_tup_del bigint

删除的行数

n_tup_hot_upd bigint

HOT更新的行数(即,不需要单独的索引更新)

n_live_tup bigint

活的行的估计数量

n_dead_tup bigint

僵死行的估计数量

n_mod_since_analyze bigint

自上次分析此表以来修改的行的估计数量

n_ins_since_vacuum bigint

自上次清空此表以来插入的行的估计数量

last_vacuum timestamp with time zone

最后一次手动清理这个表(不包括VACUUM FULL)

last_autovacuum timestamp with time zone

这个表最后一次被自动清理守护进程清理的时间

last_analyze timestamp with time zone

上一次手动分析这个表

last_autoanalyze timestamp with time zone

自动清理守护进程最后一次分析这个表

vacuum_count bigint

这个表被手动清理的次数(VACUUM FULL不计数)

autovacuum_count bigint

这个表被autovacuum守护进程清理的次数

analyze_count bigint

手动分析这个表的次数

autoanalyze_count bigint

这个表被autovacuum守护进程分析的次数


28.2.18. pg_stat_all_indexes

pg_stat_all_indexes视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexespg_stat_sys_indexes视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。

表 28.28. pg_stat_all_indexes 视图

列类型

描述

relid oid

对于此索引的表的OID

indexrelid oid

这个索引的OID

schemaname name

这个索引所在的模式名称

relname name

这个索引的表的名称

indexrelname name

这个索引的名称

idx_scan bigint

在这个索引上开启的索引扫描的数量

idx_tup_read bigint

扫描此索引返回的索引项数

idx_tup_fetch bigint

使用此索引进行简单索引扫描获取的活动表行数


索引可以被简单索引扫描、位图索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过 AND 或 OR 规则组合,因此当使用一次位图扫描时难以将取得的个体堆行与特定的索引关联起来。因此,一次位图扫描会增加它使用的索引的pg_stat_all_indexes.idx_tup_read计数,并且为每个表增加pg_stat_all_tables.idx_tup_fetch计数,但是它不影响pg_stat_all_indexes.idx_tup_fetch。如果所提供的常量值不在优化器统计信息记录的范围之内,优化器也会访问索引来检查,因为优化器统计信息可能已经“不新鲜”了。

注意

即使不用位图扫描,idx_tup_readidx_tup_fetch计数也可能不同,因为idx_tup_read统计从该索引取得的索引项而idx_tup_fetch统计从表取得的活着的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。

28.2.19. pg_statio_all_tables

pg_statio_all_tables视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。pg_statio_user_tablespg_statio_sys_tables视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。

表 28.29. pg_statio_all_tables 视图

列类型

描述

relid oid

表的OID

schemaname name

该表所在的模式的名称

relname name

这个表的名称

heap_blks_read bigint

从该表中读取的磁盘块的数量

heap_blks_hit bigint

该表中的缓冲区命中数

idx_blks_read bigint

从这个表上所有索引读取的磁盘块数

idx_blks_hit bigint

这个表上所有索引中的缓冲区命中数

toast_blks_read bigint

从这个表的TOAST表中读取的磁盘块的数量(如果有的话)

toast_blks_hit bigint

这个表的TOAST表中的缓冲区命中数(如果有的话)

tidx_blks_read bigint

从这个表的TOAST表索引中读取的磁盘块的数量(如果有的话)

tidx_blks_hit bigint

这个表的TOAST表索引中的缓冲区命中数(如果有的话)


28.2.20. pg_statio_all_indexes

pg_statio_all_indexes视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。 pg_statio_user_indexespg_statio_sys_indexes视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。

表 28.30. pg_statio_all_indexes 视图

列类型

描述

relid oid

对于此索引的表的OID

indexrelid oid

这个索引的OID

schemaname name

这个索引所在的模式名称

relname name

这个索引的表的名称

indexrelname name

这个索引的名称

idx_blks_read bigint

从此索引中读取的磁盘块的数量

idx_blks_hit bigint

此索引中的缓冲区命中数


28.2.21. pg_statio_all_sequences

pg_statio_all_sequences视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。

表 28.31. pg_statio_all_sequences 视图

列类型

描述

relid oid

序列的OID

schemaname name

此序列所在的模式的名称

relname name

此序列的名称

blks_read bigint

从这个序列中读取的磁盘块的数量

blks_hit bigint

在此序列中的缓冲区命中数


28.2.22. pg_stat_user_functions

pg_stat_user_functions视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。 track_functions参数控制到底哪些函数被跟踪。

表 28.32. pg_stat_user_functions 视图

列类型

描述

funcid oid

函数的OID

schemaname name

这个函数所在的模式的名称

funcname name

这个函数的名称

calls bigint

这个函数已经被调用的次数

total_time double precision

在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计

self_time double precision

在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计


28.2.23. pg_stat_slru

PostgreSQL通过SLRU(simple least-recently-used,简单的最近-最少-使用)缓存访问某些磁盘上的信息。 pg_stat_slru视图将为每个被跟踪的SLRU缓存包含一行,显示关于访问缓存页面的统计信息。

表 28.33. pg_stat_slru 视图

列类型

描述

name text

SLRU的名称

blks_zeroed bigint

初始化期间被置零的块数

blks_hit bigint

已经在SLRU中的磁盘块被发现的次数,因此不需要读取(这只包括SLRU中的命中,而不是操作系统的文件系统缓存)

blks_read bigint

为这个SLRU读取的磁盘块数

blks_written bigint

为这个SLRU写入的磁盘块数

blks_exists bigint

为这个SLRU检查是否存在的块数

flushes bigint

此SLRU的脏数据刷新数

truncates bigint

这个SLRU的截断数

stats_reset timestamp with time zone

这些统计数据最后一次重置的时间


28.2.24. Statistics Functions

其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出\d+ pg_stat_activity)。 针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。

与累积统计系统相关的其他功能在表 28.34中列出。

表 28.34. Additional Statistics Functions

函数

描述

pg_backend_pid () → integer

返回附加到当前会话的服务器进程的进程ID。

pg_stat_get_activity ( integer ) → setof record

使用指定的进程ID返回有关后端信息的记录,如果指定了NULL,则返回系统中每个活动后端的一条记录。 返回的字段是pg_stat_activity视图中字段的子集。

pg_stat_get_snapshot_timestamp () → 时间戳与时区

返回当前统计快照的时间戳,如果没有统计快照则返回NULL。如果在事务中第一次访问累积统计信息时将快照设置为stats_fetch_consistencysnapshot

pg_stat_get_xact_blocks_fetched ( oid ) → bigint

返回当前事务中表或索引的块读取请求次数。这个数字减去 pg_stat_get_xact_blocks_hit给出了内核read()调用的次数; 实际的物理读取次数通常较低,这是由于内核级别的缓冲。

pg_stat_get_xact_blocks_hit ( oid ) → bigint

返回在当前事务中在缓存中找到的表或索引的块读取请求次数(不触发内核read()调用)。

pg_stat_clear_snapshot () → void

丢弃当前的统计快照或缓存信息。

pg_stat_reset () → void

将当前数据库的所有统计计数器重置为零。

默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。

pg_stat_reset_shared ( text ) → void

根据参数将一些集群范围的统计计数器重置为零。参数可以是bgwriter, 用于重置在pg_stat_bgwriter视图中显示的所有计数器, archiver,用于重置在pg_stat_archiver视图中显示的所有计数器, wal,用于重置在pg_stat_wal视图中显示的所有计数器, 或recovery_prefetch,用于重置在pg_stat_recovery_prefetch视图中显示的所有计数器。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户EXECUTE权限来运行该函数。

pg_stat_reset_single_table_counters ( oid ) → void

重置当前数据库中的单个表或索引的统计信息,或者在集群中跨所有数据库共享的统计信息为零。

默认情况下,此函数仅限超级用户使用,但可以授予其他用户EXECUTE权限来运行该函数。

pg_stat_reset_single_function_counters ( oid ) → void

将当前数据库中单个函数的统计信息重置为零。

默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。

pg_stat_reset_slru ( text ) → void

将单个SLRU缓存或集群中所有SLRU的统计信息重置为零。 如果该参数为NULL,则所有SLRU缓存的pg_stat_slru视图中显示的计数器将被重置。 参数可以是CommitTsMultiXactMemberMultiXactOffsetNotifySerialSubtrans、 或Xact中的一个,以便只重置该条目的计数器。 如果参数是other(或实际上,任何无法识别的名称),那么所有其他SLRU缓存的计数器,如扩展定义的缓存,将被重置。

默认情况下该函数仅限于超级用户,但是其他用户可以被授予EXECUTE来运行此函数。

pg_stat_reset_replication_slot ( text ) → void

重置由参数定义的复制槽的统计信息。 如果参数为NULL,则重置所有复制槽的统计信息。

该函数默认仅限于超级用户,但可以授予其他用户EXECUTE权限来运行该函数。

pg_stat_reset_subscription_stats ( oid ) → void

重置pg_stat_subscription_stats视图中显示的单个订阅的统计信息为零。 如果参数是NULL,则重置所有订阅的统计信息。

默认情况下,此函数仅限超级用户使用,但其他用户可以被授予EXECUTE权限来运行该函数。


警告

使用pg_stat_reset()还会重置自动清理使用的计数器, 以确定何时触发清理或分析。重置这些计数器可能导致自动清理不执行必要的工作, 这可能会导致问题,如表膨胀或过时的表统计信息。建议在统计信息重置后进行全库ANALYZE

pg_stat_get_activitypg_stat_activity视图的底层函数, 它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。 在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在表 28.35中。 这些访问函数使用一个后端 ID 号,范围从 1 到当前活动后端数目。 函数pg_stat_get_backend_idset提供了一种方便的方法为每个活动后端产生一行来调用这些函数。 例如,要显示PID以及所有后端当前的查询:

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
       pg_stat_get_backend_activity(s.backendid) AS query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;

表 28.35. Per-Backend Statistics Functions

函数

描述

pg_stat_get_backend_idset () → setof integer

返回当前活动后端ID号的集合(从1到活动后端数)。

pg_stat_get_backend_activity ( integer ) → text

返回此后端最近查询的文本。

pg_stat_get_backend_activity_start ( integer ) → timestamp with time zone

返回后端最近一次查询开始的时间。

pg_stat_get_backend_client_addr ( integer ) → inet

返回连接到此后端的客户端的IP地址。

pg_stat_get_backend_client_port ( integer ) → integer

返回客户端用于通信的TCP端口号。

pg_stat_get_backend_dbid ( integer ) → oid

返回此后端连接的数据库的OID。

pg_stat_get_backend_pid ( integer ) → integer

返回此后端进程ID。

pg_stat_get_backend_start ( integer ) → timestamp with time zone

返回该进程开始的时间。

pg_stat_get_backend_userid ( integer ) → oid

返回登录到此后端的用户的OID。

pg_stat_get_backend_wait_event_type ( integer ) → text

如果后端当前正在等待,返回等待事件类型名称,否则返回NULL。 详请参见表 28.4

pg_stat_get_backend_wait_event ( integer ) → text

如果后端当前正在等待,则返回等待事件名称,否则为NULL。 参见 表 28.5表 28.13

pg_stat_get_backend_xact_start ( integer ) → timestamp with time zone

返回后端当前事务开始的时间。