本节描述的函数用于控制和监控一个 PostgreSQL 安装。
Table 9.95 展示了可用于查询和更改运行时配置参数的函数。
Table 9.95. 配置设置函数
函数 说明 示例 |
|---|
返回设置
|
把参数
|
Table 9.96
中展示的函数向其他服务器进程发送控制信号。
默认情况下这些函数的使用被限制为超级用户,
但可以用
GRANT
把访问权授予其他人,
已注明例外的除外。
如果信号被成功发送,
这些函数中的每一个都返回
true;
如果发送信号失败,
则返回
false。
Table 9.96. 服务器信号函数
函数 说明 |
|---|
取消其后端进程具有指定进程 ID
的会话的当前查询。
如果调用角色是被取消后端所属角色的成员,
或者调用角色具有
|
请求记录具有指定进程 ID
的后端的内存上下文。
这个函数可以把请求发送给除 logger
之外的后端和辅助进程。
这些内存上下文将以
|
|
让
PostgreSQL
服务器的所有进程重新加载它们的配置文件。
(这是通过向 postmaster
进程发送一个
SIGHUP
信号来发起的,
它随后会向它的每个子进程发送
SIGHUP。)
在重新加载之前,
你可以使用
|
向日志文件管理器发信号, 让它立即切换到一个新的输出文件。 这只在内建的日志收集器运行时才有效, 因为否则不存在日志文件管理器子进程。 |
终止其后端进程具有指定进程 ID
的会话。
如果调用角色是被终止后端所属角色的成员,
或者调用角色具有
如果没有指定
|
pg_cancel_backend 和
pg_terminate_backend
向由进程 ID
标识的后端进程发送信号
(分别为
SIGINT 或
SIGTERM)。
一个活动后端的进程 ID
可以从
pg_stat_activity
视图的
pid
列中找到,
或者通过在服务器上列出
postgres
进程来找到
(在 Unix
上使用
ps,
在
Windows
上使用
Task
Manager)。
一个活动后端的角色可以从
pg_stat_activity
视图的
usename
列中找到。
pg_log_backend_memory_contexts
可用于记录一个后端进程的内存上下文。
例如:
postgres=# SELECT pg_log_backend_memory_contexts(pg_backend_pid()); pg_log_backend_memory_contexts -------------------------------- t (1 row)
每个内存上下文会记录一条消息。 例如:
LOG: logging memory contexts of PID 10377 STATEMENT: SELECT pg_log_backend_memory_contexts(pg_backend_pid()); LOG: level: 1; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used LOG: level: 2; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used LOG: level: 2; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used LOG: level: 2; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used LOG: level: 2; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used LOG: level: 2; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used LOG: level: 2; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used LOG: level: 2; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used ... LOG: level: 2; ErrorContext: 8192 total in 1 blocks; 7928 free (3 chunks); 264 used LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 used
如果在同一个父上下文之下的子上下文多于 100 个, 那么前 100 个子上下文会被记录, 外加其余上下文的一个摘要。 注意, 频繁调用这个函数可能产生显著的开销, 因为它可能生成大量的日志消息。
Table 9.97
中展示的函数协助进行联机备份。
这些函数不能在恢复期间执行
(pg_backup_start、
pg_backup_stop
和
pg_wal_lsn_diff
除外)。
关于这些函数的正确使用的细节, 请参见 Section 25.3。
Table 9.97. 备份控制函数
函数 说明 |
|---|
在预写日志中创建一个命名的标记记录, 它以后可以用作一个恢复目标, 并返回相应的预写日志位置。 然后可以把给定的名字与 recovery_target_name 一起使用, 来指定恢复要前进到的那一点。 应避免创建多个同名的恢复点, 因为恢复会在第一个名字与恢复目标相匹配的恢复点处停止。 默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。 |
返回当前的预写日志刷写位置 (见下文说明)。 |
返回当前的预写日志插入位置 (见下文说明)。 |
返回当前的预写日志写位置 (见下文说明)。 |
让服务器准备好开始一次联机备份。
唯一必需的参数是用于该备份的一个任意的用户定义标签。
(通常这会是备份转储文件将被存储时使用的名字。)
如果可选的第二个参数被给为
默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。 |
结束一次联机备份的执行。 备份标签文件和表空间映射文件的期望内容会作为函数结果的一部分返回, 并且必须被写到备份区域中的文件里。 这些文件绝不能被写到活动的数据目录中 (那样做会导致 PostgreSQL 在崩溃的情况下无法重启)。
这里有一个
当在主服务器上执行时,
这个函数还会在预写日志归档区域中创建一个备份历史文件。
历史文件包括给
该函数的结果是一条单一的记录。
默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。 |
|
强制服务器切换到一个新的预写日志文件,
这样当前的文件就可以被归档
(假设你正在使用连续归档)。
结果是刚完成的预写日志文件内的结束预写日志位置加 1。
如果自上次预写日志切换以来没有任何预写日志活动,
默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。 |
把一个预写日志位置转换为容纳该位置的 WAL 文件的名字。 |
把一个预写日志位置转换为 WAL 文件名以及该文件内的字节偏移。 |
从一个 WAL 文件名中提取序列号和时间线 ID。 |
计算两个预写日志位置之间以字节计的差
( |
pg_current_wal_lsn
以上述函数所用的相同格式显示当前的预写日志写位置。
类似地,
pg_current_wal_insert_lsn
显示当前的预写日志插入位置,
而
pg_current_wal_flush_lsn
显示当前的预写日志刷写位置。
插入位置是任意时刻预写日志的
“逻辑”结尾,
而写位置是实际上已从服务器内部缓冲区写出的内容的结尾,
刷写位置则是已知已被写到持久存储的最后一个位置。
写位置是可以从服务器外部检查的内容的结尾,
如果你关心归档未完整写完的预写日志文件,
它通常就是你想要的。
插入和刷写位置被提供出来主要是为了服务器调试的目的。
这些都是只读操作,
不需要超级用户权限。
你可以使用
pg_walfile_name_offset
从一个
pg_lsn
值中提取相应的预写日志文件名和字节偏移。
例如:
postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn);
file_name | file_offset
--------------------------+-------------
00000001000000000000000D | 4039624
(1 row)
类似地,
pg_walfile_name
只提取预写日志文件名。
pg_split_walfile_name
对于从一个文件偏移和 WAL
文件名计算一个
LSN
很有用,
例如:
postgres=# \set file_name '000000010000000100C000AB'
postgres=# \set offset 256
postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset AS lsn
FROM pg_split_walfile_name(:'file_name') pd,
pg_show_all_settings() ps
WHERE ps.name = 'wal_segment_size';
lsn
---------------
C001/AB000100
(1 row)
Table 9.98 中展示的函数提供关于一台备用服务器当前状态的信息。 这些函数既可以在恢复期间执行, 也可以在正常运行时执行。
Table 9.98. 恢复信息函数
Table 9.99 中展示的函数控制恢复的进展。 这些函数只能在恢复期间执行。
Table 9.99. 恢复控制函数
在提升正在进行期间,
不能执行
pg_wal_replay_pause 和
pg_wal_replay_resume。
如果在恢复被暂停时触发了提升,
那么暂停状态会结束,
提升会继续。
如果流复制被禁用, 那么暂停状态可能会无限期地持续下去而没有任何问题。 如果流复制正在进行, 那么 WAL 记录会继续被接收, 这最终会填满可用的磁盘空间, 具体取决于暂停的持续时间、 WAL 生成的速率以及可用的磁盘空间。
PostgreSQL
允许数据库会话同步它们的快照。
一个
快照
决定使用它的那个事务能够看到哪些数据。
当两个或更多会话需要看到数据库中相同的内容时,
同步快照是必要的。
如果两个会话只是独立地开始它们的事务,
那么总是存在这样的可能性:
在两条
START TRANSACTION
命令的执行之间,
某个第三方事务提交了,
这样一个会话看到了那个事务的效果,
而另一个没有。
为了解决这个问题, PostgreSQL 允许一个事务 导出它正在使用的快照。 只要导出事务保持打开, 其他事务就可以 导入它的快照, 从而确保它们看到的数据库视图与第一个事务看到的完全相同。 但要注意, 这些事务中的任何一个所做的任何数据库更改, 对其他事务来说仍然不可见, 就像未提交事务所做的更改通常不可见一样。 因此, 这些事务就预先存在的数据而言是同步的, 但对它们自己所做的更改则照常行动。
快照用
Table 9.100
中展示的
pg_export_snapshot
函数导出,
并用
SET TRANSACTION
命令导入。
Table 9.100. 快照同步函数
函数 说明 |
|---|
|
保存该事务当前的快照,
并返回一个标识该快照的
如果需要,
一个事务可以导出多于一个的快照。
注意,
这样做只在
|
对正在运行的事务获取一个快照并把写到 WAL 中, 而不必等待 bgwriter 或 checkpointer 记录一个。 这对于备用服务器上的逻辑解码很有用, 因为逻辑槽的创建必须等到这样一条记录在备用服务器上被重放。 |
Table 9.101
中展示的函数用于控制复制特性以及与之交互。
有关底层特性的信息,
请参见
Section 26.2.5、
Section 26.2.6
和
Chapter 48。
用于复制起源的函数默认只允许超级用户使用,
但可以通过
GRANT
命令允许其他用户使用。
用于复制槽的函数被限制为超级用户以及拥有
REPLICATION
特权的用户。
这些函数中的许多在复制协议中都有等效的命令; 参见 Section 54.4。
Section 9.28.3、 Section 9.28.4 和 Section 9.28.5 中描述的函数同样与复制相关。
Table 9.101. 复制管理函数
函数 说明 |
|---|
创建一个名为
|
删除名为
|
使用输出插件
|
把一个名为
|
把一个名为
|
返回槽
|
行为与
|
行为与
|
行为与
|
推进名为
|
用给定的外部名字创建一个复制起源, 并返回分配给它的内部 ID。 该名字的长度不得超过 512 字节。 |
删除一个先前创建的复制起源, 包括任何关联的重放进度。 |
按名字查找一个复制起源,
并返回内部 ID。
如果没有找到这样的复制起源,
则返回
|
把当前会话标记为正在从给定的起源重放,
以允许跟踪重放进度。
只有在当前没有选中任何起源时才能使用。
使用
|
取消
|
如果当前会话中已经选中了一个复制起源, 则返回真。 |
返回当前会话中选中的复制起源的重放位置。
参数
|
把当前事务标记为正在重放一个在给定的
LSN
和时间戳提交的事务。
只有当已经使用
|
取消
|
把给定节点的复制进度设置为给定的位置。 这主要用于设置初始位置, 或者在配置更改之类的情况之后设置一个新位置。 注意, 不加考虑地使用这个函数可能导致被不一致地复制的数据。 |
返回给定复制起源的重放位置。
参数
|
发出一条逻辑解码消息。
这可以用于通过 WAL
向逻辑解码插件传递通用消息。
|
把逻辑故障转移复制槽从主服务器同步到备用服务器。
这个函数只能在备用服务器上执行。
临时同步槽
(如果有的话)
不能用于逻辑解码,
并且必须在提升之后被删除。
细节请参见
Section 47.2.3。
注意,
这个函数主要用于测试和调试目的,
应当谨慎使用。
此外,
如果
Caution
如果在执行该函数之后,
备用服务器上的
|
Table 9.102
中展示的函数计算数据库对象的磁盘空间使用量,
或者协助呈现或理解使用结果。
bigint
结果以字节计量。
如果传给这些函数之一的 OID
并不表示一个现有的对象,
则返回
NULL。
Table 9.102. 数据库对象尺寸函数
函数 说明 |
|---|
显示用于存储任意单个数据值的字节数。 如果直接应用到一个表列值上, 这会反映已执行的任何压缩。 |
显示被用来压缩一个单独变长值的压缩算法。
如果该值没有被压缩,
则返回
|
显示一个磁盘上的
TOASTed
值的
|
计算具有指定名字或 OID
的数据库所使用的总磁盘空间。
要使用这个函数,
你必须在指定的数据库上拥有
|
计算附加到指定表的索引所使用的总磁盘空间。 |
计算指定关系的一个
“分支”所使用的磁盘空间。
(注意,
对于大多数用途,
使用更高层的函数
|
把以人类可读格式
(由
|
把以字节计的尺寸转换为更容易为人类阅读的、 带尺寸单位的格式 (视情况为 bytes、kB、 MB、GB、TB 或 PB)。 注意, 这些单位是 2 的幂而非 10 的幂, 因此 1kB 是 1024 字节, 1MB 是 10242 = 1048576 字节, 依此类推。 |
计算指定的表所使用的磁盘空间, 不包括索引 (但包括它的 TOAST 表(如果有)、 空闲空间映射和可见性映射)。 |
计算具有指定名字或 OID
的表空间中所使用的总磁盘空间。
要使用这个函数,
你必须在指定的表空间上拥有
|
计算指定的表所使用的总磁盘空间,
包括全部索引和
TOAST
数据。
结果等同于
|
上面对表或索引进行操作的函数接受一个
regclass
参数,
它就是
pg_class
系统目录中该表或索引的 OID。
不过你不必手工查找这个 OID,
因为
regclass
数据类型的输入转换器会替你完成这项工作。
细节请参见
Section 8.19。
Table 9.103 中展示的函数协助识别与数据库对象相关联的具体磁盘文件。
Table 9.103. 数据库对象定位函数
函数 说明 |
|---|
返回当前被分配给指定关系的
“文件节点”编号。
文件节点是用于该关系的文件名的基组件
(更多信息请参见
Section 66.1)。
对大多数关系而言,
结果与
|
返回该关系的完整文件路径名
(相对于数据库集群的数据目录
|
在给定表空间 OID
和存储它所用的文件节点的情况下,
返回一个关系的 OID。
这本质上就是
|
Table 9.104 列出用于管理排序规则的函数。
Table 9.104. 排序规则管理函数
函数 说明 |
|---|
返回排序规则对象当前安装在操作系统中的实际版本。
如果它与
|
返回数据库的排序规则当前安装在操作系统中的实际版本。
如果它与
|
根据它在操作系统中找到的所有区域设置,
向系统目录
|
Table 9.105 列出用于操纵统计信息的函数。 这些函数不能在恢复期间执行。
这些统计信息操纵函数所做的更改,
很可能被
autovacuum
(或手动的
VACUUM 或
ANALYZE)
覆盖,
因此应当被视为临时性的。
Table 9.105. 数据库对象统计信息操纵函数
函数 说明 |
|---|
更新表级统计信息。
通常,
这些统计信息会被自动收集,
或作为
VACUUM 或
ANALYZE
的一部分被更新,
因此没有必要调用这个函数。
然而,
在一次恢复之后、
如果
被跟踪的统计信息可能因版本而异,
因此参数以
SELECT pg_restore_relation_stats(
'
例如,
要为表
SELECT pg_restore_relation_stats(
'schemaname', 'myschema',
'relname', 'mytable',
'relpages', 173::integer,
'reltuples', 10000::real);
参数
此外,
这个函数还接受类型为
次要错误会被报告为
调用者必须拥有该表上的
|
|
为给定的关系清除表级统计信息, 就像该表是刚创建的一样。
调用者必须拥有该表上的
|
创建或更新列级统计信息。
通常,
这些统计信息会被自动收集,
或作为
VACUUM 或
ANALYZE
的一部分被更新,
因此没有必要调用这个函数。
然而,
在一次恢复之后、
如果
被跟踪的统计信息可能因版本而异,
因此参数以
SELECT pg_restore_attribute_stats(
'
例如,
要为表
SELECT pg_restore_attribute_stats(
'schemaname', 'myschema',
'relname', 'mytable',
'attname', 'col1',
'inherited', false,
'avg_width', 125::integer,
'null_frac', 0.5::real);
必需的参数是
此外,
这个函数还接受类型为
次要错误会被报告为
调用者必须拥有该表上的
|
|
为给定的关系和属性清除列级统计信息, 就像该表是刚创建的一样。
调用者必须拥有该表上的
|
Table 9.106 列出提供关于分区表结构信息的函数。
Table 9.106. 分区信息函数
例如,
要检查分区表
measurement
中所含数据的总尺寸,
可以使用下面的查询:
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
FROM pg_partition_tree('measurement');
Table 9.107 展示了可用于索引维护任务的函数。 (注意, 这些维护任务通常由自动清理自动完成; 只有在特殊情况下才需要使用这些函数。) 这些函数不能在恢复期间执行。 这些函数的使用被限制为超级用户和给定索引的属主。
Table 9.107. 索引维护函数
函数 说明 |
|---|
扫描指定的 BRIN 索引, 找出基础表中当前未被该索引汇总的页面范围; 对于任何这样的范围, 它会通过扫描那些表页面来创建一个新的汇总索引元组。 返回被插入该索引的新页面范围汇总的数量。 |
汇总覆盖给定块的页面范围
(如果尚未汇总的话)。
这类似于
|
移除汇总覆盖给定表块的页面范围的 BRIN 索引元组 (如果存在的话)。 |
通过把指定 GIN
索引的
“待处理”列表中的条目批量移入主 GIN
数据结构来清理它。
返回从待处理列表中移除的页面数量。
如果参数是一个在构建时禁用了
|
Table 9.108
中展示的函数提供对承载服务器的机器上的文件的原生访问。
只有数据库集群目录和
log_directory
之内的文件可以被访问,
除非用户是超级用户,
或者被授予了
pg_read_server_files
角色。
对集群目录中的文件使用相对路径,
对日志文件使用与
log_directory
配置设置相匹配的路径。
注意,
向用户授予
pg_read_file()
或相关函数的 EXECUTE
特权,
就赋予了他们读取数据库服务器进程能够读取的服务器上任何文件的能力;
这些函数绕过所有数据库内的特权检查。
这意味着,
例如,
一个拥有这类访问权的用户能够读取存储身份验证信息的
pg_authid
表的内容,
以及读取数据库中的任何表数据。
因此,
对这些函数授予访问权应当被仔细考虑。
在这些函数上授予特权时,
请注意,
展示可选参数的表条目大多被实现为具有不同参数列表的若干物理函数。
如果要使用其中某个函数,
必须分别对每个这样的函数授予特权。
psql
的
\df
命令可以用于检查实际的函数签名是什么。
这些函数中有一些接受一个可选的
missing_ok
参数,
它规定文件或目录不存在时的行为。
如果为
true,
该函数会酌情返回
NULL
或一个空结果集。
如果为
false,
则会抛出一个错误。
(除
“文件未找到”之外的失败条件在任何情况下都会被报告为错误。)
默认值为
false。
Table 9.108. 通用文件访问函数
Table 9.109 中展示的函数管理咨询锁。 关于这些函数的正确使用的细节, 请参见 Section 13.3.5。
所有这些函数都预期被用来锁定由应用定义的资源,
资源既可以用一个单一的 64
位键值标识,
也可以用两个 32
位键值标识
(注意这两个键空间并不重叠)。
如果另一个会话已经在同一个资源标识符上持有一个冲突的锁,
那么这些函数要么等到该资源变为可用,
要么返回一个
false
结果,
具体取决于函数。
锁可以是共享的或独占的:
共享锁不与同一资源上的其他共享锁冲突,
只与独占锁冲突。
锁可以在会话层级上获取
(这样它们会一直保持到被释放或会话结束),
或者在事务层级上获取
(这样它们会保持到当前事务结束;
没有提供手动释放)。
多个会话级锁请求会堆叠,
因此如果同一个资源标识符被锁了三次,
那么就必须有三次解锁请求,
才能在会话结束之前提前释放该资源。
Table 9.109. 咨询锁函数