pg_stat_activitypg_stat_replicationpg_stat_replication_slotspg_stat_wal_receiverpg_stat_recovery_prefetchpg_stat_subscriptionpg_stat_subscription_statspg_stat_sslpg_stat_gssapipg_stat_archiverpg_stat_iopg_stat_bgwriterpg_stat_checkpointerpg_stat_walpg_stat_databasepg_stat_database_conflictspg_stat_all_tablespg_stat_all_indexespg_statio_all_tablespg_statio_all_indexespg_statio_all_sequencespg_stat_user_functionspg_stat_slruPostgreSQL的累积统计系统支持收集和报告有关服务器活动的信息。 目前,对表和索引的访问以磁盘块和单个行的术语进行计数。每个表中的总行数, 以及每个表的清理和分析操作的信息也被计数。如果启用,对用户定义函数的调用 和每个函数中花费的总时间也会被计数。
PostgreSQL也支持报告关于系统当前正在发生的情况的动态信息, 例如其他服务器进程当前正在执行的确切命令,以及系统中存在哪些其他连接。此功能独立于累积统计系统。
由于收集统计信息会增加查询执行的开销,因此可以配置系统是否收集信息。这由通常在postgresql.conf中设置的配置参数控制(有关设置配置参数的详细信息,请参阅Chapter 19)。
参数track_activities启用对任意服务器进程当前执行命令的监控。
参数track_counts控制是否收集关于表和索引访问的累积统计信息。
参数track_functions启用对用户定义函数使用的跟踪。
参数track_io_timing启用对块读取、写入、扩展和 fsync 时间的监控。
参数track_wal_io_timing启用对 WAL 读取、写入和 fsync 时间的监控。
通常,这些参数会设置在postgresql.conf中,以便它们适用于所有服务器进程,但也可以在单个会话中使用SET命令打开或关闭它们。(为防止普通用户隐藏其活动不被管理员发现,只有超级用户才能使用SET更改这些参数。)
累积统计信息收集在共享内存中。每个PostgreSQL进程在本地收集统计信息,然后在适当的间隔更新共享数据。当服务器(包括物理副本)正常关闭时,统计信息数据的永久副本会存储在pg_stat子目录中,以便在服务器重启后保留这些统计信息。相反,当从非正常关闭开始启动(例如立即关闭后、服务器崩溃后、从基础备份启动以及进行时间点恢复)时,所有统计计数器都会被重置。
有几个预定义视图列在Table 27.1中,可用于显示系统的当前状态。另有几个视图列在Table 27.2中,可用于显示累积统计信息。或者,也可以像Section 27.2.26中所述那样,使用底层的累积统计函数构建自定义视图。
当使用累积统计视图和函数来监视收集的数据时,重要的是要意识到信息不会立即更新。每个单独的服务器进程在空闲之前将累积的统计信息刷新到共享内存中,但不会频繁于每PGSTAT_MIN_INTERVAL毫秒(1秒,除非在构建服务器时更改)一次;因此,仍在进行中的查询或事务不会影响显示的总计,显示的信息滞后于实际活动。然而,由track_activities收集的当前查询信息始终是最新的。
另一个重要点是,当服务器进程被要求显示任何累积统计信息时,在默认配置中,访问到的值会被缓存直到当前事务结束。因此,只要当前事务继续存在,统计信息就会保持静态。类似地,当在事务中首次请求任何当前会话的查询信息时,会收集关于所有会话当前查询的信息,并且相同的信息会在整个事务期间显示。这是一个特性,而不是错误,因为它允许在统计信息上执行多个查询并关联其结果,而不必担心数字在查询过程中发生变化。 在交互式分析统计信息或使用昂贵的查询时,访问各个统计信息之间的时间差可能导致缓存统计信息中出现显著的偏差。为了最小化偏差,可以将stats_fetch_consistency设置为snapshot,但这会增加用于缓存不需要的统计数据的内存使用量。相反,如果已知统计信息只被访问一次,那么缓存访问的统计信息是不必要的,可以通过将stats_fetch_consistency设置为none来避免。 可以调用 pg_stat_clear_snapshot() 丢弃当前事务的统计快照或缓存值(如果有)。下一次使用统计信息时,(在快照模式下)将创建一个新的快照,或者(在缓存模式下)缓存所访问的统计信息。
事务还可以在视图pg_stat_xact_all_tables、 pg_stat_xact_sys_tables、 pg_stat_xact_user_tables和 pg_stat_xact_user_functions中看到自己的统计信息 (尚未刷新到共享内存统计信息)。这些数字不像上面所述那样起作用; 相反,它们在事务期间持续更新。
动态统计视图中显示的一些信息在Table 27.1中受到安全限制。 普通用户只能查看关于他们自己会话的所有信息(属于他们是成员的角色的会话)。在关于其他会话的行中,许多列将为空。 但是,请注意,所有用户都可以看到会话的存在以及其一般属性,例如会话用户和数据库。 超级用户以及具有内置角色pg_read_all_stats权限的角色 (另请参阅Section 21.5)可以查看所有会话的全部信息。
Table 27.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的后端(包括自动清理工作进程)一行,显示当前进度。请参阅Section 27.4.1。 |
pg_stat_progress_create_index |
每个正在运行CREATE INDEX或REINDEX的后端一行,显示当前进度。请参阅Section 27.4.2。 |
pg_stat_progress_vacuum |
每个正在运行VACUUM的后端(包括自动清理工作进程)一行,显示当前进度。请参阅Section 27.4.3。 |
pg_stat_progress_cluster |
每个正在运行CLUSTER或VACUUM FULL的后端一行,显示当前进度。请参阅Section 27.4.4。 |
pg_stat_progress_basebackup |
每个正在流式传输基础备份的 WAL 发送进程一行,显示当前进度。请参阅Section 27.4.5。 |
pg_stat_progress_copy |
每个正在运行COPY的后端一行,显示当前进度。请参阅Section 27.4.6。 |
Table 27.2. 已收集统计信息的视图
| 视图名称 | 描述 |
|---|---|
pg_stat_archiver |
只有一行,显示有关 WAL 归档进程活动的信息。有关详细信息,请参阅pg_stat_archiver。 |
pg_stat_bgwriter |
只有一行,显示有关后台写入器活动的信息。有关详细信息,请参阅pg_stat_bgwriter。 |
pg_stat_checkpointer |
只有一行,显示有关检查点进程活动的信息。有关详细信息,请参阅pg_stat_checkpointer。 |
pg_stat_database |
每个数据库一行,显示数据库范围的统计信息。有关详细信息,请参阅pg_stat_database。 |
pg_stat_database_conflicts |
每个数据库一行,显示数据库范围内因备库上的恢复冲突而导致查询被取消的统计信息。有关详细信息,请参阅pg_stat_database_conflicts。 |
pg_stat_io |
对于每种后端类型、上下文和目标对象的组合各有一行,包含集簇范围的 I/O 统计信息。有关详细信息,请参阅pg_stat_io。 |
pg_stat_replication_slots |
每个复制槽一行,显示有关复制槽使用情况的统计信息。有关详细信息,请参阅pg_stat_replication_slots。 |
pg_stat_slru |
每个 SLRU 一行,显示操作统计信息。有关详细信息,请参阅pg_stat_slru。 |
pg_stat_subscription_stats |
每个订阅一行,显示有关错误的统计信息。有关详细信息,请参阅pg_stat_subscription_stats。 |
pg_stat_wal |
只有一行,显示有关 WAL 活动的统计信息。有关详细信息,请参阅pg_stat_wal。 |
pg_stat_all_tables |
当前数据库中每个表一行,显示有关访问指定表的统计信息。详见 pg_stat_all_tables。 |
pg_stat_sys_tables |
和pg_stat_all_tables一样,但只显示系统表。 |
pg_stat_user_tables |
和pg_stat_all_tables一样,但只显示用户表。 |
pg_stat_xact_all_tables |
和pg_stat_all_tables相似,但计数动作只在当前事务内发生(还没有被包括在pg_stat_all_tables和相关视图中)。用于生存和死亡行数量的列以及清理和分析动作在此视图中不出现。 |
pg_stat_xact_sys_tables |
和pg_stat_xact_all_tables一样,但只显示系统表。 |
pg_stat_xact_user_tables |
和pg_stat_xact_all_tables一样,但只显示用户表。 |
pg_stat_all_indexes |
当前数据库中的每个索引一行,显示有关访问该特定索引的统计信息。有关详细信息,请参阅pg_stat_all_indexes。 |
pg_stat_sys_indexes |
和pg_stat_all_indexes一样,但只显示系统表上的索引。 |
pg_stat_user_indexes |
和pg_stat_all_indexes一样,但只显示用户表上的索引。 |
pg_statio_all_tables |
当前数据库中的每个表一行,显示有关访问该特定表的 I/O 统计信息。有关详细信息,请参阅pg_statio_all_tables。 |
pg_statio_sys_tables |
和pg_statio_all_tables一样,但只显示系统表。 |
pg_statio_user_tables |
和pg_statio_all_tables一样,但只显示用户表。 |
pg_statio_all_indexes |
当前数据库中的每个索引一行,显示有关访问该特定索引的 I/O 统计信息。有关详细信息,请参阅pg_statio_all_indexes。 |
pg_statio_sys_indexes |
和pg_statio_all_indexes一样,但只显示系统表上的索引。 |
pg_statio_user_indexes |
和pg_statio_all_indexes一样,但只显示用户表上的索引。 |
pg_statio_all_sequences |
当前数据库中的每个序列一行,显示有关访问该特定序列的 I/O 统计信息。有关详细信息,请参阅pg_statio_all_sequences。 |
pg_statio_sys_sequences |
和pg_statio_all_sequences一样,但只显示系统序列(目前没有定义系统序列,因此这个视图总是为空)。 |
pg_statio_user_sequences |
和pg_statio_all_sequences一样,但只显示用户序列。 |
pg_stat_user_functions |
每个被跟踪的函数一行,显示有关该函数执行的统计信息。有关详细信息,请参阅pg_stat_user_functions。 |
pg_stat_xact_user_functions |
和pg_stat_user_functions相似,但是只统计在当前事务期间的调用(还没有被包括在pg_stat_user_functions中)。 |
每个索引的统计信息对于判断哪些索引正在被使用以及它们有多有效尤其有用。
pg_stat_io 和 pg_statio_ 系列视图对于确定缓冲区缓存的有效性很有用,它们可用于计算缓存命中率。请注意,尽管PostgreSQL 的 I/O 统计信息捕获了内核被调用以执行 I/O 的大多数情况,但它们并不区分必须从磁盘读取的数据和已经存在于内核页面缓存中的数据。建议将PostgreSQL统计视图与操作系统工具结合使用,以更全面地了解数据库的 I/O 性能。
pg_stat_activity #pg_stat_activity视图每个服务器进程将有一行,显示与该进程当前活动相关的信息。
Table 27.3. pg_stat_activity 视图
|
列类型 描述 |
|---|
|
这个后端连接到的数据库的OID |
|
这个后端连接到的数据库的名称 |
|
这个后端的进程 ID |
|
如果该进程是并行查询工作进程,则为并行组领导者的进程 ID;如果该进程是并行应用工作进程,则为领导应用工作进程的进程 ID。 |
|
登录到这个后端的用户的 OID |
|
登录到此后端的用户名称 |
|
连接到此后端的应用名称 |
|
连接到这个后端的客户端的 IP 地址。如果这个字段为空,它表示客户端通过服务器机器上的一个 Unix 套接字连接或者这是一个内部进程,如自动清理。 |
|
已连接的客户端的主机名,由 |
|
客户端用于与此后端通信的TCP端口号,如果使用Unix套接字,则为 |
|
这个进程被启动的时间。对客户端后端来说,这就是客户端连接到服务器的时间。 |
|
这个进程的当前事务被启动的时间,如果没有活动事务则为空。 如果当前查询是它的第一个事务,这一列等于 |
|
当前活动查询开始的时间;如果 |
|
|
|
后端正在等待的事件类型(如果有);否则为 |
|
如果此后端当前正在等待,则返回等待事件名称,否则为 |
|
这个后端的当前总体状态。可能的值为:
|
|
这个后端的顶层事务标识符,如果存在。 |
|
当前后端的 |
|
这个后端的最近查询的标识符。 如果 |
|
这个后端最近查询的文本。如果 |
|
当前后端的类型。可能的类型为 |
wait_event和state列彼此独立。 如果某个后端处于active状态,它可能正在等待某个事件,也可能没有等待。 如果状态为active且wait_event非空, 就表示某个查询正在执行,但在系统中的某处被阻塞了。
Table 27.4. 等待事件类型
| 等待事件类型 | 描述 |
|---|---|
Activity |
服务器进程空闲。此事件类型表示在其主处理循环中等待活动的进程。 wait_event将标识具体的等待点;参见Table 27.5。 |
BufferPin |
服务器进程正在等待对数据缓冲的独占访问。 如果另一个进程持有一个打开的游标,该游标最后一次从相关缓冲区读取数据,则缓冲区销等待可能是漫长的。 参见Table 27.6。 |
Client |
服务器进程正在等待连接到用户应用程序的套接字上的活动。 因此,服务器预计发生一些独立于其内部进程的事情。wait_event将识别特定的等待点;参见Table 27.7。 |
Extension |
服务器进程正在等待扩展模块定义的某个条件。参见Table 27.8。 |
InjectionPoint |
服务器进程正在等待某个注入点在测试中达到预定义结果。更多细节请参见Section 36.10.13。该类型没有预定义的等待点。 |
IO |
服务器进程正在等待一个I/O操作完成。wait_event将识别特定的等待点;参见Table 27.9。 |
IPC |
服务器进程正在等待与另一个服务器进程进行交互。wait_event将标识具体的等待点;参见Table 27.10。 |
Lock |
服务器进程正在等待一个重量级锁。重量级锁,也称为锁管理器锁或简单锁,主要保护表等SQL可见对象。 然而,它们也用于确保某些内部操作的互斥,例如关系扩展。wait_event将识别等待的锁的类型;参见Table 27.11。 |
LWLock |
服务器进程正在等待一个轻量级锁。大多数这样的锁保护共享内存中的特定数据结构。 wait_event将包含标识轻量级锁用途的名称。 (有些锁有特定的名称;其他锁是一组锁的一部分,每个锁具有类似的目的。)参见Table 27.12。 |
Timeout |
服务器进程正在等待超时过期。wait_event将识别特定的等待点;参见Table 27.13。 |
Table 27.5. Activity类型的等待事件
Activity 等待事件 |
描述 |
|---|---|
ArchiverMain |
在归档进程的主循环中等待。 |
AutoVacuumMain |
在自动清理启动过程的主循环中等待。 |
BgWriterHibernate |
在后台写进程中等待,休眠状态。 |
BgWriterMain |
在后台写进程主循环中等待。 |
CheckpointerMain |
在检查点进程的主循环中等待。 |
LogicalApplyMain |
在逻辑复制应用进程的主循环中等待。 |
LogicalLauncherMain |
在逻辑复制启动器进程的主循环中等待。 |
RecoveryWalStream |
流恢复期间,在启动进程主循环等待WAL到达。 |
SysLoggerMain |
在 syslogger 进程的主循环中等待。 |
WalReceiverMain |
在WAL接收器进程的主循环中等待。 |
WalSenderMain |
在 WAL 发送进程的主循环中等待。 |
WalWriterMain |
在WAL写入进程的主循环中等待。 |
Table 27.6. BufferPin类型的等待事件
BufferPin 等待事件 |
描述 |
|---|---|
BufferPin |
等待获得缓冲区上的独占销。 |
Table 27.7. Client类型的等待事件
Client 等待事件 |
描述 |
|---|---|
ClientRead |
等待从客户端读取数据。 |
ClientWrite |
等待写入数据到客户端。 |
GSSOpenServer |
在建立GSSAPI会话时等待从客户端读取数据。 |
LibPQWalReceiverConnect |
在WAL接收器等待与远程服务器建立连接。 |
LibPQWalReceiverReceive |
在WAL接收器中等待从远程服务器接收数据。 |
SSLOpenServer |
在尝试连接时等待SSL。 |
WalSenderWaitForWAL |
在 WAL 发送进程中等待 WAL 被刷新。 |
WalSenderWriteData |
在 WAL 发送进程中处理 WAL 接收器的回复时,等待任何活动。 |
Table 27.8. Extension类型的等待事件
Extension 等待事件 |
描述 |
|---|---|
Extension |
在扩展中等待。 |
Table 27.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文件。 |
Table 27.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 哈希参与者来分配更多批处理。 |
HashGrowBatchesFinish |
等待当选的平行散列参与者决定未来的批量增长。 |
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 |
等待分组组长在并行操作结束时更新事务状态。 |
Table 27.11. Lock类型的等待事件
Lock 等待事件 |
描述 |
|---|---|
advisory |
等待获得一个建议用户锁。 |
extend |
等待扩展一个关系。 |
frozenid |
等待升级 pg_database.datfrozenxid 和 pg_database.datminmxid. |
object |
等待获取非关系数据库对象上的锁。 |
page |
等待获取一个关系页面上的锁。 |
relation |
等待获得一个关系的锁。 |
spectoken |
等待获取推测的插入锁。 |
transactionid |
等待事务完成。 |
tuple |
等待获取元组上的锁。 |
userlock |
等待获取用户锁。 |
virtualxid |
等待获取虚拟事务ID锁。 |
Table 27.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信息。 |
NotifyBuffer |
在NOTIFY 消息 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。 |
扩展可以将Extension、InjectionPoint 和 LWLock 类型添加到Table 27.8和Table 27.12所示的列表中。 在某些情况下,扩展分配的 LWLock 名称无法在所有服务器进程中使用;因此,LWLock 等待事件可能只会被报告为“extension”,而不是扩展分配的名称。
Table 27.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)
SELECT a.pid, a.wait_event, w.description
FROM pg_stat_activity a JOIN
pg_wait_events w ON (a.wait_event_type = w.type AND
a.wait_event = w.name)
WHERE a.wait_event is NOT NULL and a.state = 'active';
-[ RECORD 1 ]------------------------------------------------------------------
pid | 686674
wait_event | WALInitSync
description | Waiting for a newly initialized WAL file to reach durable storage
pg_stat_replication #pg_stat_replication视图为每个 WAL 发送进程包含一行,显示有关复制到该发送进程所连接备库的统计信息。 这里只列出直接连接的备库;不包含下游备库的信息。
Table 27.14. pg_stat_replication 视图
|
列类型 描述 |
|---|
|
一个 WAL 发送进程的进程 ID |
|
登录到这个 WAL 发送进程的用户的 OID |
|
登录到这个 WAL 发送进程的用户的名称 |
|
连接到这个 WAL 发送进程的应用的名称 |
|
连接到这个 WAL 发送进程的客户端的 IP 地址。 如果这个域为空,它表示该客户端通过服务器机器上的一个Unix 套接字连接。 |
|
已连接的客户端的主机名,由 |
|
客户端用来与这个 WAL 发送进程通讯的 TCP 端口号,如果使用 Unix 套接字则为 |
|
这个进程开始的时间,即客户端是何时连接到这个WAL 发送进程的。 |
|
由hot_standby_feedback报告的该备库的 |
|
当前的 WAL 发送进程状态。 可能的值是:
|
|
在这个连接上发送的最后一个预写式日志的位置 |
|
该备库已写入磁盘的最后一个预写式日志位置 |
|
该备库已刷入磁盘的最后一个预写式日志位置 |
|
已在该备库数据库中重放的最后一个预写式日志位置 |
|
从本地刷写最近的 WAL,到收到该备库已写入该 WAL(但尚未刷盘或应用)的通知之间经过的时间。 如果该服务器被配置为同步备库,可用此值衡量在提交时 |
|
从本地刷写最近的 WAL,到收到该备库已写入并刷写该 WAL(但尚未应用)的通知之间经过的时间。 如果该服务器被配置为同步备库,可用此值衡量在提交时 |
|
从本地刷写最近的 WAL,到收到该备库已写入、刷写并应用该 WAL 的通知之间经过的时间。 如果该服务器被配置为同步备库,可用此值衡量在提交时 |
|
在基于优先级的同步复制中,该备库被选为同步备库的优先级。在基于法定人数的同步复制中,此值不起作用。 |
|
该备库的同步状态。 可能的值是:
|
|
从备库收到的最后一条回复消息的发送时间 |
pg_stat_replication视图中报告的滞后时间,是最近的 WAL 被写入、刷写和重放,以及发送端获知这些操作完成所花费时间的度量。如果远程服务器被配置为同步备库,这些时间表示各个同步提交级别带来或可能带来的提交延迟。对于异步备库,replay_lag列是最近事务对查询变得可见所需延迟时间的近似值。如果备库已经完全追上发送服务器且没有新的 WAL 活动,系统会在短时间内继续显示最近测得的滞后时间,随后显示为 NULL。
对于物理复制,滞后时间会自动测量。逻辑解码插件可以选择发出跟踪消息;如果没有这样做,跟踪机制会将滞后显示为 NULL。
报告出的滞后时间并不是根据当前重放速率预测该备库还需多久才能追上发送服务器。在持续生成新 WAL 时,那样的系统可能会显示相近的时间;但当发送端空闲时,就会显示不同的值。特别是当备库已经完全追上时,pg_stat_replication显示的是写入、刷写和重放最近报告的 WAL 位置所花费的时间,而不是某些用户可能预期的零。这样做符合为最近写事务测量同步提交和事务可见性延迟的目的。为减少用户因预期另一种滞后模型而产生的混淆,在一个已完全重放且处于空闲状态的系统上,lag 列会在较短时间后恢复为 NULL。监控系统应自行决定将这种情况表示为缺失数据、零,还是继续显示最近一次已知值。
pg_stat_replication_slots #pg_stat_replication_slots视图将包含每个逻辑复制槽的一行,显示关于其使用情况的统计信息。
Table 27.15. pg_stat_replication_slots 视图
|
列类型 描述 |
|---|
|
唯一的,复制槽的集簇范围标识符 |
|
当逻辑解码在解码来自WAL的更改时所使用的内存超过 |
|
在为该槽位解码来自WAL的更改时,事务溢出到磁盘的次数。 此计数器在每次事务被溢出时递增,并且同一事务可能被溢出多次。 |
|
在对来自WAL的更改执行解码时,已解码的事务数据溢出到磁盘的数量。 这个和其他溢出计数器可用于测量逻辑解码期间发生的I/O,并且允许调优 |
|
在逻辑解码在解码来自该槽位的WAL更改的时候,所使用的内存超过 |
|
在为该槽位解码来自WAL的更改时,将正在进行的事务流到解码输出插件的次数。 此计数器在每次事务流化时递增,并且同一事务可能被流化多次。 |
|
在为该槽位解码来自WAL的更改时,为将正在进行的事务流到解码输出插件而解码的事务数据的数量。 这个和针对此槽位的其他流计数器可用于调优 |
|
针对此槽的,发送到解码输出插件的已解码事务数。 这只计算顶级事务,对子事务不会增加。 注意,这包括流化和/或溢出的事务。 |
|
在对此槽位的WAL进行解码时,为将事务发送到解码输出插件而解码的事务数据量。 注意这包括流和/或溢出的数据。 |
|
这些统计最后重置的时间 |
pg_stat_wal_receiver #pg_stat_wal_receiver事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。
Table 27.16. pg_stat_wal_receiver 视图
|
列类型 描述 |
|---|
|
WAL接收器进程的进程ID |
|
WAL接收进程的活动状态 |
|
WAL接收器启动时使用的第一个写前日志位置 |
|
WAL接收器启动时使用的第一个时间线数字 |
|
已经接收并写入磁盘的最后一个预写式日志位置,但没有刷入。这不能用于数据完整性检查。 |
|
已经接收并刷入到磁盘的最后一个预写式日志位置,该字段的初始值是启动WAL接收器时使用的第一个日志位置 |
|
接收并刷入到磁盘的最后一个预写式日志位置的时间线数字,该字段的初始值为启动WAL接收器时使用的第一个日志位置的时间线数字 |
|
从源 WAL 发送进程收到的最后一条消息的发送时间 |
|
从源 WAL 发送进程收到的最后一条消息的接收时间 |
|
向源 WAL 发送进程报告的最后一个预写式日志位置 |
|
向源 WAL 发送进程报告最后一个预写式日志位置的时间 |
|
这个WAL接收器使用的复制槽的名称 |
|
这个WAL接收器连接到的PostgreSQL实例的主机。 这可以是主机名、IP地址,或者目录路径,如果连接是通过Unix套接字进行的。(路径的情况可以区分,因为它总是以 |
|
这个WAL接收器连接的PostgreSQL实例的端口号。 |
|
这个WAL接收器使用的连接字符串,对安全敏感的字段进行了模糊处理。 |
pg_stat_recovery_prefetch #pg_stat_recovery_prefetch视图将只包含一行。 wal_distance、block_distance和 io_depth列显示当前值,其他列显示可以使用 pg_stat_reset_shared函数重置的累积计数器。
Table 27.17. pg_stat_recovery_prefetch 视图
|
列类型 描述 |
|---|
|
这些统计数据上次重置的时间 |
|
因为不在缓冲池中,所以预取的块数 |
|
因为它们已经在缓冲池中,所以未预取的块数 |
|
未预取的块数,因为它们将被初始化为零 |
|
未预取的块数,因为它们尚不存在 |
|
由于WAL中包含完整页图像而未预取的块数 |
|
由于最近已经预取过而未预取的块数 |
|
预取器向前查看多少字节 |
|
预取器正在查看多少个块之前 |
|
已启动但尚未完成的预取数量 |
pg_stat_subscription #Table 27.18. pg_stat_subscription 视图
|
列类型 描述 |
|---|
|
订阅的OID |
|
订阅的名称 |
|
订阅工作进程的类型。可能的类型有 |
|
订阅工作进程的进程 ID |
|
该工作进程正在同步的关系的 OID;主应用工作进程则为 |
|
接收到的最后一个预写式日志位置,该字段的初始值为0 |
|
从源 WAL 发送进程收到的最后一条消息的发送时间 |
|
从源 WAL 发送进程收到的最后一条消息的接收时间 |
|
向源 WAL 发送进程报告的最后一个预写式日志位置 |
|
向 WAL 发送进程报告最后一个预写式日志位置的时间 |
pg_stat_subscription_stats #pg_stat_subscription_stats视图将包含每个订阅的一行。
Table 27.19. pg_stat_subscription_stats 视图
|
列类型 描述 |
|---|
|
订阅的OID |
|
订阅的名称 |
|
应用更改时发生错误的次数 |
|
在初始表同步期间发生错误的次数 |
|
这些统计数据最后一次重置的时间 |
pg_stat_ssl #pg_stat_ssl视图将为每一个后端或者 WAL 发送进程包含一行,用来显示这个连接上的 SSL 使用情况。 可以把它与pg_stat_activity或者pg_stat_replication通过pid列连接来得到更多有关该连接的细节。
Table 27.20. pg_stat_ssl 视图
|
列类型 描述 |
|---|
|
后端或 WAL 发送进程的进程 ID |
|
如果在此连接上使用SSL,则为真 |
|
使用SSL的版本,如果此连接上没有使用SSL则为NULL |
|
正在使用的SSL密码的名称,如果此连接上没有使用SSL则为NULL |
|
使用的加密算法中的位数,如果此连接上没有使用SSL则为NULL |
|
区别名称(DN,Distinguished Name)字段与使用的客户端证书,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 如果DN字段长于 |
|
客户端证书的序列号,如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。 证书序列号和证书颁发者的组合唯一标识一个证书(除非颁发者错误地重用序列号)。 |
|
客户端证书颁发者的区别名称(DN,Distinguished Name),如果没有提供客户端证书或在此连接上没有使用SSL,则为NULL。该字段像 |
pg_stat_gssapi #pg_stat_gssapi视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。 它可以加入到pg_stat_activity或pg_stat_replication上的pid列,获取更多关于连接的详细信息。
Table 27.21. pg_stat_gssapi 视图
|
列类型 描述 |
|---|
|
后端进程ID |
|
如果此连接使用了 GSSAPI 认证,则为真 |
|
用于验证此连接的主体,如果未使用GSSAPI对此连接进行认证,则为NULL。 如果主体长度超过 |
|
如果在此连接上使用了GSSAPI加密,则为真 |
|
如果此连接上已委派 GSSAPI 凭据,则为真 |
pg_stat_archiver #pg_stat_archiver视图总是有一行,其中包含关于集簇的归档进程的数据。
Table 27.22. pg_stat_archiver 视图
|
列类型 描述 |
|---|
|
已成功归档的WAL文件数 |
|
最近成功归档的WAL文件的名称 |
|
最近成功归档操作的时间 |
|
记录WAL文件归档失败次数 |
|
最近一次归档操作失败的WAL文件的名称 |
|
最近一次归档操作失败的时间 |
|
这些统计数据最后一次重置的时间 |
通常,WAL 文件会按从最旧到最新的顺序归档,但这并无保证,也不适用于某些特殊情况,例如备库提升或崩溃恢复之后。因此,不能安全地假设所有早于 last_archived_wal的文件也已成功归档。
pg_stat_io #pg_stat_io 视图对每种后端类型、目标 I/O 对象和 I/O 上下文的组合各提供一行,显示整个集簇范围内的 I/O 统计信息。没有意义的组合会被省略。
Currently, I/O on relations (e.g. tables, indexes) is tracked. However, relation I/O which bypasses shared buffers (e.g. when moving a table from one tablespace to another) is currently not tracked.
Table 27.23. pg_stat_io 视图
|
列类型 描述 |
|---|
|
后端类型(例如后台工作进程、autovacuum 工作进程)。有关 |
|
I/O 操作的目标对象。可能的值有:
|
|
I/O 操作的上下文。可能的值有:
|
|
读取操作的次数,每次操作的大小由 |
|
在读取操作中花费的时间,以毫秒计(如果启用了 track_io_timing,否则为零)。 |
|
写入操作的次数,每次操作的大小由 |
|
在写入操作中花费的时间,以毫秒计(如果启用了 track_io_timing,否则为零)。 |
|
进程请求内核写出到永久存储的、大小为 |
|
在写回操作中花费的时间,以毫秒计(如果启用了 track_io_timing,否则为零)。这包括排队写出请求 所花费的时间,以及可能实际写出脏数据所花费的时间。 |
|
关系扩展操作的次数,每次操作的大小由 |
|
在扩展操作中花费的时间,以毫秒计(如果启用了 track_io_timing,否则为零)。 |
|
每个 I/O 读取、写入或扩展单位的字节数。 关系数据的读取、写入和扩展以 |
|
在共享缓冲区中找到所需块的次数。 |
|
为了腾出空间供其他用途而将块从共享或本地缓冲区写出的次数。 在 |
|
在 |
|
|
|
在 fsync 操作中花费的时间,以毫秒计(如果启用了 track_io_timing,否则为零)。 |
|
这些统计信息上次被重置的时间。 |
某些后端类型永远不会对某些 I/O 对象和/或在某些 I/O 上下文中执行 I/O 操作,这些行会从视图中省略。例如,检查点进程不会对临时表执行检查点,因此不会出现 backend_type 为 checkpointer 且 object 为 temp relation 的行。
此外,某些 I/O 操作永远不会由某些后端类型执行,或者永远不会针对某些 I/O 对象和/或在某些 I/O 上下文中执行。这些单元格会是 NULL。例如,临时表不会执行 fsync,因此当 object 为 temp relation 时,fsyncs 将为 NULL。又如,后台写入器不会执行读取,因此当 backend_type 为 background writer 时,reads 将为 NULL。
pg_stat_io 可用于指导数据库调优。例如:
较高的 evictions 计数可能表明应增大共享缓冲区。
客户端后端依赖检查点进程确保数据持久化到永久存储。客户端后端出现大量 fsyncs 可能表明共享缓冲区或检查点进程配置不当。有关配置检查点进程的更多信息,请参阅Section 28.5。
通常,客户端后端应尽可能依赖检查点进程和后台写入器等辅助进程去写出脏数据。客户端后端出现大量写入可能表明共享缓冲区或检查点进程配置不当。有关配置检查点进程的更多信息,请参阅Section 28.5。
只有在启用track_io_timing时,跟踪 I/O 时间的列才会 非零。若自上次统计信息重置以来的整个期间并未始终启用 track_io_timing,则在将这些列与相应的 I/O 操作结合引用时 应格外小心。
pg_stat_bgwriter #pg_stat_bgwriter 视图始终只有一行,包含有关集簇后台写入器的数据。
Table 27.24. pg_stat_bgwriter 视图
|
列类型 描述 |
|---|
|
后台写入器写入的缓冲区数量 |
|
后台写入器因写入了过多缓冲区而停止清理扫描的次数 |
|
分配的缓冲区数量 |
|
这些统计信息上次被重置的时间 |
pg_stat_checkpointer #pg_stat_checkpointer 视图始终只有一行,包含有关集簇检查点进程的数据。
Table 27.25. pg_stat_checkpointer 视图
|
列类型 描述 |
|---|
|
因超时而安排的检查点数量。请注意,如果服务器自上次检查点以来一直处于 空闲状态,则检查点可能会被跳过,而该值同时统计已完成和已跳过的检查点。 |
|
已执行的请求检查点数量 |
|
因超时或上次尝试执行失败后而安排的重启点数量 |
|
被请求执行的重启点数量 |
|
已执行的重启点数量 |
|
处理检查点和重启点时,将文件写入磁盘阶段所花费的总时间,以毫秒计 |
|
处理检查点和重启点时,将文件同步到磁盘阶段所花费的总时间,以毫秒计 |
|
在检查点和重启点期间写入的缓冲区数量 |
|
这些统计信息上次被重置的时间 |
pg_stat_wal #pg_stat_wal 视图一直有一行,包含关于集簇的WAL活动的数据。
Table 27.26. pg_stat_wal 视图
|
列类型 描述 |
|---|
|
生成的WAL记录的总数 |
|
生成的WAL全页映像的总数 |
|
生成的WAL总数,以字节计 |
|
因为缓冲区已满,WAL数据被写入磁盘的次数 |
|
通过 |
|
通过 |
|
通过 |
|
通过 |
|
这些统计数据最后一次重置的时间 |
pg_stat_database #pg_stat_database视图将包含一行用于集簇中的每个数据库,加一行用于共享对象,显示数据库范围的统计信息。
Table 27.27. pg_stat_database 视图
|
列类型 描述 |
|---|
|
该数据库的OID,属于共享关系的对象为0 |
|
这个数据库的名称,或者共享对象为 |
|
当前连接到此数据库的后端数,对于共享对象则为 |
|
此数据库中已提交的事务数 |
|
该数据库中已回滚的事务数 |
|
在该数据库中读取的磁盘块数 |
|
在缓冲区缓存中发现磁盘块、因而无需读取的次数(这里只统计 PostgreSQL 缓冲区缓存中的命中,不包括操作系统文件系统缓存中的命中) |
|
由顺序扫描获取的活动行数和由索引扫描返回的索引条目数 |
|
该数据库中由索引扫描检索的活动行数 |
|
查询在该数据库中插入的行数 |
|
这个数据库中查询更新的行数 |
|
这个数据库中被查询删除的行数 |
|
由于与此数据库中的恢复冲突而被取消的查询数。(冲突只会发生在备库上;请参阅 |
|
这个数据库中查询创建的临时文件的数量。所有临时文件都将被计数,而不顾及临时文件为什么被创建(例如,排序或散列),也不考虑log_temp_files设置。 |
|
这个数据库中的查询写入临时文件的数据总量。所有临时文件都将被计数,而不考虑临时文件为什么被创建,也不考虑log_temp_files设置。 |
|
在此数据库中检测到的死锁数 |
|
在此数据库(或共享对象)中检测到的数据页校验和失败次数,如果未启用 数据校验和则为 NULL。 |
|
在此数据库(或共享对象)中最后一次检测到数据页校验和失败的时间, 如果未启用数据校验和则为 NULL。 |
|
在这个数据库中通过后端读取数据文件块所花费的时间,以毫秒为单位(如果启用了track_io_timing,否则为零) |
|
在这个数据库中通过后端写数据文件块所花费的时间,以毫秒为单位(如果启用了track_io_timing,否则为零) |
|
计划由该数据库上的查询启动的并行工作进程数 |
|
由该数据库上的查询启动的并行工作进程数 |
|
此数据库中数据库会话所消耗的时间,以毫秒计(注意统计信息仅在会话状态发生变化时更新,因此如果会话空闲很长时间,则不包括此空闲时间) |
|
此数据库中执行SQL语句所消耗的时间,以毫秒计(这对应于 |
|
此数据库中事务空闲所消耗的时间,以毫秒计(这对应于 |
|
此数据库建立的会话总数 |
|
此数据库因为到客户端的连接丢失而被终止的数据库会话数 |
|
此数据库因为致命错误而被终止的数据库会话数 |
|
因操作者干预而被终止的、连接到此数据库的数据库会话数量 |
|
这些统计数据最后一次重置的时间 |
pg_stat_database_conflicts #pg_stat_database_conflicts视图为每个数据库包含一行,用来显示数据库范围内因与备库上的恢复过程冲突而被取消的查询统计信息。 该视图只包含备库上的信息,因为这类冲突不会发生在主库上。
Table 27.28. pg_stat_database_conflicts 视图
|
列类型 描述 |
|---|
|
数据库的OID |
|
数据库的名称 |
|
这个数据库中由于删除表空间而取消的查询的数量 |
|
此数据库中由于锁定超时而被取消的查询数 |
|
此数据库中由于旧快照而取消的查询数 |
|
此数据库中由于固定缓冲区而被取消的查询数 |
|
此数据库中由于死锁而被取消的查询数 |
|
此数据库中因旧快照或主库上的 wal_level 太低而被取消的逻辑槽使用次数 |
pg_stat_all_tables #pg_stat_all_tables视图将为当前数据库中的每一个表(包括 TOAST 表)包含一行,该行显示与对该表的访问相关的统计信息。 pg_stat_user_tables和pg_stat_sys_tables视图包含相同的信息,但是被过滤得分别只显示用户和系统表。
Table 27.29. pg_stat_all_tables 视图
|
列类型 描述 |
|---|
|
表的OID |
|
该表所在的模式的名称 |
|
这个表的名称 |
|
在此表上启动的顺序扫描数 |
|
此表上最后一次顺序扫描的时间,基于最近的事务停止时间 |
|
连续扫描获取的实时行数 |
|
对这个表发起的索引扫描数 |
|
此表上最后一次索引扫描的时间,基于最近的事务停止时间 |
|
索引扫描获取的实时行数 |
|
插入的行数 |
|
更新的行数(包括HOT更新的行) |
|
删除的行数 |
|
HOT更新的行数(即,不需要单独的索引更新) |
|
更新的行数,其中后继版本转到新的堆页,留下一个原始版本,其 |
|
活的行的估计数量 |
|
死行的估计数量 |
|
自上次分析此表以来修改的行的估计数量 |
|
自上次清理此表以来插入的行的估计数量 |
|
最后一次手动清理这个表(不包括 |
|
这个表最后一次被自动清理守护进程清理的时间 |
|
上一次手动分析这个表 |
|
自动清理守护进程最后一次分析这个表 |
|
这个表被手动清理的次数( |
|
这个表被自动清理守护进程清理的次数 |
|
手动分析这个表的次数 |
|
这个表被自动清理守护进程分析的次数 |
pg_stat_all_indexes #pg_stat_all_indexes视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexes和pg_stat_sys_indexes视图包含相同的信息,但是被过滤得只分别显示用户和系统索引。
Table 27.30. pg_stat_all_indexes 视图
|
列类型 描述 |
|---|
|
对于此索引的表的OID |
|
这个索引的OID |
|
这个索引所在的模式名称 |
|
这个索引的表的名称 |
|
这个索引的名称 |
|
在这个索引上开启的索引扫描的数量 |
|
此索引上最后一次扫描的时间,基于最近的事务停止时间 |
|
扫描此索引返回的索引项数 |
|
使用此索引进行简单索引扫描获取的活动表行数 |
索引可以被简单索引扫描、“位图”索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过 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_read和idx_tup_fetch计数也可能不同,因为idx_tup_read统计从该索引取得的索引项而idx_tup_fetch统计从表取得的活着的行。如果使用该索引取得了任何死亡行或还未提交的行,或者如果通过一次只用索引扫描的方式避免了任何堆获取,后者将较小。
使用某些SQL构造来搜索与一个列表或数组中的多个标量值里 任意一个匹配的行的查询(见Section 9.25),会在 查询执行期间执行多个“原始”索引扫描(每个标量值最多一个原始 扫描)。每个内部原始索引扫描都会递增 pg_stat_all_indexes.idx_scan, 因此索引扫描计数有可能显著超过索引扫描执行器节点的总执行次数。
pg_statio_all_tables #pg_statio_all_tables视图将为当前数据库中的每个表(包括 TOAST 表)包含一行,该行显示指定表上有关 I/O 的统计信息。pg_statio_user_tables和pg_statio_sys_tables视图包含相同的信息,但是被过滤得分别只显示用户表和系统表。
Table 27.31. pg_statio_all_tables 视图
|
列类型 描述 |
|---|
|
表的OID |
|
该表所在的模式的名称 |
|
这个表的名称 |
|
从该表中读取的磁盘块的数量 |
|
该表中的缓冲区命中数 |
|
从这个表上所有索引读取的磁盘块数 |
|
这个表上所有索引中的缓冲区命中数 |
|
从这个表的TOAST表中读取的磁盘块的数量(如果有的话) |
|
这个表的TOAST表中的缓冲区命中数(如果有的话) |
|
从这个表的TOAST表索引中读取的磁盘块的数量(如果有的话) |
|
这个表的TOAST表索引中的缓冲区命中数(如果有的话) |
pg_statio_all_indexes #pg_statio_all_indexes视图将为当前数据库中的每个索引包含一行,该行显示指定索引上有关 I/O 的统计信息。 pg_statio_user_indexes和pg_statio_sys_indexes视图包含相同的信息,但是被过滤得分别只显示用户索引和系统索引。
Table 27.32. pg_statio_all_indexes 视图
|
列类型 描述 |
|---|
|
对于此索引的表的OID |
|
这个索引的OID |
|
这个索引所在的模式名称 |
|
这个索引的表的名称 |
|
这个索引的名称 |
|
从此索引中读取的磁盘块的数量 |
|
此索引中的缓冲区命中数 |
pg_statio_all_sequences #pg_statio_all_sequences视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关 I/O 的统计信息。
Table 27.33. pg_statio_all_sequences 视图
|
列类型 描述 |
|---|
|
序列的OID |
|
此序列所在的模式的名称 |
|
此序列的名称 |
|
从这个序列中读取的磁盘块的数量 |
|
在此序列中的缓冲区命中数 |
pg_stat_user_functions #pg_stat_user_functions视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。 track_functions参数控制到底哪些函数被跟踪。
Table 27.34. pg_stat_user_functions 视图
|
列类型 描述 |
|---|
|
函数的OID |
|
这个函数所在的模式的名称 |
|
这个函数的名称 |
|
这个函数已经被调用的次数 |
|
在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 |
|
在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计 |
pg_stat_slru #PostgreSQL通过SLRU(simple least-recently-used,简单的最近-最少-使用)缓存访问某些磁盘上的信息。 pg_stat_slru视图将为每个被跟踪的SLRU缓存包含一行,显示关于访问缓存页面的统计信息。
Table 27.35. pg_stat_slru 视图
|
列类型 描述 |
|---|
|
SLRU的名称 |
|
初始化期间被置零的块数 |
|
已经在SLRU中的磁盘块被发现的次数,因此不需要读取(这只包括SLRU中的命中,而不是操作系统的文件系统缓存) |
|
为这个SLRU读取的磁盘块数 |
|
为这个SLRU写入的磁盘块数 |
|
为这个SLRU检查是否存在的块数 |
|
此SLRU的脏数据刷新数 |
|
这个SLRU的截断数 |
|
这些统计数据最后一次重置的时间 |
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。 如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出\d+ pg_stat_activity)。 针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。 针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。
与累积统计系统相关的其他功能在Table 27.36中列出。
Table 27.36. 附加统计函数
使用pg_stat_reset()还会重置自动清理使用的计数器, 以确定何时触发清理或分析。重置这些计数器可能导致自动清理不执行必要的工作, 这可能会导致问题,如表膨胀或过时的表统计信息。建议在统计信息重置后进行全库ANALYZE。
pg_stat_get_activity是pg_stat_activity视图的底层函数, 它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。 在那些情况中,可以使用一组更老的针对每个后端的统计访问函数,这些显示在Table 27.37中。 这些访问函数使用一个后端 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;
Table 27.37. 按后端统计函数
|
函数 描述 |
|---|
|
返回当前活动后端ID号的集合(从1到活动后端数)。 |
|
返回此后端最近查询的文本。 |
|
返回后端最近一次查询开始的时间。 |
|
返回连接到此后端的客户端的IP地址。 |
|
返回客户端用于通信的TCP端口号。 |
|
返回此后端连接的数据库的OID。 |
|
返回此后端进程ID。 |
|
返回该进程开始的时间。 |
|
返回指定 ID 的后端进程的子事务信息记录。返回的字段包括 |
|
返回登录到此后端的用户的OID。 |
|
如果后端当前正在等待,则返回等待事件类型名称,否则返回 |
|
如果后端当前正在等待,则返回等待事件名称,否则为 |
|
返回后端当前事务开始的时间。 |
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。