PG守护进程(Postmaster)——PostgreSQL 12恢复配置总结

PostgreSQL V12中没有了recovery.conf。从向后兼容的观点来看,PostgreSQL v12中最大的变化是recovery.conf文件中的参数放到了postgresql.conf配置文件中

本文主要介绍他们的变化以及如何适应。

放弃recovery.conf

在PG12以前,如果数据目录存在recovery.conf文件,当PG实例启动时将进入恢复模式(recovery或standby),该文件包含了用于配置恢复的所有参数,例如:
standby_mode:确定这是正常的归档恢复还是standby模式
restore_command:此命令恢复已归档的WAL段
recovery_target*:此参数确定要恢复到的点
primary_conninfo:如何连接到流复制主服务器
长期以来,recovery.conf一直被认为是一个缺陷,因为配置参数分布在多个不同的文件中是不合理的,另外还不能使用ALTER SYSTEM命令对参数进行修改。

从v12开始,针对此问题进行了改进,把recovery.conf中的参数合到了postgresql.conf配置文件中,但在非恢复模式这些参数将被忽略。这个修改对PG新手来说更加的自然,但是对PG老油条估计得适应以下方面。

如何告诉PostgreSQL进入恢复模式?

在PG12以前,recovery.conf该文件的存在即触发恢复模式。
从PG12开始,由于该文件不存在,由下面两个新文件进行替换:

recovery.signal:告诉PostgreSQL进入正常的归档恢复
standby.signal:告诉PostgreSQL进入standby模式

如果两个文件都存在,则standby.signal优先。这些文件不需要包含任何数据,存在的任何数据将被忽略,只要存在就有意义。如果提升了备用数据库,则将完全删除standby.signal(而不是像recovery.conf那样重命名,变成recovery.done)。同样,如果正在进行时间点恢复,则一旦达到恢复目标,recovery.signal将被删除(除非将recovery_target_action设置为shutdown)。请注意:与recovery.conf一样,目录中缺少这些文件将导致PostgreSQL实例立即作为主实例启动,无论postgresql.conf是否包含复制配置。

恢复参数有哪些变化?

先前存储在recovery.conf中的恢复配置参数大部分没有变化,但以下情况除外。
standby_mode:先前的参数standby_mode已被删除,并已由上述standby.signal和recovery.signal文件代替。
trigger_file:参数trigger_file已重命名为promote_trigger_file。
在PG12以前,要将更改应用于recovery.conf,需要完全重启服务器。尽管这对PG12及以上版本也是正确的,但是现在可以通过SIGHUP更改以下恢复配置项:
archive_cleanup_command
promote_trigger_file
recovery_end_command
recovery_min_apply_delay
以下查询列出了所有以前的recovery.conf参数:

SELECT name,
       setting,
       category,
       short_desc,
       CONTEXT,
       pending_restart
  FROM pg_catalog.pg_settings
 WHERE category IN('Write-Ahead Log / Archive Recovery', 'Write-Ahead Log / Recovery Target')
    OR name IN ('primary_conninfo', 'primary_slot_name', 'promote_trigger_file', 'recovery_min_apply_delay')
 ORDER BY category,
          name;

恢复完成后参数会发生什么变化?

在PG12以前,恢复完成,recovery.conf被重命名为recovery.done,这有效地删除了恢复参数。
从PG12开始,恢复完成后将删除recovery.signal或standby.signal文件,但其中的参数postgresql.conf仍然保留。只要PostgreSQL不在恢复中,它们就会被忽略,但是最好用“#”注释禁用它们。这样可以避免以后出现令人讨厌的意外情况,例如在创建备用服务器时。
如果需要设置这些恢复参数建议使用ALTER SYSTEM,如果需要重置它们建议使用ALTER SYSTEM RESET。

在使用pg_basebackup工具时,如果使用了"–write-recovery-conf"选项会怎样?

在PG12中,选项仍然存在,但是它不再是创建recovery.conf文件,而是添加恢复配置参数。
与其将参数添加到postgresql.conf,不如和ALTER SYSTEM一样将其添加到postgresql.auto.conf。

如果我在PG12中使用recovery.conf进行恢复会发生什么?

PostgreSQL 12数据目录中的存在recovery.conf,将导致PostgreSQL实例拒绝启动,并出现以下错误:
FATAL: using recovery command file “recovery.conf” is not supported

如何调整我的备份脚本?

备份不受更改的影响。因此,您的备份脚本无需修改。
执行归档恢复或设置备用服务器的脚本必须进行修改。主要困难将是添加必要的恢复参数。
我的建议是将参数添加到postgresql.auto.conf,因为如前所述,该文件是为自动编辑而制作的。
这是bash要添加的一些示例代码recovery_target_time:

sed -i "/^recovery_target/d" $PGDATA/postgresql.auto.conf
sed -i "$ a recovery_target_time = '2020-05-19 13:00:00'" $PGDATA/postgresql.auto.conf

首先删除所有以"recovery_target"开头的选项,然后添加参数。
启动服务器之前,请不要忘记执行以下操作:
touch $PGDATA/recovery.signal
我建议您在恢复完成后再次删除恢复参数。

我正在使用一些第三方备份软件-我该怎么办?

到现在为止,任何值得其使用的专用PostgreSQL备份软件都应该已经适应了这些更改,升级到当前版本。
PostgreSQL v12对最广泛使用的程序的支持:
pgBackRest:支持2.18版以上的v12
pg_probackup:支持从2.2.5版本开始的v12
Barman:支持2.9版以上的v12

有哪些需要注意的事项?

从表面上看,与管理其它参数一样,但是在行为上发生了一些潜在的改变。

  • ALTER SYSTEM设置始终优先处理
    如果恢复设置存储在postgresql.conf中,并且有人通过执行ALTER SYSTEM来更改设置,则ALTER SYSTEM设置的参数(并写入postgresql.auto.conf)将始终优先。如果随后尝试更新postgresql.conf中的复制设置,并且未考虑设置也可能存在于postgresql.auto.conf中的可能性,则可能引起混乱,这也是上面再三建议写入postgresql.auto.conf文件
  • 恢复配置设置甚至可以在主服务器上出现
    任何已配置的恢复配置设置(例如primary_conninfo)都将由PostgreSQL读取,并且可以正常显示,但是它们的存在并不表示该节点是否为备节点。
  • 没有固定的位置可以配置恢复参数
    众所周知recovery.conf只有一个文件,可以写入恢复设置,这可以确保在服务器启动时可以读取它们。但从PG12开始,恢复设置可以位于具有常规PostgreSQL配置文件的任何位置。由于最后读取的配置参数具有优先权,因此有可能会忽略前面的参数,并且使用错误的设置会错误地启动PostgreSQL。编写恢复配置设置(例如pg_basebackup或repmgr)并且需要确保最后读取这些设置,因此需要将它们添加到postgresql.auto.conf文件中。
  • 信号文件混乱的风险
    由于已将standby_mode参数替换为创建两个信号文件之一,并且由于standby.signal的优先级高于recovery.signal,因此存在需要恢复时,设置了recovery.signal,但同时存在standby.signal文件导致恢复错误。
  • 只能指定recovery_target类中的一个参数
    如果PostgreSQL配置中存在多个recovery_target\recovery_target_lsn\recovery_target_name\recovery_target_time\recovery_target_xid之一,则实例将发出致命错误在启动时:
    FATAL: multiple recovery targets specified
    DETAIL: At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set.
    在PG12以前,使用这些参数中的最后一个,而忽略了之前的参数。
<think>好的,我现在要处理用户关于PostgreSQLpostmaster进程的询问。首先,我需要仔细阅读用户提供的引用内容,确保准确理解每个引用中的信息,以便能够正确回答用户的问题。 用户的问题是关于postmaster进程的功能、启动和管理。根据提供的引用,我需要整合不同引用中的信息,确保覆盖所有关键点。引用[1]提到postmasterPostgreSQL最重要的进程,负责初始化系统、管理连接和后台进程。引用[2]进一步说明postmaster和postgres进程的关系,以及postmaster监听连接并分配服务进程。引用[4]详细描述了postmaster作为总控进程,处理客户端连接时的身份验证,并fork子进程。引用[3]和[5]补充了启动方式和管理流程。 接下来,我需要组织这些信息,按照功能、启动和管理三个方面来结构化回答。首先,功能方面要包括初始化系统、连接管理、进程管理、关闭数据库。启动部分需要说明如何通过命令启动,比如使用pg_ctl或者直接运行postgres。管理方面要涉及配置文件的加载、信号处理和监控工具的使用。 另外,用户可能希望了解如何操作这些功能,比如如何启动或停止postmaster,如何配置监听地址等。需要确保回答中包含具体的命令示例,如pg_ctl start -D /data,或者修改postgresql.conf中的listen_addresses。 还要检查是否有遗漏的信息,比如子进程的类型(如后台工作进程、服务进程等),以及postmaster与其他进程的关系。同时,注意引用标注的正确性,每个关键点后面都要加上对应的引用标记,如[^1][^4]等。 最后,生成相关问题时要围绕postmaster的功能扩展,例如启动失败处理、与子进程的交互、配置参数、监控方法以及安全性相关的身份验证机制。确保问题具有针对性,能够引导用户进一步学习相关主题。</think>### PostgreSQL postmaster 进程功能与管理的分步说明 #### 一、核心功能解析 1. **系统初始化与资源分配** postmaster数据库实例的总控进程,负责初始化共享内存、预加载常用数据结构和后台进程池。启动时会执行以下操作: ```bash # 典型启动命令(通过pg_ctl间接调用) pg_ctl start -D /data/postgresql ``` 该进程会创建共享缓冲区、WAL日志缓冲区和锁管理器等核心组件[^2][^5]。 2. **连接管理与进程派生** 监听`postgresql.conf`中定义的端口(默认5432),采用"每连接一进程"模型。当客户端发起连接时: ```sql SELECT * FROM pg_stat_activity; -- 查看当前活跃进程 ``` 通过身份验证后,postmaster会调用`fork()`创建专属的postgres子进程[^4]。该设计保证了会话隔离性,但高并发时需注意资源消耗。 3. **进程生命周期管理** 维护进程树结构,监控所有子进程状态。当检测到子进程异常终止时,会自动进行清理并记录日志。通过信号机制实现控制: ```bash kill -SIGTERM `head -1 /data/postgresql/postmaster.pid` # 优雅关闭 ``` #### 二、启动过程深度解析 1. **多阶段启动流程** 通过`PostmasterMain()`函数执行分层初始化: ```c /* 伪代码示例 */ void PostmasterMain() { read_configurations(); // 解析配置文件 setup_shared_memory(); // 分配共享内存 start_auxiliary_processes(); // 启动后台进程 enter_main_loop(); // 进入事件循环 } ``` 该过程会依次启动checkpointer、background writer等关键后台进程[^3][^5]。 2. **配置参数影响** 关键启动参数示例: ```ini listen_addresses = '*' # 监听所有IP max_connections = 100 # 最大连接数 autovacuum_max_workers = 3 # 自动清理进程数 ``` 修改配置后需执行`pg_ctl reload`通知postmaster重新加载。 #### 三、高级管理技巧 1. **多实例管理** 通过不同数据目录运行多个postmaster实例: ```bash initdb -D /data/pg_instance2 postgres -D /data/pg_instance2 -p 5433 ``` 2. **故障排查工具** 使用`strace`跟踪系统调用: ```bash strace -f -p $(head -1 postmaster.pid) # 跟踪主进程及子进程 ``` 3. **内存优化实践** 调整共享缓冲区大小(建议为总内存的25%): ```ini shared_buffers = 4GB ``` #### 四、性能指标监控 关键监控项及其SQL查询: ```sql SELECT (SELECT count(*) FROM pg_stat_activity) as active_connections, (SELECT checkpoints_timed FROM pg_stat_bgwriter) as regular_checkpoints, pg_size_pretty(pg_database_size(current_database())) as db_size; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值