PostgreSQL 9.6.0 文档 | |||
---|---|---|---|
Prev | Up | Chapter 9. 函数和操作符 | Next |
这一节描述的函数被用来控制和监视一个PostgreSQL安装。
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并且其值为true,current_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)
在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_backend
和pg_terminate_backend
向由进程 ID 标识的后端进程发送信号(分别是SIGINT或SIGTERM)。一个活动后端的进程 ID可以从pg_stat_activity视图的pid列中找到,或者通过在服务器上列出postgres进程(在 Unix 上使用ps或者在Windows上使用任务管理器)得到。一个活动后端的角色可以在pg_stat_activity视图的usename列中找到。
pg_reload_conf
给服务器发送一个SIGHUP信号, 导致所有服务器进程重载配置文件。
pg_rotate_logfile
给日志文件管理器发送信号,告诉它立即切换到一个新的输出文件。这个函数只有在内建日志收集器运行时才能工作,因为否则就不存在日志文件管理器子进程。
subprocess.
Table 9-78中展示的函数可以辅助制作在线备份。这些函数不能在恢复期间执行(pg_is_in_backup
、pg_backup_start_time
和pg_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_label和tablespace_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_replication或Table 9-78中其他的函数一起使用来获得复制延迟。
关于正确使用这些函数的细节,请见Section 25.3。
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 的产生率和可用的磁盘空间。
PostgreSQL允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个START TRANSACTION命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。
为了解决这个问题,PostgreSQL允许一个事务导出它正在使用的快照。只要导出的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。
如Table 9-81中所示,快照通过pg_export_snapshot
函数导出,并且通过SET TRANSACTION命令导入。
函数pg_export_snapshot
保存当前的快照并且返回一个text串标识该快照。该字符串必须被传递(到数据库外)给希望导入快照的客户端。直到导出快照的事务的末尾,快照都可以被导入。如果需要,一个事务可以导出多于一个快照。注意这样做只在 READ COMMITTED事务中有用,因为在REPEATABLE READ和更高隔离级别中,事务在它们的生命期中都使用同一个快照。一旦一个事务已经导出了任何快照,它不能使用PREPARE TRANSACTION。
关于如何使用一个已导出快照的细节请见SET TRANSACTION.
Table 9-82中展示的函数 用于控制以及与复制特性交互。有关底层特性的信息请见 Section 26.2.5、 Section 26.2.6以及 Chapter 48。这些函数只限于超级 用户使用。
很多这些函数在复制协议中都有等价的命令,见 Section 51.3。
Section 9.26.3、 Section 9.26.4和 Section 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_lsn和upto_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. |
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_size
和
pg_tablespace_size
接受一个数据库或表空间的 OID 或 名称,
并且返回它们所使用的全部磁盘空间。要使用
pg_database_size
,你必须具有在指定数据库上的
CONNECT权限(默认会被授予)。要使用
pg_tablespace_size
,你必须具有指定表空间上的
CREATE权限,除非它是当前数据库的默认表空间。
pg_relation_size
接受一个表、索引或 TOAST 表的 OID
或者名称,并且返回那个关系的一个分叉所占的磁盘空间的字节尺寸(注意
对于大部分目的,使用更高层的函数pg_total_relation_size
或者pg_table_size
会更方便,它们会合计所有分叉的尺寸)。
如果只得到一个参数,它会返回该关系的主数据分叉的尺寸。提供第二个参数
可以指定要检查哪个分叉:
'main'返回该关系主数据分叉的尺寸。
'fsm'返回与该关系相关的空闲空间映射(见 Section 65.3)的尺寸。
'vm'返回与该关系相关的可见性映射(见 Section 65.4)的尺寸。
'init'返回与该关系相关的初始化分叉(如 果有)的尺寸。
pg_size_pretty
可以用于把其它函数之一的结果格式化成一种人类易读的格式,可以根据情况使用字节、kB、MB、GB 或者 TB。
pg_size_bytes
可以被用来从人类可读格式的字符串得到其中所表示的字节数。其输入可能带有的单位包括字节、kB、MB、GB 或者 TB,并且对输入进行解析时是区分大小写的。如果没有指定单位,会假定单位为字节。
Note: 函数
pg_size_pretty
和pg_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_filepath
与pg_relation_filenode
类似,但是它返回关系的整个文件路径名(相对于数据库集簇的数据目录PGDATA)。
pg_filenode_relation
是pg_relation_filenode
的反向函数。给定一个"tablespace" OID 以及一个 "filenode",它会返回相关关系的 OID。对于一个在数据库的默认表空间中的表,该表空间可以指定为 0。
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.1和Section 63.5。
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_ok为true时把它们包括在内是
有用的,因为可以把一个空目录与一个不存在的目录区分开。
pg_read_file
返回一个文本文件的一部分,从给定的offset开始,返回最多length字节(如果先到达文件末尾则会稍短)。如果offset为负,它相对于文件的末尾。如果offset和length被忽略,整个文件都被返回。从文件中读的字节被使用服务器编码解释成一个字符串;如果它们在编码中不合法则抛出一个错误。
pg_read_binary_file
与pg_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;
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_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
将释放当前会话所持有的所有会话级别咨询锁(这个函数隐式地在会话末尾被调用,即使客户端已经不雅地断开)。
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
相同,不过锁(若果获得)是在当前事务的末尾被自动释放的并且不能被显式释放。