系统管理函数

下表显示了查询和修改运行时配置参数可用的函数。

表.配置设置函数

名字 返回类型 描述
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)

下表里的函数向其他服务器进程发送控制信号,通常这些函数的使用限制为超级用户。

表.服务器信号函数

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

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

pg_cancel_backend 发送一个查询取消信号(SIGINT) 到一个由进程ID 标识的进程。一个活动的后台进程可以从pg_stat_activity视图的 pid列找到,或者在服务器上使用ps列出postgres进程。

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

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

下表里的函数帮助我们进行在线备份。前三个函数仅限于超级用户。

表.备份控制函数

名字 返回类型 描述
pg_switch_xlog() text 强制转向一个新的事务日志文件
pg_current_xlog_location() text 获取当前事务日志的写入位置

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

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

select * from pg_xlogfile_name_offset(pg_stop_backup());
        file_name         | file_offset
--------------------------+-------------
 00000001000000000000000D |     4039624
(1 row)

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

下表里显示的函数计算数据库对象使用的磁盘空间。

数据库对象大小函数

名字 返回类型 描述
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 代表的表使用的磁盘空间,包括索引和TOAST数据
pg_total_relation_size(text) bigint 指定名字的表使用的磁盘空间,包括索引和TOAST数据。表名可以用模式名修饰

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或名字, 并且返回那个表使用的总的在磁盘上的空间,包括所有相关的索引和toast 表。

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

表.通用文件访问函数

名字 返回类型 描述
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;

下表中的函数用于管理咨询锁(Advisory Lock)。 有关正确使用这些函数的细节。

表.咨询锁函数

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