9.26. 系统管理函数

这一节描述的函数被用来控制和监视一个PostgreSQL安装。

9.26.1. 配置设定函数

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

Table 9-76. 配置设定函数

名称返回类型描述
current_setting(setting_name [, missing_ok ]) 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)

如果没有名为setting_name的设置,除非提供missing_ok并且其值为truecurrent_setting会抛出错误。

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.26.2. 服务器信号函数

Table 9-77中展示的函数向其它服务器进程发送控制信号。默认情况下这些函数只能被超级用户使用,但是如果需要,可以利用GRANT把访问特权授予给其他用户。

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

名称返回类型描述
pg_cancel_backend(pid int) boolean取消一个后端的当前查询。如果调用角色是被取消后端的拥有者角色的成员或者调用角色已经被授予pg_signal_backend,这也是允许的,不过只有超级用户才能取消超级用户的后端。
pg_reload_conf() boolean导致服务器进程重载它们的配置文件
pg_rotate_logfile() boolean切换服务器的日志文件
pg_terminate_backend(pid int) boolean中止一个后端。如果调用角色是被取消后端的拥有者角色的成员或者调用角色已经被授予pg_signal_backend,这也是允许的,不过只有超级用户才能取消超级用户的后端。

这些函数中的每一个都在成功时返回true,并且在失败时返回false

pg_cancel_backendpg_terminate_backend向由进程 ID 标识的后端进程发送信号(分别是SIGINTSIGTERM)。一个活动后端的进程 ID可以从pg_stat_activity视图的pid列中找到,或者通过在服务器上列出postgres进程(在 Unix 上使用ps或者在Windows上使用任务管理器)得到。一个活动后端的角色可以在pg_stat_activity视图的usename列中找到。

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

pg_rotate_logfile给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。这个函数只有在内建日志收集器运行时才能工作,因为否则就不存在日志文件管理器子进程。 subprocess.

9.26.3. 备份控制函数

Table 9-78中展示的函数可以辅助制作在线备份。这些函数不能在恢复期间执行(pg_is_in_backuppg_backup_start_timepg_xlog_location_diff除外)。

Table 9-78. 备份控制函数

名称返回类型描述
pg_create_restore_point(name text) pg_lsn为执行恢复创建一个命名点(默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_current_xlog_flush_location() pg_lsn得到当前的事务日志刷写位置
pg_current_xlog_insert_location() pg_lsn获得当前事务日志插入位置
pg_current_xlog_location() pg_lsn获得当前事务日志写入位置
pg_start_backup(label text [, fast boolean [, exclusive boolean ]]) pg_lsn准备执行在线备份(默认只限于超级用户或者复制角色,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_stop_backup() pg_lsn完成执行排他的在线备份(默认只限于超级用户或者复制角色,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_stop_backup(exclusive boolean) setof record结束执行排他或者非排他的在线备份 (默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_is_in_backup() bool如果一个在线排他备份仍在进行中则为真。
pg_backup_start_time() timestamp with time zone获得一个进行中的在线排他备份的开始时间。
pg_switch_xlog() pg_lsn强制切换到一个新的事务日志文件(默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_xlogfile_name(location text) pg_lsn转换事务日志位置字符串为文件名
pg_xlogfile_name_offset(location text) pg_lsn, integer转换事务日志位置字符串为文件名以及文件内的十进制字节偏移
pg_xlog_location_diff(location pg_lsn, location pg_lsn) numeric计算两个事务日志位置间的差别

pg_start_backup接受一个参数,这个参数可以是备份的任意用户定义的标签(通常这是备份转储文件将被存储的名字)。当被用在排他模式中时,该函数向数据库集簇的数据目录写入一个备份标签文件(backup_label)和一个表空间映射文件(tablespace_map,如果在pg_tblspc/目录中有任何链接),执行一个检查点,然后以文本方式返回备份的起始事务日志位置。用户可以忽略这个结果值,但是为了可能需要的场合我们还是提供该值。 当在非排他模式中使用时,这些文件的内容会转而由pg_stop_backup函数返回,并且应该由调用者写入到备份中去。

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创建的tablespace_map文件(如果存在)。在一次非排他备份中,backup_labeltablespace_map的内容会包含在该函数返回的结果中,并且应该被写入到该备份的文件中(这些内容不在数据目录中)。

该函数还在事务日志归档区里创建一个备份历史文件。这个历史文件包含给予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_current_xlog_flush_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_replicationTable 9-78中其他的函数一起使用来获得复制延迟。

关于正确使用这些函数的细节,请见Section 25.3

9.26.4. 恢复控制函数

Table 9-79中展示的函数提供有关后备机当前状态的信息。这些函数可以在恢复或普通运行过程中被执行。

Table 9-79. 恢复信息函数

名称返回类型描述
pg_is_in_recovery() bool如果恢复仍在进行中,为真。
pg_last_xlog_receive_location() pg_lsn获得最后一个收到并由流复制同步到磁盘的事务日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中收到并同步到磁盘的最后一个 WAL 记录。如果流复制被禁用,或者还没有被启动,该函数返回 NULL。
pg_last_xlog_replay_location() pg_lsn获得恢复过程中被重放的最后一个事务日志位置。当流复制在进行中时,这将单调增加。如果恢复已经完成,这将保持静止在恢复过程中被应用的最后一个 WAL 记录。如果服务器被正常启动而没有恢复,该函数返回 NULL。
pg_last_xact_replay_timestamp() timestamp with time zone获得恢复过程中被重放的最后一个事务的时间戳。这是在主机上产生的事务的提交或中止 WAL 记录的时间。如果在恢复过程中没有事务被重放,这个函数返回 NULL。否则,如果恢复仍在进行这将单调增加。如果恢复已经完成,则这个值会保持静止在恢复过程中最后一个被应用的事务。如果服务器被正常启动而没有恢复,该函数返回 NULL。

Table 9-80中展示的函数空值恢复的进程。这些函数只能在恢复过程中被执行。

Table 9-80. 恢复控制函数

名称返回类型描述
pg_is_xlog_replay_paused() bool如果恢复被暂停,为真。
pg_xlog_replay_pause() void立即暂停恢复(默认仅限于超级用户, 但是可以授予其他用户 EXECUTE 特权来执行该函数)。
pg_xlog_replay_resume() void如果恢复被暂停,重启之(默认仅限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数)。

在恢复被暂停时,不会有进一步的数据库改变被应用。如果在热备模式,所有新的查询将看到数据库的同一个一致快照,并且在恢复被继续之前不会有更多查询冲突会产生。

如果流复制被禁用,暂停状态可以无限制地继续而不出问题。在流复制进行时,WAL 记录将继续被接收,最后将会填满可用的磁盘空间,取决于暂停的持续时间、WAL 的产生率和可用的磁盘空间。

9.26.5. 快照同步函数

PostgreSQL允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个START TRANSACTION命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。

为了解决这个问题,PostgreSQL允许一个事务导出它正在使用的快照。只要导出的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。

Table 9-81中所示,快照通过pg_export_snapshot函数导出,并且通过SET TRANSACTION命令导入。

Table 9-81. 快照同步函数

名称返回类型描述
pg_export_snapshot() text保存当前快照并返回它的标识符

函数pg_export_snapshot保存当前的快照并且返回一个text串标识该快照。该字符串必须被传递(到数据库外)给希望导入快照的客户端。直到导出快照的事务的末尾,快照都可以被导入。如果需要,一个事务可以导出多于一个快照。注意这样做只在 READ COMMITTED事务中有用,因为在REPEATABLE READ和更高隔离级别中,事务在它们的生命期中都使用同一个快照。一旦一个事务已经导出了任何快照,它不能使用PREPARE TRANSACTION

关于如何使用一个已导出快照的细节请见SET TRANSACTION.

9.26.6. 复制函数

Table 9-82中展示的函数 用于控制以及与复制特性交互。有关底层特性的信息请见 Section 26.2.5Section 26.2.6以及 Chapter 48。这些函数只限于超级 用户使用。

很多这些函数在复制协议中都有等价的命令,见 Section 51.3

Section 9.26.3Section 9.26.4Section 9.26.5 中描述的函数也与复制相关。

Table 9-82. 复制 SQL 函数

函数返回类型描述
pg_create_physical_replication_slot(slot_name name [, immediately_reserve boolean ]) (slot_name name, xlog_position pg_lsn) 创建一个新的名为slot_name的物理复制槽。第二个参数是可选的,当它为true时,立即为这个物理槽指定要被保留的LSN。否则该LSN会被保留在来自一个流复制客户端的第一个连接上。来自一个物理槽的流改变只可能出现在使用流复制协议时 — 见Section 51.3。这个函数对应于复制协议命令CREATE_REPLICATION_SLOT ... PHYSICAL
pg_drop_replication_slot(slot_name name) void 丢弃名为slot_name的物理或逻辑复制槽。 和复制协议命令DROP_REPLICATION_SLOT相同。
pg_create_logical_replication_slot(slot_name name, plugin name) (slot_name name, xlog_position pg_lsn) 使用输出插件plugin创建一个名为 slot_name的新逻辑(解码)复制槽。 对这个函数的调用与复制协议命令 CREATE_REPLICATION_SLOT ... LOGICAL具有相同的效果。
pg_logical_slot_get_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[]) (location pg_lsn, xid xid, data text) 返回槽slot_name中的改变,从上一次已经被消费的点开始返回。 如果upto_lsnupto_nchanges为 NULL,逻辑解码将一 直继续到 WAL 的末尾。如果upto_lsn为非 NULL,解码将只包括那些在指 定 LSN 之前提交的事务。如果upto_nchanges为非 NULL, 解码将在其产生的行数超过指定值后停止。不过要注意, 被返回的实际行数可能更大,因为对这个限制的检查只会在增加了解码每个新的提交事务产生 的行之后进行。
pg_logical_slot_peek_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[]) (location text, xid xid, data text) 行为就像pg_logical_slot_get_changes()函数, 不过改变不会被消费, 即在未来的调用中还会返回这些改变。
pg_logical_slot_get_binary_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[]) (location pg_lsn, xid xid, data bytea) 行为就像pg_logical_slot_get_changes()函数, 不过改变会以bytea返回。
pg_logical_slot_peek_binary_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[]) (location pg_lsn, xid xid, data bytea) 行为就像pg_logical_slot_get_changes()函数, 不过改变会以bytea返回并且这些改变不会被消费, 即在未来的调用中还会返回这些改变。
pg_replication_origin_create(node_name text) oid 用给定的外部名称创建一个复制源,并且返回分配给它的内部 id。
pg_replication_origin_drop(node_name text) void 删除一个之前创建的复制源,包括任何相关的重放进度。
pg_replication_origin_oid(node_name text) oid 用名称查找复制源并且返回内部 id。如果没有找到则抛出错误。
pg_replication_origin_session_setup(node_name text) void 把当前会话标记为正在从给定的源进行重放,允许重放进度被跟踪。使用 pg_replication_origin_session_reset可以取消 标记。只有之前没有源被配置时才能使用。
pg_replication_origin_session_reset() void 取消pg_replication_origin_session_setup()的效果。
pg_replication_origin_session_is_setup() bool 当前会话中是否已经配置了一个复制源?
pg_replication_origin_session_progress(flush bool) pg_lsn 返回当前会话中配置的复制源的重放位置。参数 flush决定对应的本地事务是否被确保 已经刷入磁盘。
pg_replication_origin_xact_setup(origin_lsn pg_lsn, origin_timestamp timestamptz) void 标记当前事务为正在重放一个已经在给定的LSN 和时间戳提交的事务。只有当之前已经用 pg_replication_origin_session_setup()配置过 一个复制源时才能被调用。
pg_replication_origin_xact_reset() void 取消pg_replication_origin_xact_setup()的效果。
pg_replication_origin_advance(node_name text, pos pg_lsn) void 把给定节点的复制进度设置为给定的位置。这主要用于配置更改或者类似 操作之后设置初始位置或者新位置。注意这个函数的不当使用可能会导致 不一致的复制数据。
pg_replication_origin_progress(node_name text, flush bool) pg_lsn 返回给定复制元的重放位置。参数 flush决定对应的本地事务是否被确保 已经刷入磁盘。
pg_logical_emit_message(transactional bool, prefix text, content text) pg_lsn 发出文本形式的逻辑解码消息。这可以被用来通过 WAL 向逻辑解码插件传递一般消息。参数transactional指定该消息是否应该是当前事务的一部分或者当逻辑解码读到该记录时该消息是否应该被立刻写入并且解码。prefix是逻辑解码插件用来识别它们感兴趣的消息的文本前缀。content是消息的文本。
pg_logical_emit_message(transactional bool, prefix text, content bytea) pg_lsn Emit binary logical decoding message. This can be used to pass generic messages to logical decoding plugins through WAL. The parameter transactional specifies if the message should be part of current transaction or if it should be written immediately and decoded as soon as the logical decoding reads the record. The prefix is textual prefix used by the logical decoding plugins to easily recognize interesting messages for them. The content is the binary content of the message.

9.26.7. 数据库对象管理函数

Table 9-83中展示的函数计算数据库对象使用的磁盘空间。

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

名称返回类型描述
pg_column_size(any)int存储一个特定值(可能压缩过)所需的字节数
pg_database_size(oid) bigint指定 OID 的数据库使用的磁盘空间
pg_database_size(name) bigint指定名称的数据库使用的磁盘空间
pg_indexes_size(regclass) bigint 附加到指定表的索引所占的总磁盘空间
pg_relation_size(relation regclass, fork text) bigint 指定表或索引的指定分叉('main''fsm''vm''init')使用的磁盘空间
pg_relation_size(relation regclass) bigint pg_relation_size(..., 'main')的简写
pg_size_bytes(text) bigint 把人类可读格式的带有单位的尺寸转换成字节数
pg_size_pretty(bigint) text 将表示成一个 64位整数的字节尺寸转换为带尺寸单位的人类可读格式
pg_size_pretty(numeric) text 将表示成一个数字值的字节尺寸转换为带尺寸单位的人类可读格式
pg_table_size(regclass) bigint 被指定表使用的磁盘空间,排除索引(但包括 TOAST、空闲空间映射和可见性映射)
pg_tablespace_size(oid) bigint指定 OID 的表空间使用的磁盘空间
pg_tablespace_size(name) bigint指定名称的表空间使用的磁盘空间
pg_total_relation_size(regclass) 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_sizepg_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。

pg_size_bytes可以被用来从人类可读格式的字符串得到其中所表示的字节数。其输入可能带有的单位包括字节、kB、MB、GB 或者 TB,并且对输入进行解析时是区分大小写的。如果没有指定单位,会假定单位为字节。

Note: 函数pg_size_prettypg_size_bytes所使用的单位 kB、MB、GB 和 TB 是用 2 的幂而不是 10 的幂来定义,因此 1kB 是 1024 字节,1MB 是 10242 = 1048576 字节,以此类推。

上述操作表和索引的函数接受一个regclass参数,它是该表或索引在pg_class系统目录中的 OID。你不必手工去查找该 OID,因为regclass数据类型的输入转换器会为你代劳。只写包围在单引号内的表名,这样它看起来像一个文字常量。为了与普通SQL名称的处理相兼容,该字符串将被转换为小写形式,除非其中在表名周围包含双引号。

如果一个 OID 不表示一个已有的对象并且被作为参数传递给了上述函数,将会返回 NULL。

Table 9-84中展示的函数帮助标识数据库对象相关的磁盘文件。

Table 9-84. 数据库对象定位函数

名称返回类型描述
pg_relation_filenode(relation regclass) oid 指定关系的文件结点号
pg_relation_filepath(relation regclass) text 指定关系的文件路径名
pg_filenode_relation(tablespace oid, filenode oid) regclass 查找与给定的表空间和文件节点相关的关系

pg_relation_filenode接受一个表、索引、序列或 TOAST 表的 OID 或名称,返回当前分配给它的"filenode"号。文件结点是关系的文件名的基本组件(详见Section 65.1)。对于大多数表结果和pg_class.relfilenode相同,但是对于某些系统目录relfilenode为零,并且必须使用此函数获取正确的值。 如果传递一个没有存储的关系(如视图),此函数将返回 NULL。

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

pg_filenode_relationpg_relation_filenode的反向函数。给定一个"tablespace" OID 以及一个 "filenode",它会返回相关关系的 OID。对于一个在数据库的默认表空间中的表,该表空间可以指定为 0。

9.26.8. 索引维护函数

Table 9-85展示了可用于 索引维护任务的函数。这些函数不能在恢复期间执行。只有超级用户以及给定索引的拥有者才能是用这些函数。

Table 9-85. 索引维护函数

名称返回类型描述
brin_summarize_new_values(index regclass) integer汇总还没有被汇总的页面范围
gin_clean_pending_list(index regclass) bigint把 GIN 待处理列表项移动到主索引结构中

brin_summarize_new_values接收一个 BRIN 索引的 OID 或者名称作为参数并且检查该索引以找到基表中当前还没有被该索引汇总的页面范围。对任意一个这样的范围,它将通过扫描那些表页面创建一个新的摘要索引元组。它会返回被插入到该索引的新页面范围摘要的数量。

gin_clean_pending_list接受一个 GIN 索引的 OID 或者名字,并且通过把指定索引的待处理列表中的项批量移动到主 GIN 数据结构来清理该索引的待处理列表。它会返回从待处理列表中移除的页数。注意如果其参数是一个禁用fastupdate选项构建的 GIN 索引,那么不会做清理并且返回值为 0,因为该索引根本没有待处理列表。有关待处理列表和fastupdate选项的细节请见Section 63.4.1Section 63.5

9.26.9. 通用文件访问函数

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

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

名称返回类型描述
pg_ls_dir(dirname text [, missing_ok boolean, include_dot_dirs boolean]) setof text列出目录中的内容
pg_read_file(filename text [, offset bigint, length bigint [, missing_ok boolean] ]) text返回一个文本文件的内容
pg_read_binary_file(filename text [, offset bigint, length bigint [, missing_ok boolean] ]) bytea返回一个文件的内容
pg_stat_file(filename text[, missing_ok boolean]) record返回关于一个文件的信息

所有这些函数都有一个可选的missing_ok参数, 它指定文件或者目录不存在时的行为。如果为true, 函数会返回 NULL (pg_ls_dir除外,它返回一个空 结果集)。如果为false,则发生一个错误。默认是 false

pg_ls_dir返回指定目录中所有文件(以及目录和其他特殊文件) 的名称。include_dot_dirs指示结果集中是否包括 "."".."。默认是排除它们(false),但是 当missing_oktrue时把它们包括在内是 有用的,因为可以把一个空目录与一个不存在的目录区分开。

pg_read_file返回一个文本文件的一部分,从给定的offset开始,返回最多length字节(如果先到达文件末尾则会稍短)。如果offset为负,它相对于文件的末尾。如果offsetlength被忽略,整个文件都被返回。从文件中读的字节被使用服务器编码解释成一个字符串;如果它们在编码中不合法则抛出一个错误。

pg_read_binary_filepg_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.26.10. 咨询锁函数

Table 9-87中展示的函数管理咨询锁。有关正确使用这些函数的细节请参考Section 13.3.5

Table 9-87. 咨询锁函数

名称返回类型描述
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_advisory_unlock(key bigint) boolean释放一个排他会话级别咨询锁
pg_advisory_unlock(key1 int, key2 int) boolean释放一个排他会话级别咨询锁
pg_advisory_unlock_all() void释放当前会话持有的所有会话级别咨询锁
pg_advisory_unlock_shared(key bigint) boolean释放一个共享会话级别咨询锁
pg_advisory_unlock_shared(key1 int, key2 int) boolean释放一个共享会话级别咨询锁
pg_advisory_xact_lock(key bigint) void获得排他事务级别咨询锁
pg_advisory_xact_lock(key1 int, key2 int) void获得排他事务级别咨询锁
pg_advisory_xact_lock_shared(key bigint) void获得共享事务级别咨询锁
pg_advisory_xact_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_try_advisory_xact_lock(key bigint) boolean如果可能,获得排他事务级别咨询锁
pg_try_advisory_xact_lock(key1 int, key2 int) boolean如果可能,获得排他事务级别咨询锁
pg_try_advisory_xact_lock_shared(key bigint) boolean如果可能,获得共享事务级别咨询锁
pg_try_advisory_xact_lock_shared(key1 int, key2 int) boolean如果可能,获得共享事务级别咨询锁

pg_advisory_lock锁住一个应用定义的资源,可以使用一个单一64位键值或两个32位键值标识(注意这些两个键空间不重叠)。如果另一个会话已经在同一个资源标识符上持有了一个锁,这个函数将等待直到该资源变成可用。该锁是排他的。多个锁请求会入栈,因此如果同一个资源被锁住三次,则它必须被解锁三次来被释放给其他会话使用。

pg_advisory_lock_shared的工作和pg_advisory_lock相同,不过该锁可以与其他请求共享锁的会话共享。只有想要排他的锁请求会被排除。

pg_try_advisory_lockpg_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相同,不过锁(若果获得)是在当前事务的末尾被自动释放的并且不能被显式释放。