表9-45显示了那些可以用于查询以及修改运行时配置参数的函数。
表9-45. 配置设置函数
名字返回类型描述
current_setting(setting_name)text当前的设置值
set_config(setting_name, new_value, is_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_local 为 true ,那么新值将只应用于当前事务。如果你希望新值应用于当前会话,那么应该使用 false 。它等效于 SQL 命令 SET 。比如:
SELECT set_config('log_statement_stats', 'off', false);
set_config
------------
off
(1 row)
表9-46里的函数向其它服务器进程发送控制信号。只有超级用户才能使用这些函数。
表9-46. 服务器信号函数
名字返回类型描述
pg_cancel_backend(pid int)boolean取消一个后端的当前查询
pg_reload_conf()boolean导致所有服务器进程重新装载它们的配置文件
pg_rotate_logfile()boolean滚动服务器的日志文件
如果成功,这些函数返回 true ,否则返回 false 。
pg_cancel_backend 向由 pid 标识的后端进程发送一个查询取消(SIGINT)信号。一个活动的后端进程的 PID 可以从 pg_stat_activity 视图的 procpid 字段找到,或者在服务器上用 ps 列出 postgres 进程。
pg_reload_conf 给服务器发送一个 SIGHUP 信号,导致所有服务器进程重新装载配置文件。
pg_rotate_logfile 给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。这个函数只有在 redirect_stderr 用于日志输出的时候才有用,否则根本不存在日志文件管理器子进程。
表9-47里的函数帮助我们进行在线备份。只有超级用户才能使用这些函数。
表9-47. 备份控制函数
名字返回类型描述
pg_start_backup(label text)text开始执行在线备份
pg_stop_backup()text完成执行在线备份
pg_switch_xlog()text切换到一个新的事务日志文件
pg_current_xlog_location()text获取当前事务日志的写入位置
pg_current_xlog_insert_location()text获取当前事务日志的插入位置
pg_xlogfile_name_offset(location text)text, integer将事务日志的位置字符串转换为文件名并返回在文件中的字节偏移量
pg_xlogfile_name(location text)text将事务日志的位置字符串转换为文件名
pg_start_backup 接受一个用户定义的备份标签(通常这是备份转储文件存放地点的名字)。这个函数向数据库集群的数据目录写入一个备份标签文件,然后以文本方式返回备份的事务日志起始位置。用户不需要关心这个返回值,提供它只是为了万一需要的场合。
postgres=# select pg_start_backup('label_goes_here');
pg_start_backup
-----------------
0/D4445B8
(1 row)
pg_stop_backup 删除 pg_start_backup 创建的标签文件,并且在事务日志归档区里创建一个备份历史文件。这个历史文件包含给予 pg_start_backup 的标签、备份的事务日志起始与终止位置、备份的起始和终止时间。返回值是备份的事务日志终止位置(同样也可能没有什么用)。计算出中止位置后,当前事务日志的插入点将自动前进到下一个事务日志文件,这样,结束的事务日志文件可以被立即归档从而完成备份。
pg_switch_xlog 移动到下一个事务日志文件,以允许将当前日志文件归档(假定你使用连续归档)。返回值是刚刚完成的事务日志文件的事务日志结束位置。如果自从最后一次事务日志切换以来没有活动的事务日志,那么 pg_switch_xlog 什么事也不做,直接返回前一个事务日志文件的结束位置。
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 仅仅抽取事务日志文件名称。如果给定的事务日志位置恰好位于事务日志文件的交界上,这两个函数都返回前一个事务日志文件的名字。这对于管理事务日志归档来说通常是期望的行为,因为前一个文件是当前最后一个需要归档的文件。
有关正确使用这些函数的细节,参阅节23.3。
表9-48中显示的函数计算数据库对象使用的实际磁盘空间。
表9-48. 数据库对象尺寸函数
名字返回类型描述
pg_column_size(any)int存储一个指定的数值需要的字节数(可能压缩过)
pg_database_size(oid)bigint指定 OID 代表的数据库使用的磁盘空间
pg_database_size(name)bigint指定名称的数据库使用的磁盘空间
pg_relation_size(oid)bigint指定 OID 代表的表或者索引所使用的磁盘空间
pg_relation_size(text)bigint指定名称的表或者索引使用的磁盘空间。表名字可以用模式名修饰。
pg_size_pretty(bigint)text把字节计算的尺寸转换成一个人类易读的尺寸。
pg_tablespace_size(oid)bigint指定 OID 代表的表空间使用的磁盘空间
pg_tablespace_size(name)bigint指定名字的表空间使用的磁盘空间
pg_total_relation_size(oid)bigint指定 OID 代表的表使用的磁盘空间,包括索引和压缩数据。
pg_total_relation_size(text)bigint指定名字的表所使用的全部磁盘空间,包括索引和压缩数据。表名字可以用模式名修饰。
pg_column_size 显示用于存储某个独立数据值的空间。
pg_database_size 和 pg_tablespace_size 接受一个数据库的 OID 或者名字,然后返回该对象使用的全部磁盘空间。
pg_relation_size 接受一个表、索引、压缩表的 OID 或者名字,然后返回它们以字节计的尺寸。
pg_size_pretty 用于把其它函数的结果格式化成一种人类易读的格式,可以根据情况使用KB 、MB 、GB 、TB 。
pg_total_relation_size 接受一个表或者一个压缩表的 OID 或者名称,然后返回以字节计的数据和所有相关的索引和压缩表的尺寸。
表9-49里的函数提供了对数据库服务器所在机器上的文件的本地访问接口。只有那些在数据库集群目录和 log_directory 目录里面的文件可以访问。使用相对路径访问集群目录里面的文件,以及匹配 log_directory 配置设置的路径访问日志文件。只有超级用户才能使用这些函数。
表9-49. 通用文件访问函数
名字返回类型描述
pg_ls_dir(dirname text)setof text列出目录中的文件
pg_read_file(filename text, offset bigint, length bigint)text返回一个文本文件的内容
pg_stat_file(filename text)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;
表9-50中的函数用于管理咨询锁(Advisory Lock)。有关正确使用这些函数的细节,参阅节12.3.4。
表9-50. 咨询锁函数
名字返回类型描述
pg_advisory_lock(key bigint)void获取排它咨询锁
pg_advisory_lock(key1 int, key2 int)void获取排它咨询锁
pg_advisory_lock_shared(key bigint)void获取共享咨询锁
pg_advisory_lock_shared(key1 int, key2 int)void获取共享咨询锁
pg_try_advisory_lock(key bigint)boolean尝试获取排它咨询锁
pg_try_advisory_lock(key1 int, key2 int)boolean尝试获取排它咨询锁
pg_try_advisory_lock_shared(key bigint)boolean尝试获取共享咨询锁
pg_try_advisory_lock_shared(key1 int, key2 int)boolean尝试获取共享咨询锁
pg_advisory_unlock(key bigint)boolean释放排它咨询锁
pg_advisory_unlock(key1 int, key2 int)boolean释放排它咨询锁
pg_advisory_unlock_shared(key bigint)boolean释放共享咨询锁
pg_advisory_unlock_shared(key1 int, key2 int)boolean释放共享咨询锁
pg_advisory_unlock_all()void释放当前会话持有的所有咨询锁
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 将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。