zoukankan      html  css  js  c++  java
  • PostgreSQL之checkpoint

    先看看pg都有哪些后端进程

    [postgres@mingfan bin]$ ps -ef |grep postgres
    postgres  389889       1  0 22:11 ?        00:00:00 /usr/local/pgsql/bin/postgres -D ../data
    postgres  389891  389889  0 22:11 ?        00:00:00 postgres: checkpointer
    postgres  389892  389889  0 22:11 ?        00:00:00 postgres: background writer
    postgres  389893  389889  0 22:11 ?        00:00:00 postgres: walwriter
    postgres  389894  389889  0 22:11 ?        00:00:00 postgres: autovacuum launcher
    postgres  389895  389889  0 22:11 ?        00:00:00 postgres: stats collector
    postgres  389896  389889  0 22:11 ?        00:00:00 postgres: logical replication launcher

    可以看到PostgreSQL后端是由称为Postmaster(postgres)的主进程派生出来的进程的集合。

    checkpoint的作用

    checkpointer进程称为检查点进程,checkpoint操作会将某个时间点之前的脏数据都刷新到磁盘。

    PostgreSQL在崩溃恢复时会以最近的checkpoint为基础,不断应用这之后的WAL日志。

    简单来讲

    我的数据库突然崩溃了,数据库重新启动的时候会去读取检查点,假定最近的检查点在10min前,则数据库会从该检查点开始应用检查点之后的wal日志进行数据恢复,假定最近的检查点在5min前,那数据库只需要重放数据库崩溃前5min的wal日志就能成功恢复数据了,这样做的目的是为了缩短数据库故障后的恢复时间

    checkpoint的相关参数

    postgresql.conf文件中的相关参数如下:

    # - Checkpoints -
    
    #checkpoint_timeout = 5min              # range 30s-1d
    max_wal_size = 1GB
    min_wal_size = 80MB
    #checkpoint_completion_target = 0.5     # checkpoint target duration, 0.0 - 1.0
    #checkpoint_flush_after = 256kB         # measured in pages, 0 disables
    #checkpoint_warning = 30s               # 0 disables

    lcheckpoint_timeout:此参数配置检查点的执行周期。默认值是5分钟。这意味着每隔5分钟就会出现一个检查点,或者在即将超过max_wal_size时。默认是1 GB。
    lmax_wal_size:此参数设置检查点发生前的WAL的最大值。
    lmin_wal_size:此参数设置了需要回收的以备将来使用的WAL文件总大小的最小值
    lcheckpoint_completion_target:为了避免大量的页面写入对I/O造成冲击,在检查点期间写入脏缓冲区的过程会分散一段时间。该周期由checkpoint_completion_target控制,它是检查点间隔的一部分,默认为0.5,也就是说每个checkpoint需要在checkpoints间隔时间的50%内完成。
    lcheckpoint_flush_after:当检查点发生时,检查点写入的页面大小超过本参数值时,将刷新到磁盘。否则,这些页面可能会保存在操作系统的页面缓存中。默认值为256kB。
    lcheckpoint_warning:检查点的操作是非常昂贵的。该参数在检查点之间配置一个阈值,如果由于填充WAL segment files而导致的检查点发生间隔小于本参数值,系统将在服务器日志中输出一个警告,建议用户增加max_wal_size,可以通过设置为0禁用。

    checkpoint的发生时机

    1. 超级用户(其他用户不可)执行CHECKPOINT命令

    2. 数据库shutdown

    3. 数据库recovery完成

    4. XLOG日志量达到了触发checkpoint阈值

    5. 周期性地checkpoint

    6. 需要刷新所有脏页

    如何查看checkpoint相关信息

    可以通过pg_controldata进行查看

    pg_controldata ../data
    ---
    [postgres@iZbp1fpui5cmgd2buwhk5fZ bin]$ ./pg_controldata ../data/
    pg_control version number:            1300
    Catalog version number:               202007201
    Database system identifier:           6893496605411273979
    Database cluster state:               in production
    pg_control last modified:             Tue 10 Nov 2020 11:32:32 PM CST
    Latest checkpoint location:           0/155E200
    Latest checkpoint's REDO location:    0/155E1C8
    Latest checkpoint's REDO WAL file:    000000010000000000000001
    Latest checkpoint's TimeLineID:       1
    Latest checkpoint's PrevTimeLineID:   1
    Latest checkpoint's full_page_writes: on
    Latest checkpoint's NextXID:          0:486
    Latest checkpoint's NextOID:          24576
    Latest checkpoint's NextMultiXactId:  1
    Latest checkpoint's NextMultiOffset:  0
    Latest checkpoint's oldestXID:        478
    Latest checkpoint's oldestXID's DB:   1
    Latest checkpoint's oldestActiveXID:  486
    Latest checkpoint's oldestMultiXid:   1
    Latest checkpoint's oldestMulti's DB: 1
    Latest checkpoint's oldestCommitTsXid:0
    Latest checkpoint's newestCommitTsXid:0
    Time of latest checkpoint:            Tue 10 Nov 2020 11:32:32 PM CST
    Fake LSN counter for unlogged rels:   0/3E8
    Minimum recovery ending location:     0/0
    Min recovery ending loc's timeline:   0
    Backup start location:                0/0
    Backup end location:                  0/0
    End-of-backup record required:        no
    wal_level setting:                    replica
    wal_log_hints setting:                off
    max_connections setting:              100
    max_worker_processes setting:         8
    max_wal_senders setting:              10
    max_prepared_xacts setting:           0
    max_locks_per_xact setting:           64
    track_commit_timestamp setting:       off
    Maximum data alignment:               8
    Database block size:                  8192
    Blocks per segment of large relation: 131072
    WAL block size:                       8192
    Bytes per WAL segment:                16777216
    Maximum length of identifiers:        64
    Maximum columns in an index:          32
    Maximum size of a TOAST chunk:        1996
    Size of a large-object chunk:         2048
    Date/time type storage:               64-bit integers
    Float8 argument passing:              by value
    Data page checksum version:           0
    Mock authentication nonce:            947e012a07d79fb1072fe46c80a49cdb772cf39fdbf2fe47863ac82d1b0ef2c4
  • 相关阅读:
    UVALive
    HDU6405 Make ZYB Happy 广义sam
    企业级通用链表雏形
    数据结构与算法-递归的形象化理解
    Pictures & texts synthesiser
    全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别
    LINUX 目录文件结构
    测试
    maven 查找jar包的version
    web.xml文件的web-app标签体各版本的约束
  • 原文地址:https://www.cnblogs.com/mingfan/p/13966782.html
Copyright © 2011-2022 走看看