数据库监控
数据库管理员常常会疑惑,”系统正在做什么?”这一章会深入讨论这个问题。
一些工具可以用来监控数据库活动并且分析性能。这一章的大部分都致力于描述瀚高数据库的统计收集器,但是我们也不能忽视常规的Unix监控程序,如ps、top、iostat和vmstat。另外一旦我们发现了一个性能差的查询,可能需要瀚高数据库的EXPLAIN命令来进行进一步的调查。
标准Unix工具
在大部分Unix平台上,瀚高数据库会修改由ps报告的命令标题,这样个体服务器进程可以被标识。一个显示样例是
$ ps auxww | grep ^postgres
postgres 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 postgres -i
postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres:
background writer
postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres:
checkpointer
postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres:
walwriter
postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres:
autovacuum launcher
postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres:
stats collector
postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe
runbug 127.0.0.1 idle
postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl
regression [local] SELECT waiting
postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl
regression [local] idle in transaction
(ps的调用方式随不同的平台而变,但是显示的细节都差不多。这个例子来自于一个最近的Linux系统)。列在这里的第一个进程是主服务器进程。显示的命令参数是当数据库启动时使用的那些。接下来的五个进程是由主进程自动启动的后台工作者进程(如果你已经设置系统为不启动统计收集器,”统计收集器”进程将不会出现;同样”自动清理发动”进程也可以被禁用)。剩余的每一个进程都是一个处理一个客户端连接的服务器进程。每个这种进程都会把它的命令行显示设置为这种形式postgres: user database host activity在该客户端连接的生命期中,用户、数据库以及(客户端)主机项保持不变,但是活动指示器会改变。活动可以是闲置(即等待一个客户端命令)、在事务中闲置(在一个BEGIN块里等待客户端)或者一个命令类型名,例如SELECT。还有如果服务器进程正在等待一个其它会话持有的锁,等待中会被追加到上述信息中。在上面的例子中,我们可以推断:
进程15606正在等待进程15610完成其事务并且因此释放一些锁(进程 15610必定是阻塞者,因为没有其他活动会话。在更复杂的情况中,可能需要查看pg_locks系统视图来决定谁阻塞了谁)。
如果配置了cluster_name,则集簇的名字 也将会显示在ps的输出中:
$ psql -c 'SHOW cluster_name'
cluster_name
--------------
server1
(1 row)
$ ps aux|grep server1
postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres:
server1: background writer
...
如果你已经关闭了update_process_title,那么活动指示器将不会被更新,进程标题仅在新进程被启动的时候设置一次。在某些平台上这样做可以为每个命令节省资源,但在其它平台上却不明显。
Solaris需要特别的处理。你必需使用/usr/ucb/ps而不是/bin/ps。你还必需使用两个w标志,而不是一个。另外你对postgres命令的最初调用必须用一个比服务器进程提供的短的ps状态显示。如果你没有满足全部三个要求,每个服务器进程的ps输出将是原始的postgres命令行。
统计收集器
瀚高数据库的统计收集器是一个支持收集和报告服务器活动信息的子系统。 目前这个收集器可以对表和索引的访问计数,可以按磁盘块和记录行来进行计数。它还跟踪每个表中的总行数、每个表的清理和分析动作的信息。它也统计调用用户定义函数的次数以及在每次调用中花费的总时间。
瀚高数据库也支持报告有关系统正在干什么的动态信息,例如当前正在被其他服务器进程执行的命令以及系统中存在哪些其他连接。这个功能是独立于收集器进程存在的。
统计收集配置
因为统计收集给查询执行增加了一些负荷,系统可以被配置为收集或不收集信息。这由配置参数控制,它们通常在postgresql.conf中设置。
参数track_activities允许监控当前被任意服务器进程执行的命令。
参数track_counts控制是否收集关于表和索引访问的统计信息。
参数track_functions启用对用户定义函数使用的跟踪。
参数track_io_timing启用对块读写次数的监控。
参数 track_wal_io_timing 启用WAL写时间的监控。
通常这些参数被设置在postgresql.conf中,这样它们会应用于所有服务器进程,但是可以在单个会话中使用SET命令打开或关闭它们(为了阻止普通用户对管理员隐藏他们的活动,只有超级用户被允许使用SET来改变这些参数)。
统计收集器通过临时文件将收集到的信息传送给其他瀚高数据库进程。这些文件被存储在名字由stats_temp_directory参数指定的目录中,默认是pg_stat_tmp。为了得到更好的性能,stats_temp_directory可以被指向一个基于RAM的文件系统来降低物理I/O需求。当服务器被干净地关闭时,一份统计数据的永久拷贝被存储在pg_stat子目录中,这样在服务器重启后统计信息能被保持。当在服务器启动时执行恢复时(例如立即关闭、服务器崩溃以及时间点恢复之后),所有统计计数器会被重置。
查看统计信息
表 8.1中列出了一些预定义视图可以用来显示系统的当前状态。表8.2中列出了另一些视图可以显示统计收集的结果。你也可以使用底层统计函数(在第8.2.22讨论)来建立自定义的视图。
在使用统计信息监控收集到的数据时,必须了解这些信息并非是实时更新的。每个独立的服务器进程只在进入闲置状态之前才向收集器传送新的统计计数;因此正在进行的查询或事务并不影响显示出来的总数。同样,收集器本身也最多每PGSTAT_STAT_INTERVAL毫秒(缺省为500ms)发送一次新的报告。因此显示的信息总是落后于实际活动。但是由track_activities收集的当前查询信息总是最新的。
另一个重点是当一个服务器进程被要求显示任何这些统计信息时,它首先取得收集器进程最近发出的报告并且接着为所有统计视图和函数使用这个快照,直到它的当前事务的结尾。因此只要你继续当前事务,统计数据将会一直显示静态信息。当任何关于会话的查询的信息在一个事务中第一次被请求时,这样的信息将被收集。并且在整个事务期间将显示相同的信息。这是一种特性而非缺陷,因为它允许你在该统计信息上执行多个查询并且关联结果而不用担心那些数字会在你不知情的情况下改变。但是如果你希望用每个查询都看到新结果,要确保在任何事务块之外做那些查询。或者可以调用pg_stat_clear_snapshot(),那将丢弃当前事务的统计快照(如果有)。下一次对统计性信息的使用将导致获取一个新的快照。
一个事务也可以在视图pg_stat_xact_all_tables、pg_stat_xact_sys_tables、pg_stat_xact_user_tables和pg_stat_xact_user看到它自己的统计信息(还没有被传送给收集器)。这些数字并不像上面所述的那样行动,相反它们在事务期间持续被更新。
表8.1中显示的动态统计视图中的一些信息是有安全限制的。普通用户只能看到关于他们自己的会话的所有信息(属于他们是成员的角色的会话)。在关于其他会话的行中,许多列将为空。但是请注意,一个会话的存在和它的一般属性,例如会话用户和数据库,对所有用户都是可见的。超级用户和内置角色pg_read_all_stats的成员可以看到所有会话的所有信息。
表 8.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_subscription | 每个订阅至少一行,显示有关该订阅的工作者的信息。详见 pg_stat_subscription。 |
| pg_stat_ssl | 每个连接(常规的或者复制)一行,显示在这个连接上使用的SSL的信息。详见pg_stat_ssl。 |
| pg_stat_gssapi | 每个连接(常规和复制)有一行,显示关于GSSAPI验证和加密的信息。详情请参阅 pg_stat_gssapi。 |
| pg_stat_progress_analyze | 每个运行ANALYZE的后端(包括自动清理工作者进程)的行,显示当前进度。参见第8.4.1节。 |
| pg_stat_progress_create_index | 每个后台运行CREATE INDEX或REINDEX的后端都有一行,显示当前的进度。参见第8.4.2节。 |
| pg_stat_progress_vacuum | 每个运行着VACUUM的后端(包括autovacuum 工作者进程)一行,显示当前的进度。详见第8.4.3节。 |
表8.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_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_slru | 每个SLRU一行,显示操作的统计信息。详情请参阅pg_stat_slru。 |
| pg_stat_replication_slots | 每个复制插槽一行,显示有关复制插槽使用情况的统计信息。详情请参阅pg_stat_replication_slots。 |
| pg_stat_progress_cluster | 每个运行着CLUSTER或VACUUM FULL的后端一行,显示当前进度。参见第8.4.4节。 |
| pg_stat_progress_basebackup | 每一个WAL发送者进程的行显示一个基础备份,显示当前进度。参见第8.4.5节。 |
| pg_stat_progress_copy | 对每个后端运行COPY的行,显示当前进度。参见第2.4.6节。 |
每个索引的统计信息特别有用,可以确定哪些索引正在使用以及它们的效果如何。
pg_statio_视图主要用于确定缓冲区缓存的效果。当实际磁盘读取的数量远远小于缓冲区命中的数量时,缓存会满足大部分读取请求而不需要调用内核。然而,这些统计数据并不能完全说明问题:由于瀚高数据库处理磁盘I/O的方式,未在瀚高数据库缓冲区缓存中的数据可能仍然驻留在内核的I/O缓存中,因此仍然可以在不需要物理读取的情况下获取。有兴趣获取有关瀚高数据库I/O行为更详细信息的用户建议使用瀚高数据库统计收集器结合操作系统工具,这些工具允许查看内核对I/O的处理方式。
pg_stat_activity
pg_stat_activity视图将每个服务器进程显示为一行,显示与该进程当前活动相关的信息。
| 列 | 类型 | 描述 |
|---|---|---|
| datid | oid | 这个后端连接到的数据库的OID |
| datname | name | 这个后端连接到的数据库的名称 |
| pid | datname | name |
| usesysid | oid | 登录到这个后端的用户的OID |
| usename | name | 登录到这个后端的用户的名称 |
| 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。可能的值有: LWLock:后端正在等待一个轻量级锁。每一个这样的锁保护着共享内存中的一个特殊数据结构。wait_event将含有一个标识该轻量级锁目的的名称(一些锁具有特定的名称,其他是一组具有类似目的的锁中的一部分)。Lock:后端正在等待一个重量级锁。重量级锁,也称为锁管理器锁或者简单锁,主要保护SQL可见的对象,例如表。不过它们也被用于确保特定内部操作的互斥,例如关系扩展。wait_event将标识等待的锁的类型。BufferPin:服务器进程正在等待访问一个数据缓冲区,而此时没有其他进程正在检查该缓冲区。如果另一个进程持有一个最终从要访问的缓冲区中读取数据的打开的游标,缓冲区pin等待可能会被拖延。Activity:服务器进程处于闲置状态。这被用于在其主处理循环中等待活动的系统进程。wait_event将标识特定的等待点。 Extension:服务器进程正在一个扩展模块中等待活动。这一个分类被用于要跟踪自定义等待点的模块。Client:服务器进程正在一个套接字上等待来自用户应用的某种活动,并且该服务器预期某种与其内部处理无关的事情发生。wait_event将标识特定的等待点。IPC:服务器进程正在等待来自服务器中另一个进程的某种活动。wait_event将标识特定的等待点。 Timeout:服务器进程正在等待一次超时发生。wait_event将标识特定的等待点。 IO:服务器进程正在等待一次IO完成。wait_event将标识特定的等待点。 |
| wait_event | text | 如果后端当前正在等待,则是等待事件的名称,否则为NULL。详见表12.4。 |
| 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 | text | 这个后端最近查询的文本。如果state为active,这个域显示当前正在执行的查询。在所有其他状态下,它显示上一个被执行的查询。默认情况下,查询文本会被截断至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, startup,walreceiver, walsender以及walwriter。除此以外,由扩展注册的后台Worker可能有额外的类型。 |
| 等待时间类型 | 等待事件名称 | 描述 |
|---|---|---|
| LWLock | ShmemIndexLock | 正等待在共享内存中查找或者分配空间 |
| OidGenLock | 正等待分配或者赋予一个OID | |
| XidGeLock | 正等待分配或者赋予一个事务 ID。 | |
| ProcArrayLock | 正等待在事务结尾得到一个快照或者清除事务 ID | |
| SInvalReadLock | 正等待从共享无效消息队列中检索或者移除消息 | |
| SInvalWriteLock | 正等待在共享无效消息队列中增加一个消息 | |
| WALBufMappingLock | 正等待在 WAL 缓冲区中替换一个页面 | |
| WALWriteLock | 正等待 WAL 缓冲区被写入到磁盘 | |
| ControlFileLock | 正等待读取或者更新控制文件或创建一个新的WAL 文件。 | |
| CheckpointLock | 正等待执行检查点 | |
| CLogControlLock | 正等待读取或者更新事务状态 | |
| SubtransControlLock | 正等待读取或者更新子事务信息 | |
| MultiXactGenLock | 正等待读取或者更新共享多事务状态 | |
| MultiXactOffsetControlLock | 正等待读取或者更新多事务偏移映射 | |
| MultiXactMemberControlLock | 正等待读取或者更新多事务成员映射 | |
| RelCacheInitLock | 正等待读取或者写入关系缓冲区初始化文件 | |
| CheckpointerCommLock | 正等待管理 fsync 请求 | |
| TwoPhaseStateLock | 正等待读取或者更新预备事务的状态 | |
| TablespaceCreateLock | 正等待创建或者删除表空间 | |
| BtreeVacuumLock | 正等待读取或者更新一个 B- 树索引的 vacuum 相关的信息。 | |
| AddinShmemInitLock | 正等待管理共享内存中的空间分配 | |
| AutovacuumLock | 自动清理工作者或者启动器正等待更新或者读取自动清理工作者的当前状态 | |
| AutovacuumScheduleLock | 正等待确认选中进行清理的表仍需要清理 | |
| SyncScanLock | 正等待为同步扫描得到一个表上扫描的开始位置 | |
| RelationMappingLock | 正等待更新用来存储目录到文件节点映射的关系映射文件。 | |
| AsyncCtlLock | 正等待读取或者更新共享通知状态 | |
| AsyncQueueLock | 正等待读取或者更新通知消息 | |
| SerializableXactHashLock | 正等待检索或者存储有关可序列化事务的信息 | |
| SerializableFinishedListLock | 正等待访问已结束可序列化事务的列表 | |
| SerializablePredicateLockListLock | 正等待在由可序列化事务持有的所列表上执行一个操作。 | |
| OldSerXidLock | 正等待读取或者记录冲突的可序列化事务 | |
| SyncRepLock | 正等待读取或者更新有关同步复制的信息 | |
| BackgroundWorkerLock | 正等待读取或者更新后台工作者状态 | |
| DynamicSharedMemoryControlLock | 正等待读取或者更新动态共享内存状态 | |
| AutoFileLock | 正等待更新postgresql.auto.conf文件。 | |
| ReplicationSlotAllocationLock | 正等待分配或者释放一个复制槽。 | |
| ReplicationSlotControlLock | 正等待读取或者更新复制槽状态 | |
| CommitTsControlLock | 正等待读取或者更新事务提交时间戳 | |
| CommitTsLock | 正等待读取或者更新事务时间戳的最新设置值 | |
| ReplicationOriginLock | 正等待设置、删除或者使用复制源头 | |
| MultiXactTruncationLock | 正等待读取或者阶段多事务信息 | |
| OldSnapshotTimeMapLock | 正等待读取或者更新旧的快照控制信息 | |
| LogicalRepWorkerLock | 正等待逻辑复制工作者上的动作完成 | |
| CLogTruncationLock | 等待执行txid_status或更新可用的最新事务id | |
| clog | 正在等地clog (事务状态)缓冲区上的I/O | |
| commit_timestamp | 正等待提交时间戳缓冲区上的 I/O | |
| subtrans | 正等待子事务缓冲区上的 I/ O。 | |
| multixact_offset | 正等待多事务偏移缓冲区上的 I/O。 | |
| multixact_member | 正等待多事务成员缓冲区上的 I/O | |
| async | 正等待 async(通知)缓冲区上的 I/O | |
| oldserxid | 正等待 oldserxid 缓冲区上的 I/O | |
| wal_insert | 正等待把 WAL 插入到一个内存缓冲区 | |
| buffer_content | 正等待读取或者写入内存中的一个数据页 | |
| buffer_io | 正等待一个数据页面上的 I/ O | |
| replication_origin | 正等待读取或者更新复制进度 | |
| replication_slot_io | 正等待一个复制槽上的 I/O | |
| proc | 正等待读取或者更新fast- path 锁信息 | |
| buffer_mapping | 正等待把一个数据块与缓冲池中的一个缓冲区关联。 | |
| lock_manager | 正等待增加或者检查用于后端的锁,或者正等待加入或者退出一个锁定组(并行查询使用) | |
| predicate_lock_manager | 正等待增加或者检查谓词锁信息 | |
| serializable_xact | 等待在并行查询中对一个可序列化事务执行操作 | |
| parallel_query_dsa | 正等待并行查询动态共享内存分配锁 | |
| tbm | 正等待TBM共享迭代器锁 | |
| parallel_append | 在Parallel Append计划执行期间等待选择下一个子计划。 | |
| parallel_hash_join | 在Parallel Hash计划执行期间等待分配或交换一块内存 或者更新计数器 | |
| Lock | relation | 正等待获得一个关系上的锁 |
| extend | 正等待扩展一个关系 | |
| page | 正等待获得一个关系上的页面的锁 | |
| tuple | 正等待获得一个元组上的锁 | |
| transactionid | 正等待一个事务结束 | |
| virtualxid | 正等待获得一个虚拟xid 锁 | |
| speculative token | 正等待获取一个 speculative insertion lock | |
| object | 正等待获得一个非关系数据库对象上的锁 | |
| userlock | 正等待获得一个用户锁 | |
| advisory | 正等待获得一个咨询用户锁 | |
| BufferPin | BufferPin | 正等待在一个缓冲区上加pin |
| Activity | ArchiverMain | 正在归档进程的主循环中等待 |
| AutoVacuumMain | 正在autovacuum启动器进程的主循环中等待 | |
| BgWriterHibernate | 正在后台写入器进程中等待,休眠中 | |
| BgWriterMain | 正在后台写入器进程的后台工作者的主循环中等待 | |
| CheckpointerMain | 正在检查点进程的主循环中等待 | |
| LogicalApplyMain | 正在逻辑应用进程的主循环中等待 | |
| LogicalLauncherMain | 正在逻辑启动器进程的主循环中等待 | |
| PgStatMain | 正在统计收集器进程的主循环中等待 | |
| RecoveryWalAll | 在恢复时等待来自于任意类型来源(本地、归档或流) 的WAL | |
| RecoveryWalStream | 在恢复时等待来自于一个流的WAL | |
| SysLoggerMain | 正在系统日志进程的主循环中等待 | |
| WalReceiverMain | 正在WAL接收器进程的主循环中等待 | |
| WalSenderMain | 正在WAL发送器进程的主循环中等待 | |
| WalWriterMain | 正在WAL写入器进程的主循环中等待 | |
| Client | ClientRead | 正等待从客户端读取数据 |
| ClientWrite | 正等待向客户端写入数据 | |
| LibPQWalReceiverConnect | 正在WAL接收器中等待建立与远程服务器的连接 | |
| LibPQWalReceiverReceive | 正在WAL接收器中等待从远程服务器接收数据 | |
| SSLOpenServer | 正在尝试连接期间等待SSL | |
| WalReceiverWaitStart | 正等待startup进程发送流复制的初始数据 | |
| WalSenderWaitForWAL | 正在WAL发送器进程中等待WAL被刷写 | |
| WalSenderWriteData | 在WAL发送器进程中处理来自WAL接收器的回复时等待任意活动 | |
| Extension | Extension | 正在一个扩展中等待 |
| IPC | BgWorkerShutdown | 正等待后台工作者关闭 |
| BgWorkerStartup | 正等待后台工作者启动 | |
| BtreePage | 正等待继续并行B-树扫描所需的页号变得可用 | |
| CheckpointDone | 等待检查点完成 | |
| CheckpointStart | 等待检查点开始 | |
| ClogGroupUpdate | 正等待组领袖在事务结束时更新事务状态 | |
| ExecuteGather | 在执行Gather节点时等待来自子进程的活动 | |
| Hash/Batch/Allocating | 正等待一个选出的Parallel Hash参与者分配哈希表 | |
| Hash/Batch/Electing | 正在选出一个Parallel Hash 参与者来分配一个哈希表 | |
| Hash/Batch/Loading | 正等待其他Parallel Hash参与者完成装载哈希表 | |
| Hash/Build/Allocating | 正等待一个选出的Parallel Hash参与者分配初始哈希表 | |
| Hash/Build/Electing | 正在选出一个Parallel Hash 参与者以分配初始哈希表 | |
| Hash/Build/HashingInner | 正等待其他Parallel Hash参与者完成对内关系的哈希操作。 | |
| Hash/Build/HashingOuter | 正等待其他Parallel Hash参与者完成对外关系的哈希操作 | |
| Hash/GrowBatches/ Allocating | 正等待一个选出的Parallel Hash参与者分配更多批次 | |
| Hash/GrowBatches/Deciding | 正在选出一个Parallel Hash 参与者决定未来的批次增长。 | |
| Hash/GrowBatches/Electing | 正在选出一个Parallel Hash 参与者分配更多批次 | |
| Hash/GrowBatches/ Finishing | 正 在 等 待 一 个 选 出 的 Parallel Hash参与者决定未来的批次增长 | |
| Hash/GrowBatches/ Repartitioning | 正等待其他Parallel Hash参与者完成重新分区 | |
| Hash/GrowBuckets/ Allocating | 正等待一个选出的Parallel Hash参与者完成更多桶的分配 | |
| Hash/GrowBuckets/Electing | 正在选出一个Parallel Hash 参与者分配更多桶 | |
| Hash/GrowBuckets/ Reinserting | 正等待其他Parallel Hash参与者完成将元组插入到新桶 的操作 | |
| LogicalSyncData | 正等待逻辑复制的远程服务器发送用于初始表同步的数据 | |
| LogicalSyncStateChange | 正等待逻辑复制的远程服务器发送用于初始表同步的数据 | |
| LogicalSyncStateChange | 正等待逻辑复制的远程服务器更改状态 | |
| MessageQueueInternal | 正等待其他进程被挂接到共享消息队列 | |
| MessageQueuePutMessage | 正等待把一个协议消息写到一个共享消息队列 | |
| MessageQueueReceive | 正等待从一个共享消息队列接收字节 | |
| MessageQueueSend | 正等待向一个共享消息队列中发送字节 | |
| ParallelBitmapScan | 正等待并行位图扫描被初始化 | |
| ParallelCreateIndexScan | 正等待并行CREATE INDEX工作者完成堆扫描 | |
| ParallelFinish | 正等待并行工作者完成计算 | |
| ProcArrayGroupUpdate | 正等待组领袖在事务结束时清除事务ID | |
| Promote | 等待备用节点升级 | |
| ReplicationOriginDrop | 正等待一个复制源头变得不活跃以便被删除 | |
| ReplicationSlotDrop | 正等待一个复制槽变得不活跃以便被删除 | |
| SafeSnapshot | 正等待一个用于READ ONLY DEFERRABLE事务的快照 | |
| SyncRep | 正在同步复制期间等待来自远程服务器的确认 | |
| Timeout | BaseBackupThrottle | 当有限流活动时在基础备份期间等待 |
| PgSleep | 正在调用pg_sleep的进程中等待 | |
| RecoveryApplyDelay | 在恢复时等待应用WAL,因为它被延迟了 | |
| IO | BufFileRead | 正等待从一个缓存的文件中读取 |
| BufFileWrite | 正等待向一个缓存的文件中写入 | |
| ControlFileRead | 正等待从控制文件中读取 | |
| ControlFileSync | 正等待控制文件到达稳定存储 | |
| ControlFileSyncUpdate | 正等待对控制文件的更新到达稳定存储 | |
| ControlFileWrite | 正等待一个对控制文件的写入 | |
| ControlFileWriteUpdate | 正等待一个写操作更新控制文件 | |
| CopyFileRead | 正在文件拷贝操作期间等待一个读操作 | |
| CopyFileWrite | 正在文件拷贝操作期间等待一个写操作 | |
| DataFileExtend | 正等待一个关系数据文件被扩充 | |
| DataFileFlush | 正等待一个关系数据文件到达稳定存储 | |
| DataFileImmediateSync | 正等待一个关系数据文件的立即同步到达稳定存储 | |
| DataFilePrefetch | 正等待从一个关系数据文件中的一次异步预取 | |
| DataFileRead | 正等待一次对一个关系数据文件的读操作 | |
| DataFileSync | 正等待对一个关系数据文件的更改到达稳定存储 | |
| DataFileTruncate | 正等待一个关系数据文件被截断 | |
| DataFileWrite | 正等待一次对一个关系数据文件的写操作 | |
| DSMFillZeroWrite | 等待向一个动态共享内存备份文件中写零字节 | |
| LockFileAddToDataDirRead | 在向数据目录锁文件中增加一行时等待一个读操作 | |
| LockFileAddToDataDirSync | 在向数据目录锁文件中增加一行时等待数据到达稳定存储 | |
| LockFileAddToDataDirWrite | 在向数据目录锁文件中增加一行时等待一个写操作 | |
| LockFileCreateRead | 在创建数据目录锁文件期间等待读取 | |
| LockFileCreateSync | 在创建数据目录锁文件期间等待数据到达稳定存储 | |
| LockFileCreateWrite | 在创建数据目录锁文件期间等待一个写操作 | |
| LockFileReCheckDataDirRead | 在重新检查数据目录锁文件的过程中等待一个读操作 | |
| LogicalRewriteCheckpointSync | 在一个检查点期间等待逻辑重写映射到达稳定存储 | |
| LogicalRewriteMappingSync | 在一次逻辑重写期间等待映射数据到达稳定存储 | |
| LogicalRewriteMappingWrite | 在一次逻辑重写期间等待对映射数据的写操作 | |
| LogicalRewriteSync | 正等待逻辑重写映射到达稳定存储 | |
| 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 | 正等待一个两阶段状态文件的写操作 | |
| 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文件的写操作 |
表8.4 等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| Activity | 服务器进程处于空闲状态。此事件类型表示进程正在等待其主处理循环中的活动。wait_event将标识特定的等待点;请参阅表8.5。 |
| BufferPin | 服务器进程正在等待对数据缓冲区的排他访问。如果另一个进程持有最后从所讨论的缓冲区读取数据的打开游标,则缓冲区锁定等待可能会延长。请参阅表8.6。 |
| Client | 服务器进程正在等待与用户应用程序连接的套接字上的活动。因此服务器期望发生的事情与其内部进程无关。wait_event将标识特定的等待点;请参阅表8.7。. |
| Extension | 服务器进程正在等待由扩展模块定义的某种条件。请参阅表8.8。. |
| IO | 服务器进程正在等待I/O操作完成。wait_event将标识特定的等待点;请参阅表8.9。. |
| IPC | 服务器进程正在等待与另一个服务器进程的某种交互。wait_event将标识特定的等待点;请参阅表8.10。. |
| Lock | 服务器进程正在等待重量级锁。重量级锁,也称为锁管理器锁或简称锁,主要用于保护SQL可见对象,如表。但是,它们也用于确保某些内部操作的互斥,例如关系扩展。wait_event将标识所等待的锁的类型;请参阅表8.11。 |
| LWLock | 服务器进程正在等待轻量级锁。大多数此类锁用于保护共享内存中的特定数据结构。wait_event将包含一个标识轻量级锁目的的名称。(某些锁具有特定名称;其他锁是一组锁的一部分,每个锁都具有类似的目的。)请参阅表8.12。 |
| Timeout | 服务器进程正在等待超时到期。wait_event将标识特定的等待点;请参阅表8.13。 |
表8.5 活动的等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| ArchiverMain | 归档进程主循环中等待。 |
| AutoVacuumMain | 自动清理启动器进程主循环中等待。 |
| BgWriterHibernate | 后台写入进程中等待,正在休眠。 |
| BgWriterMain | 后台写入进程主循环中等待。 |
| CheckpointerMain | 检查点进程主循环中等待。 |
| LogicalApplyMain | 逻辑复制应用进程主循环中等待。 |
| LogicalLauncherMain | 逻辑复制启动器进程主循环中等待。 |
| PgStatMain | 统计收集器进程主循环中等待。 |
| RecoveryWalStream | 启动过程中等待WAL到达的主循环中等待,正在流式恢复。 |
| SysLoggerMain | 系统日志记录器进程主循环中等待。 |
| WalReceiverMain | WAL接收器进程主循环中等待。 |
| WalSenderMain | WAL发送器进程主循环中等待。 |
| WalWriterMain | WAL写入器进程主循环中等待。 |
表8.6. BufferPin等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| BufferPin | 等待在缓冲区上获取排他锁。 |
表8.7. Client等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| ClientRead | 等待从客户端读取数据。 |
| ClientWrite | 等待向客户端写入数据。 |
| GSSOpenServer | 在建立GSSAPI会话时等待从客户端读取数据。 |
| LibPQWalReceiverConnect | 在WAL接收器中等待建立与远程服务器的连接。 |
| LibPQWalReceiverReceive | 在WAL接收器中等待从远程服务器接收数据。 |
| SSLOpenServer | 在尝试连接时等待SSL。 |
| WalSenderWaitForWAL | 在WAL发送器进程中等待WAL被刷新。 |
| WalSenderWriteData | 在WAL发送器进程中处理来自WAL接收器的回复时等待任何活动。 |
表8.8. Extension等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| Extension | 等待一个插件 |
表8.9. IO等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| BaseBackupRead | 等待从文件读取基础备份 |
| BufFileRead | 等待从缓冲文件中读取数据 |
| BufFileWrite | 等待向缓冲文件中写入数据 |
| BufFileTruncate | 等待对缓冲文件进行截断 |
| ControlFileRead | 等待从pg_control文件中读取数据 |
| ControlFileSync | 等待pg_control文件达到持久存储 |
| ControlFileSyncUpdate | 等待对pg_control文件的更新达到持久存储 |
| ControlFileWrite | 等待向pg_control文件中写入数据 |
| ControlFileWriteUpdate | 等待写入更新到pg_control文件 |
| CopyFileRead | 等待在文件复制操作期间进行读取 |
| CopyFileWrite | 等待在文件复制操作期间进行写入 |
| DSMFillZeroWrite | 等待将动态共享内存备份文件填充为零 |
| 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 | 等待写入两阶段状态文件 |
| WALBootstrapSync | 等待在引导过程中WAL达到持久存储 |
| WALBootstrapWrite | 等待在引导过程中写入WAL页 |
| WALCopyRead | 等待在复制现有WAL段创建新WAL段时进行读取 |
| WALCopySync | 等待通过复制现有WAL段创建新WAL段时将新WAL段达到持久存储 |
| WALCopyWrite | 等待在复制现有WAL段创建新WAL段时进行写入 |
| WALInitSync | 等待新初始化的WAL文件达到持久存储 |
| WALInitWrite | 等待在初始化新WAL文件时进行写入 |
| WALRead | 等待从WAL文件读取数据 |
| WALSenderTimelineHistoryRead | 等待在walsender时间线命令期间从时间线历史文件中读取数据 |
| WALSync | 等待WAL文件达到持久存储 |
| WALSyncMethodAssign | 等待在分配新的WAL同步方法时将数据达到持久存储 |
| WALWrite | 等待向WAL文件写入数据 |
| LogicalChangesRead | 等待从逻辑变更文件中读取数据 |
| LogicalChangesWrite | 等待向逻辑变更文件中写入数据 |
| LogicalSubxactRead | 等待从逻辑子事务文件中读取数据 |
| LogicalSubxactWrite | 等待向逻辑子事务文件中写入数据 |
表8.10. IPC等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| AppendReady | 等待子计划节点准备就绪以继续追加计划节点的执行。 |
| BackendTermination | 等待另一个后端终止。 |
| BackupWaitWalArchive | 等待成功归档用于备份的WAL文件。 |
| BgWorkerShutdown | 等待后台工作进程关闭。 |
| BgWorkerStartup | 等待后台工作进程启动。 |
| BtreePage | 等待需要的页码以继续并行B树扫描。 |
| BufferIO | 等待缓冲区I/O操作完成。 |
| CheckpointDone | 等待检查点完成。 |
| CheckpointStart | 等待检查点开始。 |
| ExecuteGather | 在执行Gather计划节点时等待子进程的活动。 |
| HashBatchAllocate | 等待选举的并行哈希参与者分配哈希表。 |
| HashBatchElect | 等待选举并行哈希参与者以分配哈希表。 |
| HashBatchLoad | 等待其他并行哈希参与者完成加载哈希表。 |
| HashBuildAllocate | 等待选举的并行哈希参与者分配初始哈希表。 |
| HashBuildElect | 等待选举并行哈希参与者以分配初始哈希表。 |
| HashBuildHashInner | 等待其他并行哈希参与者完成对内部关系的哈希处理。 |
| HashBuildHashOuter | 等待其他并行哈希参与者完成对外部关系的分区处理。 |
| HashGrowBatchesAllocate | 等待选举的并行哈希参与者分配更多批次。 |
| HashGrowBatchesDecide | 等待选举并行哈希参与者决定未来批次的增长。 |
| HashGrowBatchesElect | 等待选举并行哈希参与者以分配更多批次。 |
| HashGrowBatchesFinish | 等待选举的并行哈希参与者决定未来批次的增长。 |
| HashGrowBatchesRepartition | 等待其他并行哈希参与者完成重新分区。 |
| HashGrowBucketsAllocate | 等待选举的并行哈希参与者完成分配更多桶。 |
| HashGrowBucketsElect | 等待选举并行哈希参与者以分配更多桶。 |
| HashGrowBucketsReinsert | 等待其他并行哈希参与者完成将元组重新插入新桶中。 |
| LogicalSyncData | 等待逻辑复制远程服务器发送数据以进行初始表同步。 |
| LogicalSyncStateChange | 等待逻辑复制远程服务器更改状态。 |
| MessageQueueInternal | 等待其他进程连接到共享消息队列。 |
| MessageQueuePutMessage | 等待向共享消息队列写入协议消息。 |
| MessageQueueReceive | 等待从共享消息队列接收字节。 |
| MessageQueueSend | 等待向共享消息队列发送字节。 |
| ParallelBitmapScan | 等待并行位图扫描初始化。 |
| ParallelCreateIndexScan | 等待并行CREATE INDEX工作者完成堆扫描。 |
| ParallelFinish | 等待并行工作者完成计算。 |
| ProcArrayGroupUpdate | 等待组领导在并行操作结束时清除事务ID。 |
| ProcSignalBarrier | 等待所有后端处理栅栏事件。 |
| Promote | 等待备机升级。 |
| RecoveryConflictSnapshot | 等待清理回滚时的恢复冲突解析。 |
| RecoveryConflictTablespace | 等待删除表空间时的恢复冲突解析。 |
| RecoveryPause | 等待恢复恢复。 |
| ReplicationOriginDrop | 等待复制源变得非活跃以便删除。 |
| ReplicationSlotDrop | 等待复制插槽变得非活跃以便删除。 |
| SafeSnapshot | 等待为READ ONLY DEFERRABLE事务获取有效快照。 |
| SyncRep | 等待同步复制期间远程服务器的确认。 |
| WalReceiverExit | 等待WAL接收器退出。 |
| WalReceiverWaitStart | 等待启动过程发送流复制的初始数据。 |
| XactGroupUpdate | 等待组领导在并行操作结束时更新事务状态。 |
表8.11. 锁等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| advisory | 等待获取一个咨询用户锁。 |
| extend | 等待扩展一个关系。 |
| frozenid | 等待更新pg_database.datfrozenxid和pg_database.datminmxid。 |
| object | 等待在非关系数据库对象上获取锁。 |
| page | 等待在关系的页面上获取锁。 |
| relation | 等待在关系上获取锁。 |
| spectoken | 等待获取一个投机性插入锁。 |
| transactionid | 等待事务完成。 |
| tuple | 等待在元组上获取锁。 |
| userlock | 等待获取用户锁。 |
| virtualxid | 等待获取一个虚拟事务ID锁。 |
表8.12. LWLock等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| AddinShmemInit | 等待管理扩展在共享内存中的空间分配。 |
| AutoFile | 等待更新postgresql.auto.conf文件。 |
| Autovacuum | 等待读取或更新自动清理工作者的当前状态。 |
| AutovacuumSchedule | 等待确保选定用于自动清理的表仍需要清理。 |
| BackgroundWorker | 等待读取或更新后台工作者状态。 |
| BtreeVacuum | 等待读取或更新与B-tree索引相关的清理信息。 |
| BufferContent | 等待访问内存中的数据页。 |
| BufferMapping | 等待将数据块与缓冲区池中的缓冲区关联。 |
| CheckpointerComm | 等待管理fsync请求。 |
| CommitTs | 等待读取或更新事务提交时间戳的最后设置值。 |
| CommitTsBuffer | 等待在提交时间戳SLRU缓冲区上进行I/O。 |
| CommitTsSLRU | 等待访问提交时间戳SLRU缓存。 |
| ControlFile | 等待读取或更新pg_control文件或创建新的WAL文件。 |
| DynamicSharedMemoryControl | 等待读取或更新动态共享内存分配信息。 |
| LockFastPath | 等待读取或更新进程的快速路径锁信息。 |
| LockManager | 等待读取或更新“重量级”锁的信息。 |
| LogicalRepWorker | 等待读取或更新逻辑复制工作者的状态。 |
| MultiXactGen | 等待读取或更新共享多重事务状态。 |
| MultiXactMemberBuffer | 等待在多重事务成员SLRU缓冲区上进行I/O。 |
| MultiXactMemberSLRU | 等待访问多重事务成员SLRU缓存。 |
| MultiXactOffsetBuffer | 等待在多重事务偏移SLRU缓冲区上进行I/O。 |
| MultiXactOffsetSLRU | 等待访问多重事务偏移SLRU缓存。 |
| MultiXactTruncation | 等待读取或截断多重事务信息。 |
| 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 | 等待访问可串行化事务持有的谓词锁列表。 |
| 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和多重事务消耗的限制。 |
| XactBuffer | 等待在事务状态SLRU缓冲区上进行I/O。 |
| XactSLRU | 等待访问事务状态SLRU缓存。 |
| XactTruncation | 等待执行pg_xact_status或更新可用于其的最旧事务ID。 |
| XidGen | 等待分配新的事务ID。 |
表8.13. Timeout等待事件类型
| 等待事件类型 | 描述 |
|---|---|
| BaseBackupThrottle | 在限制活动时进行基础备份时等待。 |
| CheckpointWriteDelay | 在执行检查点时写入之间的等待。 |
| PgSleep | 由于调用pg_sleep或类似函数而等待。 |
| RecoveryApplyDelay | 由于延迟设置而在恢复期间等待应用WAL。 |
| RecoveryRetrieveRetryInterval | 在恢复期间等待时,当WAL数据从任何源(pg_wal、存档或流)都不可用时。 |
| RegisterSyncRequest | 在向检查点发送同步请求时等待,因为请求队列已满。 |
| VacuumDelay | 在基于成本的清理延迟点等待。 |
这是一个查看等待事件的示例:
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)
pg_stat_replication
pg_stat_replication 视图将包含每个WAL发送进程的一行,显示关于复制到该发送进程连接的备用服务器的统计信息。仅列出直接连接的备用服务器;没有关于下游备用服务器的信息可用。
| 列 | 类型 | 描述 |
|---|---|---|
| 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与接收到后备服务器已经写入它(但还没有刷写或者应用) 的通知之间流逝的时间。如果这台服务器被配置为一个同步后备,这可以用来计量在提交时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延迟。
pg_stat_replication_slots
pg_stat_replication_slots 视图将包含每个逻辑复制插槽的一行,显示关于其使用情况的统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| 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_count | Bigint | 在解码来自WAL的更改时,流式进行中的事务被发送到解码输出插件的次数。每次事务被流式处理时,该计数器都会递增,同一个事务可能会被多次流式处理。 |
| stream_bytes | bigint | 在解码来自WAL的更改时,解码输出插件将进行中的事务流式处理的事务数据量。此计数器和此插槽的其他流式计数器可用于调整 logical_decoding_work_mem。 |
| total_txns | bigint | 为此插槽发送到解码输出插件的解码事务总数。仅计、数顶级事务,并且不会为子事务递增。请注意,这包括被流式处理和溢出的事务。 |
| total_bytes | bigint | 在解码来自WAL的更改时,为将事务发送到解码输出插件解码的事务数据量。请注意,这包括流式处理溢出的数据。 |
| stats_reset | timestamp with time zone | 上次重置统计信息的时间 |
pg_stat_wal_receiver
pg_stat_wal_receiver事务只包含一行,它显示了从 WAL 接收器所连接的服务器得到的有关该接收器的统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | WAL接收器进程的进程ID |
| status | text | WAL接收器进程的活动状态 |
| receive_start_lsn | pg_lsn | WAL接收器启动时使用的第一个预写式日志位置 |
| receive_start_tli | integer | WAL接收器启动时使用的第一个时间线编号 |
| received_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接收器连接到的瀚高数据库实例的主机。这可以是一个主机名、一个IP地址,如果连接是通过Unix 套接字则是一个目录路径(为目录的情况可以被辨别出来,因为路径将总是一个绝对路径并且以/开头) |
| sender_host | integer | 这个WAL接收器连接到的瀚高数据库实例的端口号 |
| conninfo | text | 这个WAL接收器使用的连接串,安全相关的域会被隐去。 |
pg_stat_subscription
每一个订阅都在pg_stat_subscription视图中有一行,处理被订阅表的初始数据拷贝操作的工作者还会有额外的行。
| 列 | 类型 | 描述 |
|---|---|---|
| subid | oid | 订阅的OID |
| subname | text | 订阅的名称 |
| pid | integer | 订阅工作者进程的进程ID |
| relid | Oid | 工作者正在同步的关系的OID,对于主应用工作者为空 |
| 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发送器的最后一个预写式日志位置的时间 |
pg_stat_ssl
pg_stat_ssl 视图将包含每个后端或WAL发送进程的一行,显示关于此连接上SSL使用情况的统计信息。可以通过pid列将其与pg_stat_activity或 pg_stat_replication连接以获取有关连接的更多详细信息。
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 一个后端或者WAL发送进程的进程 ID |
| ssl | boolean | 如果在这个连接上使用了 SSL 则为真 |
| version | text | 在用的 SSL 版本,如果这个连接上没有使用SSL则为NULL |
| cipher | text | 在用的SSL密码的名称, 如果这个连接上没有使用 SSL 则为 NULL |
| bits | integer | 使用的加密算法中的位数, 如果这个连接上没有使用 SSL 则为 NULL |
| compression | boolean | 如果使用了SSL 压缩则为真,否则为假,如果这个连接上没有使用SSL则为 NULL |
| client_dn | text | 来自所使用的客户端证书的 识别名(DN)域,如果没有提供客户端证书或者这个连 接上没有使用SSL则为NULL。如果DN域长度超过NAMEDATALEN(标准编译中是 64 个字符),则它会被截断。 |
| client_serial | numeric | 客户端证书的序列号,如果 没有提供客户端证书,或者 在此连接上不使用SSL,则为NULL。证书序列号和证书发行者的组合可以唯一地识别 一个证书(除非发行者错误 地重复使用序列号) |
| issuer_dn | text | 客户端证书的发行者的DN, 如果没有提供客户端证书, 或者如果这个连接上没有使用SSL,则为NULL。这个字段被截断,就像client_dn一 样。 |
pg_stat_gssapi
pg_stat_gssapi视图将包含每一个后端一个行,显示该连接上的GSSAPI使用情况。它可以加入到pg_stat_activity或pg_stat_replication上的pid列,获取更多关于连接的详细信息。
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 后台的进程 ID |
| gss_authenticated | boolean | 如果此连接使用了GSSAPI认证,则为True。 |
| principal | text | 如果没有使用GSSAPI来验证此连接,则为NULL。如果principal长于 NAMEDATALEN(标准构建中为 64 个字符),则该字段被截断。 |
| encrypted | boolean | 如果此连接上使用了GSSAPI 加密,则为True |
pg_stat_archiver
pg_stat_archiver视图将总是一个单一的行,该行包含着有关集簇的归档进程的数据。
| 列 | 类型 | 描述 |
|---|---|---|
| failed_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 | 上次重置统计信息的时间 |
pg_stat_bgwriter
pg_stat_bgwriter视图将总是只有单独的一行,它包含集簇的全局数据。
| 列 | 类型 | 描述 |
|---|---|---|
| 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 | 上次重置统计信息的时间 |
pg_stat_wal
pg_stat_wal视图始终只包含一行数据,其中包含有关集群WAL活动的数据。
| 列 | 类型 | 描述 |
|---|---|---|
| wal_records | bigint | 生成的WAL记录总数 |
| wal_fpi | bigint | 生成的WAL全页总数 |
| wal_bytes | numeric | 生成的WAL总量,以字节为单位 |
| wal_buffers_full | bigint | 由于WAL缓冲区变满而将 WAL数据写入磁盘的次数 |
| wal_write | bigint | 通过XLogWrite请求将 WAL 缓冲区写入磁盘的次数 |
| wal_sync | bigint | 通过issue_xlog_fsync请求将WAL 文件同步到磁盘的次数(如果 fsync 打开,并且wal_sync_method是 fdatasync、fsync或 fsync_writethrough,则为零)。 |
| wal_write_time | double precision | 通过 XLogWrite 请求将 WAL 缓冲区写入磁盘的总时间,以毫秒为单位(如果启用了 track_wal_io_timing,则为零)。当 wal_sync_method 为 open_datasync 或 open_sync 时,此时间包括同步时间。 |
| wal_sync_time | double precision | 通过 issue_xlog_fsync 请求将 WAL 文件同步到磁盘的总时间,以毫秒为单位(如果启用了 track_wal_io_timing、fsync 打开,并且 wal_sync_method 为 fdatasync、fsync 或 fsync_writethrough,则为零)。 |
| stats_reset | timestamp with time zone | 上次重置统计信息的时间 |
pg_stat_database
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 | 磁盘块被发现已经在缓冲区中的次数,这样不需要一次读取(这只包括数据库缓冲区中的命中,而不包括在操作系统文件系统缓冲区中的命中) |
| 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 | 在这个数据库中后端花费在读取数据文件块的时间,以毫秒计 |
| blk_write_time | double precision | 在这个数据库中后端花费在写数据文件块的时间,以毫秒计 |
| stats_reset | timestamp with time zone | 上次重置统计信息的时间 |
pg_stat_database_conflicts
pg_stat_database_conflicts视图为每一个 数据库包含一行,用来显示数据库范围内由于与后备服务器上的恢复过程冲突而被取消的查询的统计信息。 这个视图将只包含后备服务器上的信息,因为冲突会不发生在主服务器上。
| 列 | 类型 | 描述 |
|---|---|---|
| datid | oid | 一个数据库的 OID |
| datname | name | 这个数据库的名称 |
| confl_tablespace | bigint | 这个数据库中由于表空间被删掉而取消的查询数量 |
| confl_lock | bigint | 这个数据库中由于锁超时而 取消的查询数量 |
| confl_snapshot | bigint | 这个数据库中由于旧快照而取消的查询数量 |
| confl_bufferpin | bigint | 这个数据库中由于被占用的缓冲区而取消的查询数量 |
| confl_deadlock | bigint | 这个数据库中由于死锁而取消的查询数量 |
pg_stat_all_tables
pg_stat_all_tables视图将为当前数据库中的每一个表(包括TOAST表)包含一行,该行显示与对该表的访问相关的统计信息。pg_stat_user_tables和pg_stat_sys_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 | 从这个表最后一次被分析后备修改的行的估计数量 |
| 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 | 这个表已被自动清理守护进程清理的次数 |
| analyze_count | bigint | 这个表已被手工分析的次数 |
| autoanalyze_count | bigint | 这个表已被自动清理守护进程分析的次数 |
pg_stat_all_indexes
pg_stat_all_indexes视图将为当前数据库中的每个索引包含一行,该行显示关于对该索引访问的统计信息。pg_stat_user_indexes和pg_stat_sys_ indexes视图包含相同的信息,分别显示用户索引和系统索引。
索引可以被简单索引扫描、“位图”索引扫描以及优化器使用。在一次位图扫描中,多个索引的输出可以被通过AND或OR规则组合,因此当使用一次位图扫描时难以将取得的个体堆行与特定的索引关联起来。因此,一次位图扫描会增加它使用的索引的pg_stat_all_indexes.idx_tup_read计数,并且为每个表增 加pg_stat_all_tables.idx_tup_fetch计数,但是它不影响pg_stat_all_indexes.idx_tup_fetch。如果所提供的常量值不在优化器统计信息记录的范围之内,优化器也会访问索引来检查,因为优化器统计信息可能已经旧了。
| 列 | 类型 | 描述 |
|---|---|---|
| relid | oid | 这个索引的基表的 OID |
| indexrelid | oid | 这个索引的OID |
| schemaname | name | 这个索引所在的模式的名称 |
| relname | name | 这个索引的基表的名称 |
| indexrelname | name | 这个索引的名称 |
| idx_scan | bigint | 在这个索引上发起的索引扫 描次数 |
| idx_tup_read | bigint | 在这个索引上由扫描返回的索引项数量 |
| idx_tup_fetch | bigint | 被使用这个索引的简单索引扫描取得的活着的表行数量 |
pg_statio_all_tables
pg_statio_all_tables 视图将包含当前数据库中每个表的一行(包括 TOAST 表),显示关于该特定表的I/O统计信息。pg_statio_user_tables和 pg_statio_sys_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 表索引 (如果有)中的缓冲区命中 数量 |
pg_statio_all_indexes
pg_statio_all_indexes视图将包含当前数据库中每个索引的一行,显示关于该特定索引的 I/O 统计信息。pg_statio_user_indexes和pg_statio_sys_indexes视图包含相同的信息,只显示用户索引和系统索引的统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| relid | oid | 这个索引的基表的 OID |
| indexrelid | oid | 这个索引的 OID |
| schemaname | name | 这个索引所在的模式的名称 |
| relname | name | 这个索引的基表的名称 |
| indexrelname | name | 这个索引的名称 |
| idx_blks_read | bigint | 从这个索引读取的磁盘块数 |
| idx_blks_hit | bigint | 在这个索引中的缓冲区命中数量 |
pg_statio_all_sequences
pg_statio_all_sequences视图将为当前数据库中的每个序列包含一行,该行显示在指定序列上有关I/O的统计信息。
| 列 | 类型 | 描述 |
|---|---|---|
| relid | oid | 一个序列的 OID |
| schemaname | name | 这个序列所在的模式的名称 |
| relname | name | 这个序列的名称 |
| blks_read | bigint | 从这个序列中读取的磁盘块数 |
| blks_hit | bigint | 在这个序列中的缓冲区命中数量 |
pg_stat_user_functions
pg_stat_user_functions视图将为每一个被追踪的函数包含一行,该行显示有关该函数执行的统计信息。track_functions参数控制到底哪些函数被跟踪。
| 列 | 类型 | 描述 |
|---|---|---|
| funcid | oid | 一个函数的OID |
| schemaname | name | 这个函数所在的模式的名称 |
| funcname | name | 这个函数的名称 |
| calls | bigint | 这个函数已经被调用的次数 |
| total_time | double precision | 在这个函数以及它所调用的其他函数中花费的总时间,以毫秒计 |
| self_time | double precision | 在这个函数本身花费的总时间,不包括被它调用的其他函数,以毫秒计 |
pg_stat_slru
通过SLRU(简单的最近未使用)缓存访问某些磁盘信息。pg_stat_slru视图将包含每个被跟踪的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 | bigint | 上次重置统计数据的时间 |
Statistics Functions
其他查看统计信息的方法是直接使用查询,这些查询使用上述标准视图用到的底层统计信息访问函数。如要了解如函数名等细节,可参考标准视图的定义(例如,在psql中你可以发出\d+ pg_stat_activity)。针对每一个数据库统计信息的访问函数把一个数据库 OID 作为参数来标识要报告哪个数据库。而针对每个表和每个索引的函数要求表或索引 OID。针对每个函数统计信息的函数用一个函数 OID。注意只有在当前数据库中的表、索引和函数才能被这些函数看到。
| 函数 | 返回类型 | 描述 |
|---|---|---|
| pg_backend_pid() | integer | 处理当前会话的服务器进程 的进程 ID |
| pg_stat_get_activity(integer) | setof record | 返回具有指定PID的后端相关的一个记录,或者在指 定NULL的情况下为系统中每 一个活动后端返回一个记录。被返回的域是pg_stat_activity视图中 的那些域的一个子集。 |
| pg_stat_get_snapshot_timestamp() | timestamp with time zone | 返回当前统计信息快照的时间戳 |
| 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 | 把用于当前数据库的所有统计计数器重置为零(默认要求超级用户权限,但这个函数的EXECUTE可以被授予给其他人)。 |
| pg_stat_reset () | void | 重置当前数据库的所有统计计数器为零。此函数默认仅限超级用户使用,但可以授予其他用户执行权限以运行该函数。 |
| pg_stat_reset_shared(text) | void | 把某些集簇范围的统计计数器重置为零,具体哪些取决于参数(默认要求超级用户权限,但这个函数的 EXECUTE 可以被授予给其他人)。 调用pg_stat_reset_shared(‘bgwriter’)把pg_stat_bgwriter 视图中显示的所有计数器清零。调 用pg_stat_reset_shared(‘archiver’) 将会把pg_stat_archiver视图中展示的所有计数器清零 |
| 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视图中显示的所有计数器。参数可以是CommitTs、MultiXactMember、MultiXactOffset、Notify、Serial、Subtrans或Xact之一,以仅重置该条目的计数器。如果参数是其他(或者确实是任何未识别的名称),那么将重置所有其他SLRU缓存的计数器,例如扩展定义的缓存。此函数默认仅限超级用户使用,但可以授予其他用户执行权限以运行该函数。 |
| pg_stat_reset_replication_slot (text) | void | 重置由参数定义的复制槽的统计信息。如果参数为NULL,则重置所有复制槽的统计信息。此函数默认仅限超级用户使用,但可以授予其他用户执行权限以运行该函数。 |
pg_stat_get_activity是pg_stat_activity视图的底层函数,它返回一个行集合,其中包含有关每个后端进程所有可用的信息。有时只获得该信息的一个子集可能会更方便。在那些情况中,可以使用一组更老的针对每个后端的统计访问函数。这些访问函数使用一个后端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;
| 函数 | 返回类型 | 描述 |
|---|---|---|
| pg_stat_get_backend_idset() | setof integer | 当前活动后端ID号的集合(从1到活动后端数目) |
| pg_stat_get_backend_activity | (integer) | 这个后端最近查询的文本 |
| 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。 |
| pg_stat_get_backend_wait_event(integer) | text | 如果后端正在等待,则是等待事件的名称,否则为NULL。 |
| pg_stat_get_backend_xact_start(integer) | timestamp with time zone | 当前事务被开始的时间 |
锁统计信息
监控数据库活动的另外一个有用的工具是pg_locks系统表。这样就允许数据库管理员查看在锁管理器里面未解决的锁的信息。例如,这个功能可以被用于:
• 查看当前所有未解决的锁、在一个特定数据库中的关系上所有的锁、在一个特定关系上所有的锁,或者由一个特定瀚高数据库会话持有的所有的锁。
• 判断当前数据库中带有最多未授予锁的关系(它很可能是数据库客户端的竞争源)。
• 判断锁竞争给数据库总体性能带来的影响,以及锁竞争随着整个数据库流量的变化范围。
进度报告
瀚高数据库具有在命令执行过程中报告某些命令进度的能力。目前,仅支持进度报告的命令包括ANALYZE、CLUSTER、CREATE INDEX、VACUUM、COPY和BASE_BACKUP(即pg_basebackup用于进行基本备份的复制命令)。这在将来可能会扩展。
ANALYZE 进度报告
当ANALYZE正在运行时,pg_stat_progress_analyze视图将包含当前正在运行该命令的每个后端的一行。
下面的表描述了将报告的信息,并提供了关于如何解释它的信息。
| 列名 | 类型 | 描述 |
|---|---|---|
| pid | Integer | 后端进程ID |
| datid | oid | 后端进程连接的数据库OID |
| datname | name | 后端进程连接的数据库名 |
| relid | oid | 分析表的OID |
| phase | text | 当前处理阶段。 |
| sample_blks_total | bigint | 将被采样的堆块的总数。 |
| sample_blks_scanned | bigint | 已扫描的堆块数量。 |
| ext_stats_total | bigint | 扩展统计数量。 |
| ext_stats_computed | bigint | 计算的扩展统计数量。此计数器仅在计算扩展统计时递增。 |
| child_tables_total | bigint | 子表数量。 |
| child_tables_done | bigint | 已扫描的子表数量。此计数器仅在获取继承样本行阶段时递增。 |
| current_child_table_relid | oid | 当前正在扫描的子表的OID。当阶段正在获取继承样本行时,此字段有效。 |
表 分析阶段
| 阶段 | 描述 |
|---|---|
| initializing | 命令正在准备开始扫描堆。这个阶段预计会非常短暂。 |
| acquiring sample rows | 命令当前正在扫描由 relid 给出的表以获取样本行。 |
| acquiring inherited sample rows | 命令当前正在扫描子表以获取样本行。列 child_tables_total、child_tables_done 和 current_child_table_relid 包含此阶段的进度信息。 |
| computing statistics | 命令正在根据在表扫描期间获取的样本行计算统计信息。 |
| computing extended statistics | 命令正在根据在表扫描期间获取的样本行计算扩展统计信息。 |
| finalizing analyze | 命令正在更新pg_class。当此阶段完成时,ANALYZE 将结束。 |
当在分区表上运行ANALYZE时,它的所有分区也会被递归分析。在这种情况下,首先为父表报告ANALYZE进度,收集其继承统计信息,然后为每个分区报告进度。
CREATE INDEX进度报告
每当CREATE INDEX或REINDEX运行时,pg_stat_progress_create_index视图将包含当前正在创建索引的每个后端的一条记录。
下面的表格描述了将被报告的信息,并提供了如何解释这些信息。
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 后端进程ID. |
| datid | oid | 该后端连接的数据库OID。 |
| datname | name | 与此后端连接的数据库的名称。 |
| relid | oid | 创建索引所依据的表OID。 |
| index_relid | oid | 被创建或重新索引的索引的OID。在非当前的CREATE INDEX中,这个值为0。 |
| command | text | 正在运行的命令:CREATE INDEX, CREATE INDEX CONCURRENTLY, REINDEX, 或 REINDEX CONCURRENTLY. |
| phase | text | 索引创建的当前处理阶段。 |
| lockers_total | bigint | 在适用的情况下,需要等待的储物柜总数。 |
| lockers_done | bigint | 已经等待的储物柜数量。 |
| current_locker_pid | bigint | 目前正在等待的储物柜的进程ID。 |
| blocks_total | bigint | 本阶段要处理的区块总数。 |
| blocks_done | bigint | 当前阶段已经处理的区块数量。 |
| tuples_total | bigint | 当前阶段要处理的元组数。 |
| tuples_done | bigint | 在当前阶段已经处理的元组数量。 |
| partitions_total | bigint | 在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。 |
表 创建索引阶段
| 阶段 | 描述 |
|---|---|
| initializing | CREATE INDEX或REINDEX正在准备创建索引。这个阶段预计会非常短暂。 |
| waiting for writers before build | CREATE INDEX CONCURRENTLY或REINDEX CONCURRENTLY正在等待有可能看到表的写锁的事务完成。当不在并发模式时,这个阶段会被跳过。lockers_total、 lockers_done和current_locker_pid列包含了这个阶段的 进度信息。 |
| building index | 索引是由访问方法专用代码建立的。 在这一 阶段,支持进度报告的访问方法填写自己的 进度数据,子阶段在这一栏中表示。 通常情 况下,blocks_total和blocks_done将包含进度数据,也可能包含tuples_total和tuples_done。 |
| waiting for writers before validation | CREATE INDEX CONCURRENTLY或REINDEX CONCURRENTLY正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。 |
| index validation: scanning index | CREATE INDEX CONCURRENTLY正在扫描索引,搜索需要验证的图元组。如果不是在并发模式下,这个阶段会被跳过。列blocks_total(设置为索引的总大小)和blocks_done包含了这个阶段的进度信息。 |
| index validation: sorting tuples | CREATE INDEX CONCURRENTLY正在对索引扫描阶段的输出进行排序。 |
| index validation: scanning table | CREATE INDEX CONCURRENTLY正在扫描表,以 验证前两个阶段收集的索引图元。当不在并发模式时,这个阶段被跳过。blocks_total列(设置为表的总大小) 和blocks_done列包含这个阶段的进度信息。 |
| waiting for old snapshots | CREATE INDEX CONCURRENTLY或REINDEX CONCURRENTLY正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。lockers_total、lockers_done和current_locker_pid 列包含了这个阶段的进度信息。 |
| waiting for readers before marking dead | REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total、lockers_done和current_locker_pid 列包含了这个阶段的进 度信息。 |
| waiting for readers before dropping | REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列lockers_total、lockers_done和current_locker_pid包含了这个阶段的进度信息。 |
VACUUM进度报告
只要VACUUM正在运行,每一个当前正在清理的后端(包括autovacuum工作者进程)在pg_stat_progress_vacuum视图中都会有一行。
下面的表描述了将被报告的信息并且提供了如何解释它们的信息。VACUUM FULL命令的进度是通过pg_stat_progress_cluster报告的,因为VACUUM FULL和CLUSTER都是重写表,而普通的VACUUM只是原地修改表。
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 后端的进程ID。 |
| datid | oid | 这个后端连接的数据库的OID。 |
| datname | name | 这个后端连接的数据库的名 称。 |
| relid | oid | 被vacuum的表的OID。 |
| phase | text | vacuum的当前处理阶段。 |
| heap_blks_total | bigint | 该表中堆块的总数。这个数 字在扫描开始时报告,之后 增加的块将不会(并且不需 要)被这个VACUUM访问。 |
| heap_blks_scanned | bigint | 被扫描的堆块数量。由于可 见性映射被用来优化扫描, 一些块将被跳过而不做检查,被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。仅当处于扫描堆阶段时这个计数器才会前进。 |
| heap_blks_vacuumed | bigint | 被清理的堆块数量。除非表 没有索引,这个计数器仅在 处于清理堆阶段时才会前进。不包含死亡元组的块会被跳过,因此这个计数器可 能有时会向前跳跃一个比较 大的增量。 |
| index_vacuum_count | bigint | 已完成的索引清理周期数。 |
| max_dead_tuples | bigint | 在需要执行一个索引清理周 期之前我们可以存储的死亡 元组数,取决于maintenance_work_mem。 |
| num_dead_tuples | bigint | 从上一个索引清理周期以来 收集的死亡元组数。 |
表 VACUUM阶段
| 阶段 | 描述 |
|---|---|
| initializing | VACUUM正在准备开始扫描堆。这个阶段应该很简短。 |
| scanning heap | VACUUM正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会 执行冻结动作。heap_blks_scanned列可以用来监控扫描的进度。 |
| vacuuming indexes | VACUUM当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描 完成后至少发生一次。如果maintenance_work_mem不足以存放找到的 死亡元组,则每次清理时会多次清理索引。 |
| vacuuming heap | VACUUM当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索 引的实例之后。如果heap_blks_scanned小 于heap_blks_total,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。 |
| cleaning up indexes | VACUUM当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。 |
| truncating heap | VACUUM正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完 索引之后。 |
| performing final cleanup | VACUUM在执行最终的清除。在这个阶段中,VACUUM将清理空闲空间映射、更新pg_class中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,VACUUM也就结束了。 |
CLUSTER进度报告
每当CLUSTER或VACUUM FULL正在运行时,pg_stat_progress_cluster视图将包含当前正在运行任一命令的每个后端的一行。
下面的表描述了将报告的信息,并提供了关于如何解释它的信息。
表 pg_stat_progress_cluster 视图
| 列 | 类型 | 描述 |
|---|---|---|
| pid | integer | 后台的进程ID。 |
| datid | oid | 该后端连接的数据库的OID。 |
| datname | name | 与此后端连接的数据库的名 称。 |
| relid | oid | 被聚类的表的OID。 |
| command | text | 正在运行的命令。CLUSTER或VACUUM FULL。 |
| phase | text | 当前处理阶段。 |
| cluster_index_relid | oid | 如果正在使用索引对表进行 扫描,这就是正在使用的索 引的OID;否则为0。 |
| heap_tuples_scanned | bigint | 扫描的堆元组数. 这个计数器 只有在阶段为 seq scanning heap, index scanning heap or writing new heap时才会前进。 |
| heap_tuples_written | bigint | 写入的堆元组的数量。这 个计数器只有在阶段为 seq scanning heap, index scanning heap or writing new heap时才会前进。 |
| heap_blks_total | bigint | 表中的堆块总数。这个数字 是在seq扫描堆的开始时报告的。 |
| heap_blks_scanned | bigint | 扫描的堆块数量。这个计数 器只有在阶段为seq扫描堆时才会前进。 |
| index_rebuild_count | bigint | 重建的索引数。该计数器仅 在重建索引阶段时才会前进。 |
表 CLUSTER 和 VACUUM FULL 阶段
| 阶段 | 描述 |
|---|---|
| initializing | 该命令准备开始扫描堆栈。这个阶段预计会 非常短暂。 |
| seq scanning heap | 该命令目前采用顺序扫描的方式对表进行扫 描。 |
| index scanning heap | CLUSTER目前正在使用索引扫描表。 |
| sorting tuples | CLUSTER目前正在对元组进行排序。 |
| writing new heap | CLUSTER目前正在编写新的堆。 |
| swapping relation files | 目前,该命令正在将新建立的文件调换到位。 |
| rebuilding index | 该命令目前正在重建一个索引。 |
| performing final cleanup | 该命令正在执行最后的清理工作。当此阶段 完成后,CLUSTER或VACUUM FULL将结束。 |
Base Backup进度报告
每当应用程序像pg_basebackup正在进行基本备份时,pg_stat_progress_basebackup视图将包含当前正在运行BASE_BACKUP复制命令并流式传输备份的每个WAL发送进程的一行。
下面的表描述了将报告的信息,并提供了关于如何解释它的信息。
表 pg_stat_progress_basebackup视图
| 列 | 类型 | 描述 |
|---|---|---|
| pid | Integer | WAL Sender的进程ID。 |
| phase | text | 当前处理阶段。 |
| backup_total | bigint | 将被流式传输的数据总量。这是在开始流式传输数据库文件阶段估计和报告的。请注意,这只是一个近似值,因为在流式传输数据库文件阶段期间数据库可能会发生更改,并且WAL日志可能会在稍后包含在备份中。一旦流式传输的数据量超过估计的总大小,此值就会与 backup_streamed 相同。如果在pg_basebackup中禁用了估算(即指定了–no-estimate-size选项),则此值为NULL。 |
| backup_streamed | bigint | 已流式传输的数据量。此计数器仅在阶段为流式传输数据库文件或传输wal文件时递增。 |
| tablespaces_total | bigint | 将被流式传输的表空间总数。 |
| tablespaces_streamed | bigint | 已流式传输的表空间数量。此计数器仅在阶段为流式传输数据库文件时递增。 |
表 Base Backup阶段
| 阶段 | 描述 |
|---|---|
| Initializing | WAL发送进程正在准备开始备份。这个阶段预计会非常短暂。 |
| waiting for checkpoint to finish | WAL发送进程当前正在执行pg_start_backup以准备进行基本备份,并等待开始备份检查点完成。 |
| estimating backup size | WAL发送进程当前正在估算将作为基本备份流式传输的数据库文件的总量。 |
| streaming database files | WAL发送进程当前正在作为基本备份流式传输数据库文件。 |
| waiting for wal archiving to finish | WAL发送进程当前正在执行pg_stop_backup以完成备份,并等待成功归档用于基本备份的所有WAL文件。如果在pg_basebackup中指定了–wal-method=none或–wal-method=stream,则当此阶段完成时备份将结束。 |
| transferring wal files | WAL发送进程当前正在传输备份期间生成的所有WAL日志。如果在pg_basebackup中指定了–wal-method=fetch,则此阶段将在等待wal归档完成阶段之后发生。备份将在此阶段完成时结束。 |
COPY进度报告
每当COPY正在运行时,pg_stat_progress_copy视图将包含当前正在运行COPY命令的每个后端的一行。
下表描述了将被报告的信息,并提供了解释的信息。
表 pg_stat_progress_copy 视图
| 列 | 类型 | 描述 |
|---|---|---|
| pid | Integer | 后端进程ID。 |
| datid | oid | 连接到此后端的数据库的OID。 |
| datname | name | 连接到此后端的数据库的名称。 |
| relid | oid | 执行COPY命令的表的OID。如果从SELECT查询中复制,则设置为0。 |
| command | text | 正在运行的命令:COPY FROM或COPY TO。 |
| type | text | 数据读取或写入的IO类型:FILE、PROGRAM、PIPE(用于COPY FROM STDIN和COPY TO STDOUT),或者CALLBACK(例如,在逻辑复制中的初始表同步期间使用)。 |
| bytes_processed | COPY命令已处理的字节数。 | |
| bytes_total | COPY FROM命令的源文件大小(以字节为单位)。如果不可用,则设置为0。 | |
| tuples_processed | COPY命令已处理的元组数。 | |
| tuples_excluded | 由COPY命令的WHERE子句排除的未处理元组数。 |