暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PostgreSQL | WAL文件与LSN

北重楼 2022-07-06
1440

wal

PostgreSQL的第一个 WAL 段文件是 00000001 00000000 00000001如果第一个已被写入 的XLOG 记录填满,则将提供第二个 00000001 00000000 00000002

后继文件按升序顺序使用,00000001 00000000 000000FF填满后,将提供下一个 00000001 00000001 00000000 。这样,每当最后 2 位结转时,中间 8 位数字就会增加 1。

同样,在00000001 00000001 000000FF被填满后,将提供

00000001 00000002 00000000,以此类推。

WAL的名称由三部分组成,每个部分代表8个数字。首先是TimeLine ID,从1开始。第二部分是逻辑文件ID,从0开始。第3部分是物理文件ID,从00开始,直到 FF,周而复始的循环。

LSN

lsn在官方文档中的解释为:在内部,一个LSN是一个64位整数,表示预写式日志流中的一个字节位置。它被打印成两个最高 8 位的十六进制数,中间用斜线分隔,例如16/B374D848。当执行 PIRP (基于时间点回复)时,我们可以指定一个 LSN号来进行恢复。

test=# select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn());

pg_current_wal_lsn | pg_walfile_name | pg_walfile_name_offset

--------------------+--------------------------+------------------------------------

1/8052D4E0 | 000000010000000100000080 | (000000010000000100000080,5428448)
(
1 row)
复制

LSN与WAL

如何计算Logical File ID和 Physical File ID呢?先看一下Physical File ID,默认是从00开始写,一直写到 FF,然后再循环再次从00开始。在完成00到FF一个循环再到00的转换后, Logical File ID就会增加1。

尽管如此,他们仍然有一个复杂的公式。

计算示例:

    test=# select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn());
    pg_current_wal_lsn | pg_walfile_name | pg_walfile_name_offset--------------------+--------------------------+------------------------------------
    1/8052D4E0 | 000000010000000100000080 | (000000010000000100000080,5428448)
    (1 row)


    test=# select x'18052D4E0'::bigint;
    int8------------
    6447879392(1 row)


    test=# select ((6447879392 - 1) (16*1024*1024*256::bigint));
    ?column?----------
    1(1 row)


    test=# select mod(((6447879392 - 1) (16*1024*1024)),256);
    mod-----
    128(1 row)


    test=# SELECT to_hex(128);
    to_hex--------
    80(1 row)
    复制


    如何快速切换wal

    Basic usage example for pg_switch_wal()
    :

      test=# SELECT pg_switch_wal();
      pg_switch_wal---------------
      1/8052D4F8
      (1 row)
      复制

      如果自上次 WAL 文件切换以来没有生成 WAL 的活动,则不会创建新的 WAL 文件,也就意味着两次手动切换之间需要有新数据生成。

      有没有快速切换wal日志的方式?

      下面的方法会导致 WAL 文件活动,因此总是会导致 WAL 文件切换:

        test=# SELECT pg_walfile_name(pg_switch_wal()), now(), pg_walfile_name(pg_switch_wal());
        pg_walfile_name | now | pg_walfile_name


        --------------------------+-------------------------------+--------------------------


        000000010000000100000083 | 2022-06-08 22:56:29.148719+08 | 000000010000000100000083(1 row)
        复制


        文章转载自北重楼,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论