Postgresql日志系统的实现(八)

本文详细介绍了PostgreSQL中事务故障、系统故障及介质故障的恢复流程。对于事务故障,由于多版本并发控制机制,通常无需特别恢复;而系统故障和介质故障则通过调用startupxlog函数进行恢复,并根据不同的系统状态采取相应的恢复措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.3.3针对各类故障进行恢复的流程

1.3.3.1事务故障

PG中使用多版本并发存储数据,所以发生事务故障时,不需要进行恢复,DBMS只读取有效数据,数据库仍处于一致状态。

1.3.3.2系统故障和介质故障的恢复

系统故障和介质故障调用的是同一个函数入口:startupxlog(),可以在reference图中找到上下调用关系:

StartupXLOG
    InitPostgres
    StartupProcessMain
        AuxiliaryProcessMain
            main
            SubPostmasterMain
                main


调用startupxlog()进行系统和介质故障恢复的流程:

1.首先,读控制文件,得知系统状态。

系统状态分为几种情况:

    DB_STARTUP                  //系统启动中

    DB_SHUTDOWNED               //系统正常关闭

    DB_SHUTDOWNING              //系统正在关闭,通常用于“CreateCheckPoint”开始处,先把系统状态置为“DB_SHUTDOWNING”,然后执行创建checkpoint的操作,到结束创建checkpoint的尾部,再把系统状态置为“DB_SHUTDOWNED

    DB_IN_CRASH_RECOVERY        //系统在恢复状态时发生过“crash”,需要从上一次备份中恢复被毁坏的数据

    DB_IN_ARCHIVE_RECOVERY      //系统在归档状态时发生过“crash”,需要从更早的备份中恢复数据

    DB_IN_PRODUCTION            //系统恢复完毕,置系统状态为运行处理事务

 

### PostgreSQL Logger 系统日志进程的工作原理与配置 #### 工作原理概述 Logger系统日志进程负责收集来自`postmaster`进程、服务进程以及其他辅助进程的标准错误输出(stderr),并将这些数据写入到指定的日志文件中。这一过程由`SysLogger`子系统实现,其核心功能在于集中化管理和处理日志信息[^1]。 具体而言,当数据库运行过程中发生任何事件时,相关的信息会被发送至标准错误流。随后,`SysLogger`会捕获这些信息并将其持久化存储于磁盘上的日志文件中。这种机制不仅简化了日志管理流程,还提高了系统的可维护性和诊断能力。 #### 启动入口与初始化逻辑 `SysLogger`的启动是由主控进程`postmaster`完成的。一旦检测到参数`logging_collector`被设置为`on`,则会在服务器启动期间创建一个独立的`syslogger`进程来专门执行日志收集任务[^2]。此进程在整个生命周期内持续监听其他后台进程产生的日志消息,并按照预定义规则进行分类和保存。 #### 主要配置项及其作用 以下是几个常用的日志配置选项: - **`logging_collector`**: 控制是否启用日志收集器,默认关闭(`off`);如果希望利用内置的日志管理系统,则需显式设定为开启状态(`on`)。 - **`log_directory` & `log_filename`**: 定义日志文件所在的目录路径以及命名模式。例如,可以采用日期作为变量动态生成每日新日志文件名,如`postgresql-%Y-%m-%d.log`表示按年月日记录不同天数的数据[^3]。 - **`log_truncate_on_rotation`**: 当达到轮转条件(时间或者大小限制)时,决定是否清空现有旧日志内容再重新开始记录新的条目。 - **`log_rotation_age` 和 `log_rotation_size`**: 设置单个日志文件的最大存续时间和最大体积阈值,超过任一限定都会触发自动分割操作形成多个分片文件以便长期保留历史记录的同时保持高效访问性能。 ```sql -- 查看当前活动连接的状态信息示例查询语句 SELECT * FROM pg_stat_activity; ``` 上述SQL命令可用于监控实时在线用户的各项指标详情,包括但不限于所属数据库名称(datname)、客户端IP地址(client_addr)等字段展示各个session的具体行为特征。 #### 日志版本差异对比 值得注意的是,在PostgreSQL 10.0之前的发行版里,默认情况下所有类型的日志均统一放置在同一位置下;而自该版本起引入了一种更为灵活的新架构——允许区分对待各类别的日志类别分别存放于不同的子文件夹之中从而便于后续检索分析工作开展得更加便捷有效率[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值