Postgresql日志系统的实现(二)

本文介绍PostgreSQL中的即时恢复(PITR)机制及时间线概念,详细解释如何利用预写日志(WAL)恢复数据库到任意所需状态,并探讨时间线在恢复过程中避免混乱的作用。

1.2   即时恢复(PITR)与时间线

在任何时候,PostgreSQL 都在集群的数据目录的 pg_xlog/ 子目录里维护着一套预写日志(WAL)。 这些日志记录着每一次对数据库的数据文件的修改的细节。包括某事务插入日志前那一刻的系统时间信息。这个时间信息的存在,使得可以在恢复时,基本上可以指定崩溃前的任何时刻进行恢复。这就是:

即时恢复: 我们可以把数据库恢复到你开始备份以来的任意时刻的状态。

 

另外,PostgreSQL 有个叫时间线的概念。是用于恢复阶段的。可以把恢复的到达点和系统继续运行后又记载的信息区分开,以利于防止再发生崩溃后进行的恢复。

每次即时恢复到一个比 WAL 序列的结尾要早的时刻,那么就创建一个新的时间线, 以表示在该次恢复之后生成的 WAL 记录(不过,如果恢复动作一直处理到 WAL 的结尾, 我们就不会开始一个新的时间线:我们只是扩展现有那个)。时间线 ID 号是 WAL 段文件名的一部分, 因此新的时间线并不会覆盖以前的时间线生成的 WAL 数据。实际上我们可以归档许多不同的时间线。 虽然这些看起来像没用的特性,但它却可能常常是救命稻草。考虑一下你并不很确信应该恢复到哪个时刻的情况, 这个时候你不得不做好几次试验性即时恢复然后从中找到旧历史中最好的分支。 如果没有时间线,那么这个过程可能很快就会导致无法管理的混乱。 有了时间线,你可以恢复到任意以前的状态, 包括恢复到后来放弃的时间线分支的状态。在PG中,时间线也在checkpoint的信息中保存有一份(checkpoint保存在pg_control文件的信息中,在PG中可以搜索“TimeLineID”查看相应代码,关于时间线,有一些相关的函数实现其对应的操作)。注意,在写页面信息时,有如下两个函数比较重要:

    PageSetLSN(page, lsn);

    PageSetTLI(page, ThisTimeLineID)

    通常,PG提倡使用多台机器组成集群以运行PG持续把 WAL 文件序列填充给其它装载了同样的基础备份文件的机器,就有了一套"热备份"系统:在任何点都可以启动第二台机器, 而它拥有近乎当前的数据库拷贝。这样提供了较高的可靠性。

 

 

### 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、付费专栏及课程。

余额充值