PG修改数据页页头等信息时是否会产生WAL?

简介: PG修改数据页页头等信息时是否会产生WAL?

  研究PG WAL机制时想到个问题:进行插入、删除、更新等操作时,需要通过WAL来保证其一致性,以及复制构建高可用环境,当修改数据页页头等元数据信息时是否会产生WAL?

      凡是产生WAL的地方都会有函数进行预先判断:RelationNeedsWAL。例如插入一个tuple时:heap_insert函数。

    typedef struct PageHeaderData
    {
      /* XXX LSN is member of *any* block, not only page-organized ones */
      PageXLogRecPtr pd_lsn;    /* LSN: next byte after last byte of xlog
                     * record for last change to this page */
      uint16    pd_checksum;  /* checksum */
      uint16    pd_flags;    /* flag bits, see below */
      LocationIndex pd_lower;    /* offset to start of free space */
      LocationIndex pd_upper;    /* offset to end of free space */
      LocationIndex pd_special;  /* offset to start of special space */
      uint16    pd_pagesize_version;
      TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
      ItemIdData  pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
    } PageHeaderData;

           页头结构:


    #define PageXLogRecPtrSet(ptr, lsn) \
      ((ptr).xlogid = (uint32) ((lsn) >> 32), (ptr).xrecoff = (uint32) (lsn))

    插入的话肯定会修改页头信息的。仔细看这段代码,却没找到修改页头时产生WAL的地方。甚至,修改页头的LSN字段pg_lsn时PageSetLSN,该函数在日志拷贝到WAL BUFFER后才进行修改:XLogInsert。而修改lsn的代码也不涉及WAL日志的生成:



    #define PageXLogRecPtrSet(ptr, lsn) \  ((ptr).xlogid = (uint32) ((lsn) >> 32), (ptr).xrecoff = (uint32) (lsn))

    heap_insert函数后续也没有涉及WAL操作的代码了。难道修改数据页页头等信息时不产生WAL?

          这样的话,进行复制时,是否会有问题,主机页头中lsn信息未同步到备机,对其回放会产生问题吧。

           这个疑惑后续深入研究,是否他会通过现有WAL日志解决,而确实不需要产生WAL。大家了解的话,请教下,希望能够得到帮助。

    目录
    相关文章
    |
    8月前
    |
    缓存 关系型数据库 MySQL
    MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
    MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
    158 0
    |
    监控 关系型数据库 数据库
    PostgreSQL 恢复模式错误日志增强 - 提供正在恢复的WAL(XLOG)文件位置
    标签 PostgreSQL , the database system is starting up , the database system is in recovery mode 背景 当数据库异常停库,再次启动时。
    3064 0
    |
    5月前
    |
    SQL 关系型数据库 数据库
    【一文搞懂PGSQL】4.逻辑备份和物理备份 pg_dump/ pg_basebackup
    本文介绍了PostgreSQL数据库的备份与恢复方法,包括数据和归档日志的备份,以及使用`pg_dump`和`pg_basebackup`工具进行逻辑备份和物理备份的具体操作。通过示例展示了单库和单表的备份与恢复过程,并提供了错误处理方案。此外,还详细描述了如何利用物理备份工具进行数据损坏修复及特定时间点恢复(PITR)的操作步骤,以应对误操作导致的数据丢失问题。
    |
    8月前
    |
    存储 缓存 关系型数据库
    Binlog vs. Redo Log:数据库日志的较劲【基础】
    Binlog vs. Redo Log:数据库日志的较劲【基础】
    465 0
    |
    8月前
    |
    监控 安全 数据库
    Binlog vs. Redo Log:数据库日志的较劲【高级】
    Binlog vs. Redo Log:数据库日志的较劲【高级】
    160 0
    |
    存储 关系型数据库 PostgreSQL
    PostgreSQL WAL解析:构建WAL记录准备
    PostgreSQL WAL解析:构建WAL记录准备
    150 0
    |
    监控 关系型数据库 数据库
    监控复制:PG_STAT_REPLICATION
    监控复制:PG_STAT_REPLICATION
    206 0
    |
    弹性计算 容灾 关系型数据库
    PostgreSQL PITR 任意时间点恢复过程中如何手工得到recovery需要的下一个WAL文件名 - 默认情况下restore_command自动获取
    标签 PostgreSQL , recovery , recovery.conf , restore_command , timeline , 时间线 , next wal , PITR , 时间点恢复 背景 PostgreSQL数据库支持PITR时间点恢复。默认情况下,只需要配置目标是时间点,resotre_command即可,PG会自动调用resotre_command去找需要的WA
    1562 0
    |
    SQL 存储 缓存
    分析MySQL执行的流程(连接、缓存、分析、优化、执行、Undo Log、Binlog、Redo Log)
    熟悉MySQL的都知道MySQL服务端实现主要分为Server层和存储引擎层。Server层负责接收和管理客户端连接、管理缓存、解析SQL、优化SQL、调用存储引擎执行SQL;存储引擎层主要负责存储、查询数据。
    分析MySQL执行的流程(连接、缓存、分析、优化、执行、Undo Log、Binlog、Redo Log)
    |
    SQL 关系型数据库 Java
    【DB吐槽大会】第16期 - PG Standby不支持解析逻辑日志
    大家好,这里是DB吐槽大会,第16期 - PG Standby不支持解析逻辑日志

    热门文章

    最新文章