9.24. 系统管理函数

Table 9-54显示了那些可以用于查询以及修改运行时配置参数的函数

Table 9-54. 配置设置函数

名称返回类型描述
current_setting(setting_name) text获取当前的设置值
set_config(setting_namenew_valueis_local) text设置参数并返回新值

current_setting用于以查询形式获取setting_name设置的当前值。 它和SQL命令SHOW是等效的。例如:

SELECT current_setting('datestyle');

 current_setting
-----------------
 ISO, MDY
(1 row)

set_config将参数setting_name设置为new_value。 如果is_localtrue, 那么新值将只应用于当前事务。如果你希望新值应用于当前会话, 那么应该使用false。它等效于 SQL 命令SET。例如:

SELECT set_config('log_statement_stats', 'off', false);

 set_config
------------
 off
(1 row)

Table 9-55里的函数向其它服务器进程发送控制信号。只有超级用户才能使用这些函数

Table 9-55. 服务器信号函数

名称返回类型描述
pg_cancel_backend(pidint) boolean取消一个后端的当前查询
pg_terminate_backend(pidint) boolean终止一个后端服务进程
pg_reload_conf() boolean导致所有服务器进程重新装载它们的配置文件
pg_rotate_logfile() boolean滚动服务器的日志文件

如果成功,这些函数返回true,否则返回false

pg_cancel_backendpg_terminate_backend向由 pid 标识的后端进程发送一个查询取消(SIGINT)信号。 一个活动的后端进程的 PID 可以从pg_stat_activity视图的 procpid 字段找到,或者在Unix服务器上用ps, Windows上Task Manager任务管理器列出postgres进程。

pg_reload_conf给服务器发送一个SIGHUP信号,导致所有服务器进程重新装载配置文件。

pg_rotate_logfile给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。 这个函数只有在 redirect_stderr 用于日志输出的时候才有用,否则根本不存在日志文件管理器子进程。

Table 9-56里的函数帮助我们进行在线备份。在恢复中不能执行这些函数。只有超级用户才能使用头三个函数。

Table 9-56. 备份控制函数

名称返回类型描述
pg_start_backup(labeltext[fastboolean]) text准备执行在线备份
pg_stop_backup() text终止执行在线备份
pg_switch_xlog() text强制切换到一个新的事务日志文件
pg_current_xlog_location() text获取当前事务日志的写入位置
pg_current_xlog_insert_location() text获取当前事务日志的插入位置
pg_xlogfile_name_offset(locationtext) textinteger将事务日志的位置字符串转换为文件名并返回在文件中的字节偏移量
pg_xlogfile_name(locationtext) text将事务日志的位置字符串转换为文件名

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_current_xlog_location使用与前面那些函数相同的格式显示当前事务日志的写入位置。 类似的,pg_current_xlog_insert_location显示当前事务日志的插入点。 插入点是事务日志在某个瞬间的"逻辑终点",而实际的写入位置则是从服务器内部 缓冲区写出时的终点。写入位置是可以从服务器外部检测到的终点,如果想归档部分 完成的事务日志文件,那么这个通常就是你想要的结果。插入点主要用于服务器调试目的。 上述两个函数既是只读操作也不需要超级用户权限。

从上所述函数的返回结果中抽取相应的事务日志文件名称和字节偏移量。例如:

postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
        file_name         | file_offset 
--------------------------+-------------
 00000001000000000000000D |     4039624
(1 row)

类似的,pg_xlogfile_name仅仅抽取事务日志文件名称。如果给定的事务日志 位置恰好位于事务日志文件的交界上,这两个函数都返回前一个事务日志文件的名字。 自从前一个文件是当前最后一个需要归档的文件,这对于管理事务日志归档来说通常是期望的行为。

有关正确使用这些函数的细节,见Section 24.3

Table 9-57显示函数信息,提供有关当前备用数据库状态的信息。 这些函数可能在恢复和正常运行间运行。

Table 9-57. 恢复信息函数

名称返回类型描述
pg_is_in_recovery() bool如果恢复仍然在进程中,返回true。
pg_last_xlog_receive_location() text 获取最后一个事务日志接收并通过流媒体复制同步到磁盘的位置。在流复制过程中,这将单向增加。 但是当流复制重启时,将回到流复制的起始位置,即通常WAL文件的开头(包含当前重播)位置。 如果恢复已完成,这会保持在最后WAL记录值不变。在恢复过程中,接收并同步到磁盘的值。 如果不能用流复制,或还没有开始,返回NULL。
pg_last_xlog_replay_location() text 获取重播在恢复过程中的最后一个事务日志位置。如果恢复仍然在进程中,则将单向增加。 如果恢复已完成此值将保持静态在最后WAL在恢复过程中应用一条记录的值。 当服务器已启动正常而无需恢复时,函数返回NULL。

Table 9-58中显示的函数计算数据库对象使用的实际磁盘空间

Table 9-58. 数据库对象尺寸函数

名称返回类型描述
pg_column_size(any)int存储一个指定的数值需要的字节数(可能压缩过)
pg_total_relation_size(regclass) bigint 指定表OID或表名使用的总磁盘空间,包括所有索引和TOAST数据。
pg_table_size(regclass) bigint 指定表OID或表名使用的磁盘空间,除去索引(但是包含TOAST,自由空间映射和可视映射)
pg_indexes_size(regclass) bigint 关联指定表OID或表名的表索引的使用总磁盘空间
pg_database_size(oid) bigint指定OID的数据库使用的磁盘空间
pg_database_size(name) bigint指定名称的数据库使用的磁盘空间
pg_tablespace_size(oid) bigint指定 OID 的表空间使用的磁盘空间
pg_tablespace_size(name) bigint指定名的表空间使用的磁盘空间。
pg_relation_size(relationregclassforktext) bigint 一个指定OID或名的表或索引,通过指定fork('main''fsm'or'vm')所使用的磁盘空间。
pg_relation_size(relationregclass) bigint 简写为pg_relation_size(..., 'main')
pg_size_pretty(bigint) text把字节计算的大小转换成一个人类易读的大小

pg_column_size显示用于存储某个独立数据值的空间。

pg_total_relation_size接受表OID或表名或toast表,返回该表包含所有关联索引的总磁盘空间。这个函数等价于 pg_table_size+pg_indexes_size

pg_table_size接受一个表OID或名,返回该表需要的磁盘空间,除去索引。(包含TOAST 空间,自由空间映射和可见映射。)

pg_indexes_size接受一个表OID或名,返回关联该表的所有索引的总磁盘空间大小。

pg_database_sizepg_tablespace_size接受一个数据库的OID或名,然后返回该对象使用的全部磁盘空间。

pg_relation_size接受一个表、索引、toast表的 OID 或名字,然后返回它们以字节计的大小。 指定'main'或省去第二个参数返回关系中主数据fork的大小。指定'fsm'返回 关联这个关系的自由空间映射大小。(见Section 54.3)指定'vm'返回关联这个关系的可见映射大小。 (见Section 54.4)注意这个函数显示只一个fork的大小;对于大多而言,使用高级别函数pg_total_relation_sizepg_table_size 更方便。

pg_size_pretty用于把其它函数的结果格式化成一种人类易读的格式,可以根据情况使用KB 、MB 、GB 、TB

Table 9-59显示的函数,有助于识别与数据库对象相关的特定磁盘文件。

Table 9-59. 数据库对象本地函数

名称名称描述
pg_relation_filenode(relationregclass) oid 指定OID或名关系的Filenode数
pg_relation_filepath(relationregclass) text 指定OID或名的关系的文件路径名

pg_relation_filenode接受一个表,索引,序列或toast表的OID或名,返回当前赋予的"filenode"数。 filenode是用于关系的文件名基本组件。(见Section 54.1获取更多信息)。对于大多数表pg_class.relfilenode 的结果相同,但是对于某种系统表relfilenode是0,并且必须使用此函数获取正确的值。 如果传递一个没有存储如视图的关系,此函数将返回 NULL。

pg_relation_filepath类似于pg_relation_filenode,但它返回关系的整个文件的路径名。 (相对于数据库集群的数据目录PGDATA

Table 9-60里的函数提供了对数据库服务器所在机器上的文件的本地访问接口。 只有那些在数据库集群目录和log_directory目录里面的文件可以访问。使用相对路径访问集群目录里面的文件,以及匹配 log_directory配置设置的路径访问日志文件。只有超级用户才能使用这些函数。

Table 9-60. 通用文件访问函数

名称返回类型描述
pg_ls_dir(dirnametext) setof text列出目录中的文件
pg_read_file(filenametextoffsetbigintlengthbigint) text返回一个文本文件的内容
pg_stat_file(filenametext) record返回一个文件的信息

pg_ls_dir返回指定目录里面的除了特殊项"."".."之外所有名字

pg_read_file返回一个文本文件的一部分,从offset开始,返回最多length 字节(如果先达到文件结尾,则小于这个数值)。如果offset是负数,那么它就是相对于文件结尾回退的长度。

pg_stat_file返回一条记录,其中包含:文件大小、最后访问时间戳、最后更改时间戳、 最后文件状态修改时间戳(只在 Unix 平台上可用)、文件创建 时间戳(只在 Windows 平台上可用)、是否为目录的boolean值。典型的用法:

SELECT * FROM pg_stat_file('filename');
SELECT (pg_stat_file('filename')).modification;

Table 9-61中的函数用于管理咨询锁(Advisory Lock)。有关正确使用这些函数的细节,参阅Section 13.3.4

Table 9-61. 咨询锁函数

名称返回类型描述
pg_advisory_lock(keybigint) void获取排斥咨询锁
pg_advisory_lock(key1intkey2int) void获取排斥咨询锁
pg_advisory_lock_shared(keybigint) void获取共享咨询锁
pg_advisory_lock_shared(key1intkey2int) void获取共享咨询锁
pg_try_advisory_lock(keybigint) boolean尝试获取排斥咨询锁
pg_try_advisory_lock(key1intkey2int) boolean尝试获取排斥咨询锁
pg_try_advisory_lock_shared(keybigint) boolean尝试获取共享咨询锁
pg_try_advisory_lock_shared(key1intkey2int) boolean尝试获取共享咨询锁
pg_advisory_unlock(keybigint) boolean释放排斥咨询锁
pg_advisory_unlock(key1intkey2int) boolean释放排斥咨询锁
pg_advisory_unlock_shared(keybigint) boolean释放共享咨询锁
pg_advisory_unlock_shared(key1intkey2int) boolean释放共享咨询锁
pg_advisory_unlock_all() void释放当前会话持有的所有咨询锁

pg_advisory_lock锁定一个应用程序定义的资源,该资源可以用一个 64 位或两个不重叠的 32 位键值标识。在pg_locks.objid指定键值类型。如果已经有另外的会话锁定了该资源,那么该函数将会阻塞到该资源可用 为止。这个锁是排斥的。多个锁定请求将会被压入栈中,因此, 如果同一个资源被锁定了三次,那么它必须被解锁三次以将资源释放给其它会话使用。

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将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。