pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
这一节描述的函数被用来控制和监视一个PostgreSQL安装。
表 9.59展示了那些可以用于查询以及修改运行时配置参数的函数。
表 9.59. 配置设定函数
函数current_setting返回设置setting_name的当前值。它对应于SQL命令SHOW。例如:
SELECT current_setting('datestyle');
current_setting
-----------------
ISO, MDY
(1 row)
set_config将参数setting_name设置为new_value。如果is_local为true,新值仅适用于当前事务。如果要让新值适用于当前会话,请改用false。该函数对应于 SQL 命令SET。例如:
SELECT set_config('log_statement_stats', 'off', false);
set_config
------------
off
(1 row)
在表 9.60中展示的函数向其它服务器进程发送控制信号。这些函数的使用通常仅限超级用户,例外情况已单独注明。
表 9.60. 服务器信号函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
boolean |
取消后端的当前查询。如果调用角色是被取消后端所属角色的成员,也允许执行此操作;但只有超级用户才能取消超级用户的后端。 |
|
boolean |
使服务器进程重新加载配置文件 |
|
boolean |
轮转服务器日志文件 |
|
boolean |
终止后端。如果调用角色是被终止后端所属角色的成员,也允许执行此操作;但只有超级用户才能终止超级用户的后端。 |
这些函数在成功时都返回 true,否则返回 false。
pg_cancel_backend和pg_terminate_backend向由进程 ID 标识的后端进程发送信号(分别是SIGINT或SIGTERM)。 一个活动后端的进程 ID可以从pg_stat_activity视图的pid列中找到,或者通过在服务器上列出postgres进程(在 Unix 上使用ps或者在Windows上使用任务管理器)得到。 一个活动后端的角色可以在pg_stat_activity视图的usename列中找到。
pg_reload_conf 向服务器发送 SIGHUP 信号,使所有服务器进程重新加载配置文件。
pg_rotate_logfile 向日志文件管理器发送信号,使其立即切换到新的输出文件。只有内置日志收集器正在运行时才有效,否则不存在日志文件管理器子进程。
表 9.61中列出的函数有助于进行在线备份。这些函数不能在恢复期间执行(pg_is_in_backup、pg_backup_start_time和pg_xlog_location_diff除外)。
表 9.61. 备份控制函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
pg_lsn |
创建用于恢复的命名点(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数) |
|
pg_lsn |
获取当前预写式日志插入位置 |
|
pg_lsn |
获取当前预写式日志写入位置 |
|
pg_lsn |
准备执行在线备份(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数) |
|
pg_lsn |
结束排他在线备份(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数) |
|
bool |
如果在线排他备份仍在进行,则为真。 |
|
timestamp with time zone |
获取正在进行的在线排他备份的开始时间。 |
|
pg_lsn |
强制切换到新的预写式日志文件(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数) |
|
text |
将事务日志位置字符串转换为文件名 |
|
text, integer |
将事务日志位置字符串转换为文件名和文件内的十进制字节偏移量 |
|
numeric |
计算两个事务日志位置之差 |
pg_start_backup接受任意用户定义的备份标签。(通常是备份转储文件将要保存的名称。)该函数将备份标签文件(backup_label)写入数据库集簇的数据目录,执行检查点,然后以文本形式返回备份的起始事务日志位置。用户可以忽略该返回值,提供它只是因为它可能有用。
postgres=# select pg_start_backup('label_goes_here');
pg_start_backup
-----------------
0/D4445B8
(1 row)
还可以提供第二个可选参数,其类型为boolean。如果该参数为true,则尽快执行pg_start_backup。这会强制立即执行检查点,使 I/O 操作量陡增,并降低并发执行的查询的速度。
pg_stop_backup 删除 pg_start_backup 创建的标签文件,并在事务日志归档区域创建一个备份历史文件。历史文件包括传给 pg_start_backup 的标签、备份的起止事务日志位置以及备份的起止时间。返回值是备份的结束事务日志位置(同样可以忽略)。记录结束位置后,当前事务日志插入点会自动推进到下一个事务日志文件的起始处,使包含结束位置的事务日志文件可以立即归档,从而完成备份。
pg_switch_xlog 切换到下一个预写式日志文件,使当前文件可以归档(假设正在使用连续归档)。返回值是刚完成的预写式日志文件中的结束预写式日志位置加 1。如果自上次切换预写式日志以来没有发生任何预写式日志活动,pg_switch_xlog 不执行任何操作,并返回当前使用的预写式日志文件的起始位置。
pg_create_restore_point 创建一条可用作恢复目标的命名预写式日志记录,并返回相应的预写式日志位置。随后可以在 recovery_target_name 中使用该名称,指定恢复到哪一点。应避免创建多个同名恢复点,因为恢复会在第一个名称匹配恢复目标的恢复点停止。
pg_current_xlog_location 显示当前预写式日志写入位置,格式与上述函数相同。类似地,pg_current_xlog_insert_location 显示当前预写式日志插入点。插入位置是预写式日志在任意时刻的“逻辑”末尾,而写入位置是实际从服务器内部缓冲区写出的内容的末尾。写入位置是能从服务器外部检查到的内容的末尾,如果要归档尚未写满的预写式日志文件,通常需要的是这个位置。提供插入位置主要是为了服务器调试。这些都是只读操作,不需要超级用户权限。
可以使用pg_xlogfile_name_offset从上述任一函数的结果中提取相应的预写式日志文件名和字节偏移。例如:
postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
file_name | file_offset
--------------------------+-------------
00000001000000000000000D | 4039624
(1 row)
类似地,pg_xlogfile_name仅提取预写式日志文件名。当指定的预写式日志位置恰好位于预写式日志文件边界时,这两个函数都返回前一个预写式日志文件的名称。这通常正是管理预写式日志归档时所需的行为,因为前一个文件是当前需要归档的最后一个文件。
pg_xlog_location_diff 计算两个预写式日志位置之间的字节差。可以将它与 pg_stat_replication 或表 9.61中的某些函数配合使用,以获取复制延迟。
有关正确使用这些函数的详细信息,参见第 24.3 节。
表 9.62中展示的函数提供有关备库当前状态的信息。 这些函数可以在恢复或普通运行过程中被执行。
表 9.62. 恢复信息函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
bool |
如果恢复仍在进行,则为真。 |
|
pg_lsn |
获取流复制最近接收并同步到磁盘的预写式日志位置。在流复制进行期间,该值单调增加。如果恢复已完成,该值将保持为恢复期间最后接收并同步到磁盘的 WAL 记录的位置。如果禁用了流复制,或者流复制尚未开始,此函数返回 NULL。 |
|
pg_lsn |
获取恢复期间最近重放的预写式日志位置。如果恢复仍在进行,该值单调增加。如果恢复已完成,该值将保持为该次恢复期间最后应用的 WAL 记录的位置。如果服务器未经恢复而正常启动,此函数返回 NULL。 |
|
timestamp with time zone |
获取恢复期间最近重放事务的时间戳,即该事务的提交或中止 WAL 记录在主库上生成的时间。如果恢复期间尚未重放任何事务,此函数返回 NULL。否则,如果恢复仍在进行,该值单调增加。如果恢复已完成,该值将保持为该次恢复期间最后应用的事务的时间戳。如果服务器未经恢复而正常启动,此函数返回 NULL。 |
表 9.63列出的函数用于控制恢复进度。这些函数只能在恢复期间执行。
表 9.63. 恢复控制函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
bool |
如果恢复已暂停,则为真。 |
|
void |
立即暂停恢复(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数)。 |
|
void |
如果恢复已暂停,则重新开始恢复(默认仅限超级用户,但可以向其他用户授予EXECUTE权限以运行此函数)。 |
恢复暂停时,不再应用数据库更改。如果处于热备状态,所有新查询都会看到同一个一致的数据库快照,并且在恢复继续之前不会再产生查询冲突。
如果禁用了流复制,则暂停状态可能会无限期地持续下去,不会出现问题。 如果正在进行流复制,那么将继续接收WAL记录,这将最终填满可用磁盘空间,这取决于暂停持续时间、WAL生成速度和可用磁盘空间。
PostgreSQL允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个START TRANSACTION命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。
为了解决这个问题,PostgreSQL允许一个事务导出它正在使用的快照。只要导出快照的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。
如表 9.64中所示,快照通过pg_export_snapshot函数导出,并且通过SET TRANSACTION命令导入。
表 9.64. 快照同步函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
text |
保存当前快照并返回其标识符 |
函数 pg_export_snapshot 保存当前快照,并返回标识该快照的 text 字符串。必须在数据库之外将此字符串传递给要导入该快照的客户端。快照只能在导出它的事务结束之前导入。如有需要,一个事务可以导出多个快照。注意,这只对 READ COMMITTED 事务有用,因为在 REPEATABLE READ 及更高隔离级别中,事务在整个存续期间都使用同一个快照。事务一旦导出过快照,就不能再通过 PREPARE TRANSACTION 进行预备。
关于如何使用导出快照的详细说明,请参见SET TRANSACTION。
表 9.65中的函数计算数据库对象的磁盘空间用量。
表 9.65. 数据库对象尺寸函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
int |
存储某个值所使用的字节数(可能已压缩) |
|
bigint |
指定 OID 的数据库占用的磁盘空间 |
|
bigint |
指定名称的数据库占用的磁盘空间 |
|
bigint |
指定表的索引占用的磁盘空间总量 |
|
bigint |
指定表或索引的指定分支('main'、'fsm'、'vm' 或 'init')占用的磁盘空间 |
|
bigint |
pg_relation_size(..., 'main') 的简写 |
|
text |
将以 64 位整数表示的字节大小转换为带有大小单位的人类可读格式 |
|
text |
将以 numeric 值表示的字节大小转换为带有大小单位的人类可读格式 |
|
bigint |
指定表占用的磁盘空间,不包括索引(但包括 TOAST、空闲空间映射和可见性映射) |
|
bigint |
指定 OID 的表空间占用的磁盘空间 |
|
bigint |
指定名称的表空间占用的磁盘空间 |
|
bigint |
指定表占用的磁盘空间总量,包括所有索引和 TOAST 数据 |
pg_column_size 显示存储任意单个数据值所用的空间。
pg_total_relation_size 接受表或 TOAST 表的 OID 或名称,返回该表占用的磁盘总空间,包括所有关联索引。此函数等同于 pg_table_size + pg_indexes_size。
pg_table_size 接受表的 OID 或名称,返回该表所需的磁盘空间,不包括索引。(包括 TOAST 空间、空闲空间映射和可见性映射。)
pg_indexes_size 接受表的 OID 或名称,返回该表所有附属索引占用的磁盘总空间。
pg_database_size 和 pg_tablespace_size 接受数据库或表空间的 OID 或名称,返回其中占用的磁盘总空间。使用 pg_database_size 必须对指定数据库拥有 CONNECT 权限(默认授予)。使用 pg_tablespace_size 必须对指定表空间拥有 CREATE 权限;但如果该表空间是当前数据库的默认表空间,则不受此限制。
pg_relation_size接受表、索引或 TOAST 表的 OID 或名称,并以字节为单位返回该关系某个分支的磁盘大小。(注意,大多数情况下使用更高层的函数会更方便,例如pg_total_relation_size或pg_table_size,它们会将所有分支的大小相加。)只带一个参数时,返回关系的主数据分支大小。可以提供第二个参数来指定要检查的分支:
pg_size_pretty 可以将其他函数的结果格式化为便于阅读的形式,适当地使用 kB、MB、GB 或 TB 单位。
上述操作表和索引的函数接受一个regclass参数,它是该表或索引在pg_class系统目录中的 OID。 你不必手工去查找该 OID,因为regclass数据类型的输入转换器会为你代劳。 只写包围在单引号内的表名,这样它看起来像一个字面量。 为了与普通SQL名称的处理相兼容,该字符串将被转换为小写形式,除非其中在表名周围包含双引号。
如果向上述某个函数传入的 OID 不代表现有对象,则返回 NULL。
表 9.66中展示的函数帮助标识数据库对象相关的磁盘文件。
表 9.66. 数据库对象位置函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
oid |
指定关系的文件结点编号 |
|
text |
指定关系的文件路径名 |
pg_relation_filenode 接受表、索引、序列或 TOAST 表的 OID 或名称,返回当前分配给它的“文件结点”编号。文件结点是关系文件名的基本组成部分(更多信息见第 58.1 节)。对于大多数表,结果与 pg_class.relfilenode 相同;但某些系统目录的 relfilenode 为零,必须使用此函数获取正确值。如果传入的关系没有存储空间(例如视图),函数返回 NULL。
pg_relation_filepath 与 pg_relation_filenode 类似,但返回关系的完整文件路径名(相对于数据库集簇的数据目录 PGDATA)。
表 9.67中的函数提供对数据库服务器所在机器上的文件的本地访问。只能访问数据库集簇目录和 log_directory 中的文件。集簇目录中的文件使用相对路径,日志文件使用与 log_directory 配置设置相匹配的路径。除非另有说明,这些函数仅限超级用户使用。
表 9.67. 通用文件访问函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
setof text |
列出目录内容。 |
|
text |
返回文本文件的内容。 |
|
bytea |
返回文件内容。 |
|
record |
返回文件信息。 |
pg_ls_dir 返回指定目录中的所有名称,但不包括特殊项“.”和“..”。
pg_read_file 从给定的 offset 开始返回文本文件的一部分,最多返回 length 字节(如果先到达文件末尾,则返回更少的字节)。如果 offset 为负,则它相对于文件末尾。如果省略 offset 和 length,则返回整个文件。从文件读取的字节按服务器编码解释为字符串;如果它们在该编码下无效,则会报错。
pg_read_binary_file类似于pg_read_file,但结果是bytea值,因此不执行编码检查。与convert_from函数配合使用,可以按指定编码读取文件:
SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8');
pg_stat_file返回一条记录,包含文件大小、最后访问时间戳、最后修改时间戳、最后文件状态更改时间戳(仅限 Unix 平台)、文件创建时间戳(仅限 Windows),以及一个boolean值,表示它是否是目录。典型用法包括:
SELECT * FROM pg_stat_file('filename');
SELECT (pg_stat_file('filename')).modification;
表 9.68中展示的函数管理咨询锁。 有关正确使用这些函数的细节请参考第 13.3.4 节。
表 9.68. 咨询锁函数
| 名称 | 返回类型 | 描述 |
|---|---|---|
|
void |
获取排他会话级咨询锁 |
|
void |
获取排他会话级咨询锁 |
|
void |
获取共享会话级咨询锁 |
|
void |
获取共享会话级咨询锁 |
|
boolean |
释放排他会话级咨询锁 |
|
boolean |
释放排他会话级咨询锁 |
|
void |
释放当前会话持有的所有会话级咨询锁 |
|
boolean |
释放共享会话级咨询锁 |
|
boolean |
释放共享会话级咨询锁 |
|
void |
获取排他事务级咨询锁 |
|
void |
获取排他事务级咨询锁 |
|
void |
获取共享事务级咨询锁 |
|
void |
获取共享事务级咨询锁 |
|
boolean |
如果可用,则获取排他会话级咨询锁 |
|
boolean |
如果可用,则获取排他会话级咨询锁 |
|
boolean |
如果可用,则获取共享会话级咨询锁 |
|
boolean |
如果可用,则获取共享会话级咨询锁 |
|
boolean |
如果可用,则获取排他事务级咨询锁 |
|
boolean |
如果可用,则获取排他事务级咨询锁 |
|
boolean |
如果可用,则获取共享事务级咨询锁 |
|
boolean |
如果可用,则获取共享事务级咨询锁 |
pg_advisory_lock 锁定应用定义的资源,可以用一个 64 位键值或两个 32 位键值标识资源(注意,这两个键空间不重叠)。如果另一个会话已持有相同资源标识符上的锁,此函数会等待,直到该资源可用。该锁是排他的。多个锁请求会叠加,因此如果同一资源被锁定了三次,就必须解锁三次,才能释放给其他会话使用。
pg_advisory_lock_shared 的行为与 pg_advisory_lock 相同,但该锁可以与其他请求共享锁的会话共享。只有试图获取排他锁的会话会被阻挡。
pg_try_advisory_lock 与 pg_advisory_lock 类似,但不会等待锁变得可用。它要么立即获得锁并返回 true,要么在无法立即获得锁时返回 false。
pg_try_advisory_lock_shared 的行为与 pg_try_advisory_lock 相同,但尝试获取的是共享锁,而不是排他锁。
pg_advisory_unlock 释放先前获得的会话级排他咨询锁。如果成功释放锁,则返回 true。如果未持有该锁,则返回 false,服务器还会报告一条 SQL 警告。
pg_advisory_unlock_shared 的行为与 pg_advisory_unlock 相同,但释放的是会话级共享咨询锁。
pg_advisory_unlock_all 释放当前会话持有的所有会话级咨询锁。(会话结束时会隐式调用此函数,即使客户端非正常断开连接也是如此。)
pg_advisory_xact_lock 的行为与 pg_advisory_lock 相同,但锁会在当前事务结束时自动释放,不能显式释放。
pg_advisory_xact_lock_shared 的行为与 pg_advisory_lock_shared 相同,但锁会在当前事务结束时自动释放,不能显式释放。
pg_try_advisory_xact_lock 的行为与 pg_try_advisory_lock 相同,但如果获得了锁,该锁会在当前事务结束时自动释放,不能显式释放。
pg_try_advisory_xact_lock_shared 的行为与 pg_try_advisory_lock_shared 相同,但如果获得了锁,该锁会在当前事务结束时自动释放,不能显式释放。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。