PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。

1、PG控制文件简介

1.1、存储的位置

它的路径位于:

相关信息,可以用命令pg_controldata得到:

[10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA
pg_control version number:            1300
Catalog version number:               202107181
Database system identifier:           7138432685960386315
Database cluster state:               in production
pg_control last modified:             Sun 11 Dec 2022 11:19:22 AM CST
Latest checkpoint location:           1/2A000180
Latest checkpoint's REDO location:    1/2A000148
Latest checkpoint's REDO WAL file:    00000001000000010000002A
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:1461
Latest checkpoint's NextOID:          31466
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        727
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  1461
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:            Sun 11 Dec 2022 11:19:22 AM 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:            aaa8abf569631ec60ba05e3f625495da70007738b831e46e1cfda0d26c370987

1.2、什么是控制文件

控制文件里存储了数据库唯一系统标识符、系统状态数据、数据库启动前系统必须恢复到的检查点信息数据库的配置兼容backend进程执行的参数、指明类型timestamp、interval、time内部格式的标志、指明不同类型传值(pass-by-value)状态的标志以及一些数据库的重要信息。

我们可以通过pg_controldata命令直接读取PostgreSQL控制文件内容。

控制文件内容主要分为是三部分,初始化静态信息、WAL及检查点的动态信息、一些数据库配置信息。

控制文件物理路径PGDATA/global/pgc​ontrol相关信息,可以用命令pgc​ontroldata得到:¨G0G¨K27K控制文件里存储了数据库唯一系统标识符、系统状态数据、∗∗数据库启动前系统必须恢复到的检查点信息∗∗、数据库的配置兼容backend进程执行的参数、∗∗指明类型timestamp、interval、time内部格式的标志∗∗、指明不同类型传值(pass−by−value)状态的标志以及一些数据库的重要信息。我们可以通过pgc​ontroldata命令直接读取PostgreSQL控制文件内容。控制文件内容主要分为是三部分,初始化静态信息、WAL及检查点的动态信息、一些数据库配置信息。控制文件物理路径PGDATA/global/pg_control,源码路径src/include/catalog/pg_control.h。

2、控制文件解析

通过pg_controldata命令查看控制文件内容,我们按照初始化静态信息、WAL及检查点的动态信息、一些数据库配置信息三部分进行解析。

2.1、初始静态信息解析

[10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA
pg_control version number:            1300
Catalog version number:               202107181
Database system identifier:           7138432685960386315
Database cluster state:               in production

pg_control last modified: Sun 11 Dec 2022 11:19:22 AM CST

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们找一下pg_control.h中的信息:(pg14的codeline)

source path: 
C:\tools\pgsql\14.4\include\server\catalog\pg_control.h
C:\SAPDevelop\3rdpart\postgres\postgres\src\include\catalog\pg_control.h

/* Version identifier for this pg_control format */
#define PG_CONTROL_VERSION    1300

pg_control version number: 1300 是控制文件版本号。

source path:
C:\SAPDevelop\3rdpart\postgres\postgres\src\include\catalog\catversion.h

#ifndef CATVERSION_H
#define CATVERSION_H

/*
 * We could use anything we wanted for version numbers, but I recommend
 * following the "YYYYMMDDN" style often used for DNS zone serial numbers.
 * YYYYMMDD are the date of the change, and N is the number of the change
 * on that day.  (Hopefully we'll never commit ten independent sets of
 * catalog changes on the same day...)
 */

/*                            yyyymmddN */
#define CATALOG_VERSION_NO    202107181

Catalog version number: 202107181。是系统表版本号,格式是yyyymmddN。记录系统不兼容性的改变。N是yyymmdd当天改变的次数。具体可以查看源码文件src/include/catalog/catversion.h。

Database system identifier: 7138432685960386315 数据库系统号,这个标识串是一个64bit的整数,其中包含了创建数据库的时间戳和initdb时初始化的进程号,具体初始化方法可查看源码文件src/backend/access/transam/xlog.c。创建时间可以通过to_timestamp转换查看到(这个时间就是数据库安装的时间)。

Database cluster state: in production 记录实例的状态。源码文件中看到数据库的几种状态,源码在pg_control.h中:

/*
 * System status indicator.  Note this is stored in pg_control; if you change
 * it, you must bump PG_CONTROL_VERSION
 */
typedef enum DBState
{
    DB_STARTUP = 0,
    DB_SHUTDOWNED,
    DB_SHUTDOWNED_IN_RECOVERY,
    DB_SHUTDOWNING,
    DB_IN_CRASH_RECOVERY,
    DB_IN_ARCHIVE_RECOVERY,
    DB_IN_PRODUCTION
} DBState;

含义如下:

  • starting up:表示数据库正在启动状态。
  • shut down:数据库实例(非Standby)正常关闭后控制文件中就是此状态。
  • shut down in recovery:Standby实例正常关闭后控制文件中就是此状态。
  • shutting down:正常停库时,先做checkpoint,开始做checkpoint时,会把状态设置为此状态,做完后把状态设置为shut down。
  • in crash recovery:数据库实例非异常停止后,重新启动后,会先

http://www.niftyadmin.cn/n/5453501.html

相关文章

趣味算法,猴子算法。python如何实现猴子算法

给一只猴子一台打印机,虽然这只猴子根本不识字,但会乱按,经过一段时间后,在它乱按出来的单词里总能找到一些至少看起来是有意义的部分,比如一两个简短的单词,由此可以推出:只要给它足够长的时间…

C++之函数的重载

指函数名可以相同&#xff0c;提高复用性 函数重载满足条件&#xff1a; 1.同一个作用域下 2.函数名称相同 3.函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数的返回值不可以作为函数重载的条件 //函数重载需要函数都在同一个作用域下 void func() {cout <<…

学习java第二十四天

spring框架中有哪些不同类型的事件 Spring 提供了以下5种标准的事件&#xff1a; 上下文更新事件&#xff08;ContextRefreshedEvent&#xff09;&#xff1a;在调用 ConfigurableApplicationContext 接口中的refresh方法时被触发。 上下文开始事件&#xff08;ContextStart…

最新的前端开发技术(2024年)

关于作者&#xff1a; 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

RK3568笔记二十一:YOLOv8 实例分割部署

若该文为原创文章&#xff0c;转载请注明原文出处。 参考rknn_model_zoo部署YOLOv8 实例分割. 一、环境 1、测试训练环境&#xff1a;AutoDL. 2、平台&#xff1a;rk3568 3、开发板: ATK-RK3568正点原子板子 4、环境&#xff1a;buildroot 5、虚拟机&#xff1a;正点原子…

java数据结构与算法基础-----字符串------正则表达式---持续补充中

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 目前校招的面试&#xff0c;经常会遇到各种各样的有关字符串处理的算法。掌…

ChatGPT解决hmm...something seems to have gone wrong.

ChatGPT解决hmm…something seems to have gone wrong. 这里是官方社区的一种workaround办法。仅仅只是mark一下。 我这边遇到的现象是&#xff0c;ChatGPT 3.5是正常的&#xff0c;但是使用ChatGPT 4就会频繁的出现这样的输出。而且恶心的是&#xff0c;即使是这种输出&…