Postgresql日志系统的实现(七)

1.3.2.2主要函数分析:
XLogInsert的执行步骤

功能:插入一条XLOG记录,记录有特殊的RMID标识和附带信息字节,记录的主体包括数据块和数据链。 返回XLOG指针(指向记录尾的),可以用做已经存入日志的数据页的LSN,根据LSNXLOG在修改实际数据之前先写日志(也就是WAL)。

 

执行步骤:

1.  计算日志记录的长度

2.  判断是否该日志记录是否会写入新的日志段中

如果是,调用XLogWrite,把当前缓冲区中的所有日志写入磁盘中。也就是把属于旧日志段、且尚未写入旧日志段的日志记录写入磁盘中

3.  将这条日志记录写入日志缓冲区中。

a)         如果当前缓冲区的剩余空间无法容纳这条日志记录。

                         i.              我们先将这条日志记录中的前一部分写入当前缓冲区中。

                       ii.              调用AdvanceXLInsertBuffer,将下一个缓冲区清空(如果这个缓冲区中的数据还未写入磁盘中,调用XLogWrite,将此缓冲区的数据写入磁盘)

                      iii.              将日志记录的剩余部分写入刚清空的缓冲区。

4.  如果需要进行日志的切换(切换条件为:rmid == RM_XLOG_ID && info == XLOG_SWITCH),则调用“XLogWrite”写出xlog缓存中的所有内容,然后切换成新的段文件,更新xlog共享缓存等信息。

切换段文件的主要代码为:AdvanceXLInsertBuffer(true);

5.   

 

 

说明:

分析XlogInsert()函数,可以看出需要写日志的操作有:

可操作对象                可执行的操作

数据库:                     创建数据库

表空间:                     建立、删除

堆(数据操作等):     插入、删除、更新、释放

索引(B树、gin等): 新建、插入、分裂、建立新根、读取根、删除项、删除页

序列:                         定义、修改、读取值、设置值

存储区管理:              建立、截断

事务:                         提交、中断、子事务的中断

检查点:                     建立

 

XLogFlush的执行步骤

功能:保证给出位置上的XLOG日志数据被写(flush)到了磁盘上

 

注意:不同于XLogWrite,这个函数要尽量避免请求日志写锁(WALWriteLock)。

调用XlogFlush()的函数如图:


Postgresql日志系统的实现(七) - 那海蓝蓝 - 那海蓝蓝的博客
 

刷出日志的时机 图:根据调用关系配合代码即可知预先日志的原理

 

 

XLogWrite的执行步骤

功能:把xlog日志中的内容写出内存

执行步骤:

1.循环判断当前所请求的日志记录是否已写入磁盘,如果不是,执行下列操作,否则跳到第2

       a)    如果本进程最后一次写日志时的logidsegid与系统当前的logidsegid不符

                         i.              关闭xlog日志文件(通过调用“XLogFileClose”),创建或打开系统当前logidsegid对应的日志段文件(通过调用“XLogFileInit”),更新控制文件的内容(通过调用“UpdateControlFile”)。

                       ii.              如果系统当前segid和上一次作checkpoint时的segid相比,超过CheckPointSegments个;或者当“RedoRecPtr”中记载的“xlogid”与当前的“openXlogId”相比不一致,表明其所保存的旧的信息已经很久了,需要做chencpoint,故调用“RequestCheckpoint”,请求bgwrite进程进行创建检查点操作。

                      iii.              调用“pwrite”把xlog中应该写到外存中的信息写出去

                     iv.              如果现在所写的缓冲区对应当前日志段的最后一页、或者用户强制要求日志段转换,则调用“issue_xlog_fsync”根据同步的参数(“postgres.conf”文件中提供了相应的GUC参数)同步日志文件;

                       v.              如果上一条成立,且处于归档模式,在”archive_status”目录下,产生一个文件,作为用于通知可以进行归档文件的标志,并发信号通知归档进程可以进行归档了。其文件名称是日志段的名称+”.ready”,例如” 000000010000000000000000”.ready

2.执行fsnc

3.修改xlog的共享内存状态

 

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

余额充值