超详细的PostgreSQL体系结构总结,值得收藏

https://www.toutiao.com/i6715390855772897800/
原创 波波说运维 2019-07-26 00:03:00

概述

今天本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来介绍一下PostgreSQL的架构。


架构

PostgreSQL的主要架构如下:


一、日志文件

1、日志文件种类

1)$PGDATA/log 运行日志(pg10之前为$PGDATA/pg_log)

2)$PGDATA/pg_wal 重做日志(pg10之前为$PGDATA/pg_xlog)

3)$PGDATA/pg_xact 事务提交日志(pg10之前为$PGDATA/pg_clog)

4)服务器日志,可以在启动的时候指定,比如pg_ctl start -l ./alert.log

2、 运行日志

运行日志主要相关的参数如下,默认没有开启的话没有log目录,开启后会自动生成。

3、事务日志pg_xact

pg_xact是事务提交日志,记录了事务的元数据。默认开启。内容一般不能直接读。

4、 服务器日志

如果用pg_ctl启动的时候没有指定-l参数来指定服务器日志,错误可能会输出到cmd前台。服务器日志记录了数据库的重要信息。

lsof或许可以过滤出在写的日志文件

$lsof -c postgres| grep REG | grep -v /usr | grep -v /dev | grep -v /SYS

二、参数文件

1、 postgresql.conf

pg的主要参数文件,有很详细的说明和注释,和Oracle的pfile,MySQL的my.cnf类似。默认在$PGDATA下。很多参数修改后都需要重启。9.6之后支持了alter system来修改,修改后的会存在$PGDATA/postgresql.auto.conf下,可以reload或者 restart来使之生效。

主要的参数如下:

2、pg_hba.conf

这个是黑白名单的设置。文件里有详细的参数说明,默认参数如下:

type 列有local,host,hostssl,hostnossl四种。local是本地认证

database 可以是all,或者指定的数据库

user列可以是all,或者具体的用户

address 可以是ip或者网段

method比较重要,有"trust", "reject", "md5", "password", "scram-sha-256", "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert"这么多可选。trust是免密登录;reject是黑名单拒绝;md5是加密的密码;password是没有加密的密码;ident是Linux下PostgreSQL默认的local认证方式,凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库

3、 pg_ident.conf

pg_ident.con是用户映射配置文件。结合pg_hba.connf中,method为ident可以用特定的操作系统用户和指定的数据库用户登录数据库。如下:

pg_ident.conf如下:

pg_hba.conf如下:


三、控制文件

1、 控制文件位置

$PGDATA/global/pg_control

控制文件在数据库目录的global目录下。控制文件记录了数据库的重要信息。

2、 查看控制文件

pg_controldata可以查看控制文件的内容

$ pg_controldata $PGDATApg_control version number: 1100Catalog version number: 201809051Database system identifier: 6684270596680436587 #dbidDatabase cluster state: in production # primarypg_control last modified: Thu 16 May 2019 02:26:37 PM CSTLatest checkpoint location: 0/48812A0Latest checkpoint's REDO location: 0/4881268 #redo 位置Latest checkpoint's REDO WAL file: 000000010000000000000001 #wal文件号Latest checkpoint's TimeLineID: 1Latest checkpoint's PrevTimeLineID: 1Latest checkpoint's full_page_writes: onLatest checkpoint's NextXID: 0:572 #下一个事务idLatest checkpoint's NextOID: 16388 #下一个OID.....

controlfile记录了数据库运行的一些信息,比如数据库id,是否open,wal的位置,checkpoint的位置,等等。controlfile是很重要的文件,数据库部署和调整。


四、数据文件

1、page

pg中,每个索引和表都是一个单独的文件,pg中叫做page。默认是每个大于1G的page会被分割pg_class.relfilenode.1这样的文件。

Page默认大小为8KB,最大32KB,一个数据块中可存放多行的数据。块中的结构如下图:

块头记录了如下信息:

  • 块的checksum值
  • 空闲空间的起始位置和结束位置
  • 特殊数据的起始位置
  • 其他一些信息
  • 行指针是一个32bit的数字,具体结构如下:
  • 行内容的偏移量,占15bit;
  • 指针的标记,占2bit;
  • 行内容的长度,占15bit。

行指针中表示行内容的偏移量是15bit,能表示的最大偏移量是2^15=32768,因此块的最大大小是32768,即32KB。

2、page物理位置

page的物理位置在$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE

需要注意的是,pg_class.relfilenode类似dba_objects.data_object_id,truncate表之后relfilenode会变。对应的物理文件名字也会变。


五、WAL日志

1、wal位置

wal在$PGDATA/pg_wal下。10之前为pg_xlog

2、wal命名格式

文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下

3、手动切换WAL日志的命令

在PG10之前:

highgo=# select pg_switch_xlog(); pg_switch_xlog ---------------- 0/B000C48(1 row)

在PG10之后:

highgo=# select pg_switch_wal(); pg_switch_wal ---------------- 0/B000C48(1 row)

六、后台进程

pg后台进程说明如下:

[转帖]超详细的PostgreSQL体系结构总结,值得收藏的更多相关文章

  1. [转帖]超详细的EXPDP、IMPDP规范及常用技巧总结

    超详细的EXPDP.IMPDP规范及常用技巧总结 https://www.toutiao.com/i6727232212850180619/ 原创 波波说运维 2019-08-24 00:06:00 ...

  2. [转帖]超详细的Oracle数据库在不同损坏级别的恢复总结

    超详细的Oracle数据库在不同损坏级别的恢复总结 原创 波波说运维 2019-07-20 00:02:00 概述 在 DBA 的日常工作中不可避免存在着数据库的损坏,今天主要介绍 Oracle 数据 ...

  3. 【转帖】史上最全PostgreSQL体系结构

    史上最全PostgreSQL体系结构 2019年07月16日 18:00:00 Enmotech 阅读数 35   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

  4. 转帖: 一份超全超详细的 ADB 用法大全

    增加一句 连接 网易mumu模拟器的方法 adb  connect 127.0.0.1:7555 一份超全超详细的 ADB 用法大全 2016年08月28日 10:49:41 阅读数:35890 原文 ...

  5. MyCat安装与测试教程 超详细!

    MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...

  6. JavaWeb和WebGIS学习笔记(七)——MapGuide Open Source安装、配置以及MapGuide Maestro发布地图——超详细!目前最保姆级的MapGuide上手指南!

    JavaWeb和WebGIS学习笔记(七)--MapGuide Open Source安装.配置以及MapGuide Maestro发布地图 超详细!目前最保姆级的MapGuide上手指南! 系列链接 ...

  7. 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例

    初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...

  8. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  9. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

随机推荐

  1. luogu P3567 [POI2014]KUR-Couriers

    二次联通门 : luogu P3567 [POI2014]KUR-Couriers MMP 指针 RE + MLE + WA..... 不得已...向黑恶的数组实力低头 /* 指针 */ #inclu ...

  2. wepy框架入门

    安装 wepy 命令行工具. npm install wepy-cli -g 在开发目录生成开发DEMO. wepy new myproject 开发实时编译. wepy build --watch ...

  3. 实验1C语言开发环境使用和数据类型、运算符、表达式

    # include <stdio.h> int main() { char ch; printf("输入一个字符:\n"); scanf("%c", ...

  4. sweiper做一个tab切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 怎么写一个带 bin 的 npm 包

    只需要2步: 1. 在package.json 定义 一下 : { "name": "my-cli", ..., "bin": { &quo ...

  6. local模式运行spark-shell时报错 java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':

    先前在local模式下,什么都不做修改直接运行./spark-shell 运行什么问题都没有,然后配置过在HADOOP yarn上运行,之后再在local模式下运行出现以下错误: java.lang. ...

  7. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

  8. Synchronized 有几种用法

    我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法. 1.同步普通方法 这个也是我 ...

  9. C++ private,public,protected 关键字

    第一: private,public,protected的访问范围:   private: 只能由该类中的函数.其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被 ...

  10. idea使用maven私服

    nexus3中央仓库改为阿里云/ 参考:这里写链接内容  找到中央仓库 然后修改成:  http://maven.aliyun.com/nexus/content/groups/public/   1 ...