史上最全PostgreSQL体系结构

2019年07月16日 18:00:00 Enmotech 阅读数 35
 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

墨墨导读:本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来讨论PostgreSQL的结构。

7月16日晚20:30-21:30,云和恩墨大讲堂邀请到了云和恩墨东区技术顾问成旸老师为我们分享Oracle中统计信息的相关知识。成老师将带我们由点到面,系统地了解统计信息。线上直播报名链接:https://cs.enmotech.com/event/53(或者点击“阅读原文”立即报名)

一、引言


PostgreSQL是最像Oracle的开源数据库,我们可以拿MySQL和Oracle来比较学习它的体系结构,比较容易理解。本文会讨论pg的如下结构:

  • 日志文件

  • 参数文件

  • 控制文件

  • 数据文件

  • redo日志(WAL)

  • 后台进程

PostgreSQL的主要结构如下:

二、日志文件


2.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.2 运行日志

2.2.1  运行日志参数

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

参数

可选值/说明

log_destination = 'csvlog'

# stderr, csvlog, syslog, and eventlog ,csvlog requires logging_collector to be on

一般选择这个,可以将csv日志导入数据库中查看

logging_collector=on

# Enable capturing of stderr and csvlog into log files

选scv格式的日志必须设置这个参数on,修改需要重启

log_directory = 'log'

日志输出目录

log_filename='postgresql-%Y-%m-%d_%H%M%S.log

日志文件名字格式

log_file_mode=0600

# creation mode for log files   日志文件权限

log_truncate_on_rotation = on

设置重用日志

log_rotation_age = 1d

多长时间重用日志

log_rotation_size = 10MB

日志达到多大重用

log_min_messages=warning

#debug5,debug4,debug3,debug2,debug1,info,notice,warning,error,log,fatal,panic

log_min_duration_statement = 60

慢sql记录(超过多长时间的sql)

log_checkpoints = on

记录checkpoint操作

log_connections = on

记录会话连接操作

log_disconnections = on

记录会话断开操作

log_duration = on

记录sql执行时间

log_lock_waits=on

# log lock waits >= deadlock_timeout   记录时间长的阻塞

log_statement='ddl'

# none, ddl, mod, all    记录ddl

2.2.2  csv日志入库

CREATE TABLE pg_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);	

< pg@cs-db /oracle/soft/data/log 16:12 --> pwd
/oracle/soft/data/log
< pg@cs-db /oracle/soft/data/log 16:12 -->
< pg@cs-db /oracle/soft/data/log 16:12 --> ls -rtl
total 8
-rw------- 1 pg pg 168 Nov 10 16:08 postgresql-16.log
-rw------- 1 pg pg 502 Nov 10 16:08 postgresql-16.csv
< pg@cs-db /oracle/soft/data/log 16:12 --> pwd
/oracle/soft/data/log
< pg@cs-db /oracle/soft/data/log 16:12 --> psql
psql (11beta3)
Type "help" for help.	

li=# copy pg_log from '/oracle/soft/data/log/postgresql-16.csv' with csv;
COPY 3
li=#

  

这样就可以用sql来查看了。

2.3 pg_wal  见六

2.4 事务日志pg_xact

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

2.5 服务器日志

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

[postgres@whf307 log]$ more alert.log
-- ::] LOG:  listening on IPv4 address
-- ::] LOG:  listening on IPv6 address
-- ::] LOG:  listening on Unix socket "/data/.s.PGSQL.5432"
-- ::] LOG:  redirecting log output to logging collector process
-- ::] HINT:  Future log output will appear in directory "log".

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


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

三、参数文件


3.1 postgresql.conf

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

主要的参数如下:

参数

可选值/说明

listen_addresses='*'

监听客户端的地址,默认是本地的,需要修改为*或者0.0.0.0

port = 5432

pg端口,默认是5432

max_connections = 2000

最大连接数,默认100

unix_socket_directories

socket文件的位置,默认在/tmp下面

shared_buffers

数据缓存区,类型Oracle的buffer cache。建议值 1/4主机内存

maintenance_work_mem

维护工作内存,用于vacuum,create index,reindex等。建议值(1/4 主机内存)/autovacuum_max_workers

max_worker_processes

总worker数

max_parallel_workers_per_gather

单条QUERY中,每个node最多允许开启的并行计算WORKER数

wal_level

wal级别,11 默认是replica了

wal_buffers

类似Oracle的log buffer

checkpoint_timeout

checkpoint时间间隔

max_wal_size

控制wal的数量

min_wal_size

控制wal的数量

archive_command

开归档,比如 'test ! -f /disk1/digoal/arch/%f && cp %p /disk1/digoal/arch/%f'

autovacuum

开启自动vacuum

3.2 pg_hba.conf

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

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all                         trust
# IPv6 local connections:
host    all             all             ::/                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all                         trust
host    replication     all             ::/                 trust
# local      DATABASE  USER  METHOD  [OPTIONS]
# host       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]
# hostssl    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]    

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.3 pg_ident.conf

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

# MAPNAME    SYSTEM-USERNAME    PG-USERNAME
mapll          test                     sa

pg_hba.conf如下:

# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD
local    all      all        ident  map=mapll

四、控制文件


4.1 控制文件位置


$PGDATA/global/pg_control

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

4.2 查看控制文件

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

[postgres@whf307 global]$ pg_controldata  $PGDATA
pg_control version number:
Catalog version number:
Database system identifier:             #dbid
Database cluster state:               in production        # primary
pg_control last modified:             Thu  May  :: PM CST
Latest checkpoint location:           /48812A0
Latest checkpoint's REDO location:    0/4881268                #redo 位置
Latest checkpoint's REDO WAL file:    000000010000000000000001 #wal文件号
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:572          #下一个事务id
Latest checkpoint's NextOID:          16388          #下一个OID
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        561
Latest checkpoint
Latest checkpoint's oldestActiveXID:  572
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Thu  May  :: PM CST
Fake LSN counter /
Minimum recovery ending location:     /
Min recovery ending loc's timeline:   0
Backup start location:                /
Backup end location:                  /
End-of-backup record required:        no
wal_level setting:                    replica   #wal级别
wal_log_hints setting:                off
max_connections setting:                     #最大连接数
max_worker_processes setting:
max_prepared_xacts setting:
max_locks_per_xact setting:
track_commit_timestamp setting:       off
Maximum data alignment:
Database block size:                      #数据块大小
Blocks per segment of large relation:
WAL block size:                           #wal 数据块大小
Bytes per WAL segment:                  #单个wal大小
Maximum length of identifiers:
Maximum columns
Maximum size of a TOAST chunk:
Size of a large-
Date/time type storage:               -bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:
Mock authentication nonce:            f01b78f5a88882f2f1811bbbc637cc4766d57d39831139a6b3e881d76272d892    

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

五、数据文件


5.1 page

pg中,每个索引和表都是一个单独的文件,pg中叫做page。默认是每个大于1G的page会被分割pg_class.relfilenode.1这样的文件。page的大小在initdb的时候指定(--with-segsize)。

5.2 page物理位置

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

mydb=# select relfilenode from pg_class where relname='t1';
 relfilenode
-------------    

( row)    

mydb=# select pg_relation_filepath('t1');
 pg_relation_filepath
----------------------
 /
( row)    

mydb=# show data_directory;
 data_directory
----------------
 /data
( row)    

mydb=# \q
[postgres@whf307 /
-rw-------  postgres postgres  May  : /data//    

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

六、WAL日志


6.1 wal位置

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

[postgres@whf307 data]$ cd pg_wal
[postgres@whf307 pg_wal]$
[postgres@whf307 pg_wal]$ ls -rtl
total
drwx------  postgres postgres         Apr  : archive_status
-rw-------  postgres postgres  May  :     

6.2 wal命名格式

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

-------- -------- --------
时间线     逻辑id    物理id

6.3 查看wal时间

postgres=# select pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name
--------------------------    

( row)    

postgres=#    

postgres=# select * from pg_ls_waldir() order by modification asc;
           name           |   size   |      modification
--------------------------+----------+------------------------
  |  | -- ::+
( row)    

6.4 切换wal

postgres=# select pg_switch_wal();
 pg_switch_wal
---------------
 /48814E8
( row)
postgres=# select * from pg_ls_waldir() order by modification asc;
           name           |   size   |      modification
--------------------------+----------+------------------------
  |  | -- ::+
  |  | -- ::+
( rows)

6.5 pg_waldump查看wal

pg_waldump可以查看wal的具体内容

七、后台进程


postgres         : pts/    :: /pg/pg11/bin/postgres
postgres     : ?        :: postgres: logger
postgres     : ?        :: postgres: checkpointer
postgres     : ?        :: postgres: background writer
postgres     : ?        :: postgres: walwriter
postgres     : ?        :: postgres: autovacuum launcher
postgres     : ?        :: postgres: stats collector
postgres     : ?        :: postgres: logical replication launcher
————————————————
版权声明:本文为CSDN博主「Enmotech」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Enmotech/article/details/96225598
  • postgres                           主进程

  • logger                              日志进程

  • checkpointer                    checkpoint进程

  • background writer           数据文件写进程

  • walwriter                          wal写进程

  • autovacuum launcher      autovacuum进程

  • stats collector                   统计信息收集进程

【转帖】史上最全PostgreSQL体系结构的更多相关文章

  1. 史上最全postgreSQL体系结构(转)

    原文链接:https://cloud.tencent.com/developer/article/1469101 墨墨导读:本文主要从日志文件.参数文件.控制文件.数据文件.redo日志(WAL).后 ...

  2. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. [No00004F]史上最全Vim快捷键键位图(入门到进阶)vim常用命令总结

    在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...

  4. 史上最全的maven的pom.xml文件详解(转载)

    此文出处:史上最全的maven的pom.xml文件详解——阿豪聊干货 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  5. 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集

    你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931   GitHub 上有一个 Awesome - XXX 系列 ...

  6. JVM史上最全实践优化没有之一

    JVM史上最全优化没有之一 1.jvm的运行参数 1.1 三种参数类型 1.1.1 -server与-clinet参数 2.1 -X参数 2.1.1 -Xint.-Xcomp.-Xmixed 3.1 ...

  7. 史上最全存储引擎、索引使用及SQL优化的实践

    史上最全存储引擎.索引使用及SQL优化的实践 1 MySQL的体系结构概述 2. 存储引擎 2.1 存储引擎概述 2.2 各种存储引擎特性 2.2.1 InnoDB 2.2.2 MyISAM 3. 优 ...

  8. 【干货总结】:可能是史上最全的MySQL和PGSQL对比材料

    [干货总结]:可能是史上最全的MySQL和PGSQL的对比材料 运维了MySQL和PGSQL已经有一段时间了,最近接到一个数据库选型需求,于是便开始收集资料整理了一下,然后就有了下面的对比表 关键词: ...

  9. Java基础面试题(史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

随机推荐

  1. 好久木来了,一直忙于项目(加懒惰),今天讲讲vuecli3.0的使用

    vue更新换代很快,马上vue都要出3.0了,这是一个巨大的变革,不过今天讲的是vuecli3.0,里面使用的vue仍然是2的,所有可以放心大胆使用. Vue CLI 是一个基于 Vue.js 进行快 ...

  2. YII框架入门

    一.安装 php运行环境安装包:http://www.phpstudy.net/a.php/207.html Yii安装包: https://github.com/yiisoft/yii2/relea ...

  3. linux环境下完成jenkins的环境搭建

    环境搭建部署: 请完成jenkins的环境搭建,需安装tomcat,mysql. Jenkins 地址:  https://jenkins.io/download/ 步骤分析: 1.全部操作使用普通用 ...

  4. zookpeer 和 redis 集群内一致性协议 及 选举 对比

    zookeeper 使用的是zab协议,类似 raft 的 Strong Leader 模式 redis 的哨兵 在  崩溃选举的时候采用的是 raft的那一套term. 因为redis 采用的是异步 ...

  5. stdu1309(不老的传说)

    题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1309.html 不老的传说问题 Ti ...

  6. Alpha项目冲刺! Day1-领航

    各个成员在 Alpha 阶段认领的任务 成员 任务 任务时长 林恩 项目进度签到代码审核与签入撰写博客协调组内合作 50 寇永明 美工和部分后台编写 30 杨长元 安卓端搭建 45 胡彤 服务器框架搭 ...

  7. jQuery之编写插件

    一.学习插件编写背景 作为一名前端人员,应该注重前端复用性及组件化,更应该考虑前端的性能优化,做到代码简洁有序,不冗余.特别是在大型团队中,如果一个团队中存在多个功能相似的组件,举个栗子,拿分页组件举 ...

  8. java Calendar 小时值得到24进制格式

    Calendar cal = Calendar.getInstance(); cal.get(Calendar.HOUR_OF_DAY)

  9. 网络中的tarpit/tar pit

    最近看haproxy源码,里面有个TARPIT的概念不能理解,找了很久才找到对应的意思.特此记录. tarpit 本意是“沼泽地.地洼地”,这里显然把它引申为“捕获或者困住某个物体”. 在网络语义中提 ...

  10. 连接池大小调优 原创: ImportNew ImportNew 2017-06-07

    连接池大小调优 原创: ImportNew ImportNew 2017-06-07