合 PG之系统管理函数
系统管理函数
1. 配置设定函数
表 9.77展示了那些可以用于查询以及修改运行时配置参数的函数。
表 9.77. 配置设定函数
名称 | 返回类型 | 描述 |
---|---|---|
current_setting(* setting_name* [, * missing_ok* ]) | text | 获得设置的当前值 |
set_config(* setting_name*, * new_value*, * is_local*) | text | 设置一个参数并返回新值 |
current_setting
得到setting_name
设置的当前值。它对应于SQL命令SHOW
。一个例子:
1 2 3 4 5 6 | 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
。例如:
1 2 3 4 5 6 | SELECT set_config('log_statement_stats', 'off', false); set_config ------------ off (1 row) |
2. 服务器信号函数
在表 9.78中展示的函数向其它服务器进程发送控制信号。默认情况下这些函数只能被超级用户使用,但是如果需要,可以利用GRANT
把访问特权授予给其他用户。
表 9.78. 服务器信号函数
名称 | 返回类型 | 描述 |
---|---|---|
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.
3. 备份控制函数
表 9.79中展示的函数可以辅助制作在线备份。这些函数不能在恢复期间执行(pg_is_in_backup
、pg_backup_start_time
和pg_wal_lsn_diff
除外)。
表 9.79. 备份控制函数
名称 | 返回类型 | 描述 |
---|---|---|
pg_create_restore_point(* name* text) | pg_lsn | 为执行恢复创建一个命名点(默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数) |
pg_current_wal_flush_lsn() | pg_lsn | 得到当前的预写式日志刷写位置 |
pg_current_wal_insert_lsn() | pg_lsn | 获得当前预写式日志插入位置 |
pg_current_wal_lsn() | 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_wal() | pg_lsn | 强制切换到一个新的预写式日志文件(默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数) |
pg_walfile_name(* lsn* text) | pg_lsn | 转换预写式日志位置字符串为文件名 |
pg_walfile_name_offset(* lsn* text) | pg_lsn , integer | 转换预写式日志位置字符串为文件名以及文件内的十进制字节偏移 |
pg_wal_lsn_diff(* lsn* pg_lsn, * lsn* pg_lsn) | numeric | 计算两个预写式日志位置间的差别 |
pg_start_backup
接受一个参数,这个参数可以是备份的任意用户定义的标签(通常这是备份转储文件将被存储的名字)。当被用在排他模式中时,该函数向数据库集簇的数据目录写入一个备份标签文件(backup_label
)和一个表空间映射文件(tablespace_map
,如果在pg_tblspc/
目录中有任何链接),执行一个检查点,然后以文本方式返回备份的起始预写式日志位置。用户可以忽略这个结果值,但是为了可能需要的场合我们还是提供该值。 当在非排他模式中使用时,这些文件的内容会转而由pg_stop_backup
函数返回,并且应该由调用者写入到备份中去。
1 2 3 4 5 | 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
的内容会包含在该函数返回的结果中,并且应该被写入到该备份的文件中(这些内容不在数据目录中)。有一个可选的boolean
类型的第二参数。如果为假,pg_stop_backup
将在备份完成后立即返回而不等待WAL被归档。这种行为仅对独立监控WAL归档的备份软件有用。否则,让备份一致所要求的WAL可能会丢失,进而让备份变得毫无用处。当这个参数被设置为真时,在启用归档的前提下pg_stop_backup
将等待WAL被归档,在后备服务器上,这意味只有archive_mode = always
时才会等待。如果主服务器上的写活动很低,在主服务器上运行pg_switch_wal
以触发一次即刻的段切换会很有用。
当在主服务器上执行时,该函数还在预写式日志归档区里创建一个备份历史文件。这个历史文件包含给予pg_start_backup
的标签、备份的起始与终止预写式日志位置以及备份的起始和终止时间。返回值是备份的终止预写式日志位置(同样也可以被忽略)。在记录结束位置之后,当前预写式日志插入点被自动地推进到下一个预写式日志文件,这样结束的预写式日志文件可以立即被归档来结束备份。
pg_switch_wal
移动到下一个预写式日志文件,允许当前文件被归档(假定你正在使用连续归档)。返回值是在甘冈完成的预写式日志文件中结束预写式日志位置 + 1。如果从上一次预写式日志切换依赖没有预写式日志活动,pg_switch_wal
不会做任何事情并且返回当前正在使用的预写式日志文件的开始位置。
pg_create_restore_point
创建一个命名预写式日志记录,它可以被用作恢复目标,并且返回相应的预写式日志位置。这个给定的名字可以用于recovery_target_name来指定恢复要进行到的点。避免使用同一个名称创建多个恢复点,因为恢复会停止在第一个匹配名称的恢复目标。
pg_current_wal_lsn
以上述函数所使用的相同格式显示当前预写式日志的写位置。类似地,pg_current_wal_insert_lsn
显示当前预写式日志插入点,而pg_current_wal_flush_lsn
显示当前预写式日志的刷写点。在任何情况下,插入点是预写式日志的“逻辑”终止点,而写入位置是已经实际从服务器内部缓冲区写出的日志的终止点,刷写位置则是被确保写入到持久存储中的日志的终止点。写入位置是可以从服务器外部检查的终止点,对那些关注归档部分完成预写式日志文件的人来说,这就是他们需要的位置。插入和刷写点主要是为了服务器调试目的而存在的。这些都是只读操作并且不需要超级用户权限。
你可以使用pg_walfile_name_offset
从任何上述函数的结果中抽取相应的预写式日志文件名称以及字节偏移。例如: