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