pg数据库的结构理解

1 概述

PostgreSQL官方介绍称是最先进的开源关系型数据库,支持所有主流的平台,目前已经更新到了最新版本的12.0,在MySQL被Oracle收购后,PostgreSQL开源社区越来越活跃了,同时还有分布式集群的开源方案GreenPlum,目前也非常受欢迎。本篇文章讨论PostgreSQL内部的架构,内部的组件是如何工作的,这对一个DBA是非常重要的内容。

2 PostgreSQL架构

PostgreSQL的物理结构是非常简单的,主要是由共享内存、后台进程和数据文件组成的。大致的结构可以参考下面的图。 椭圆形的都是进程,方形的都是内存结构,圆柱形的是文件。

2.1 进程

在启动数据库后,Postmaster是第一个启动的进程,在启动过程中,会进行恢复操作(如果有事务未正常提交或者回滚的话),初始化共享内存,启动后台进程等一系列的操作。当客户进程有一个连接请求时,会创建相对应的后台进程处理。过程如下:

通过ps -ef|grep postgres查询可以看到系统总有一个postmaster进程pid=17201,后面所有的后台进程都是postmaster的子进程


postgres 17201     1  0 Jan25 ?        00:06:21 /usr/pgsql-9.6/bin/postgres -D /data1/pgdata
postgres 17202 17201  0 Jan25 ?        00:00:10 postgres: logger process
postgres 17204 17201  0 Jan25 ?        00:01:01 postgres: checkpointer process
postgres 17205 17201  0 Jan25 ?        00:01:39 postgres: writer process
postgres 17206 17201  0 Jan25 ?        00:03:37 postgres: wal writer process
postgres 17207 17201  0 Jan25 ?        00:05:11 postgres: autovacuum launcher process
postgres 17208 17201  0 Jan25 ?        00:00:45 postgres: archiver process
postgres 17209 17201  0 Jan25 ?        00:09:20 postgres: stats collector process
postgres 40377 17201  0 Jan25 ?        00:01:38 postgres: wal sender process replica 10.xxx.xx.115(35258) streaming 1/CD5498D0

下表详细介绍一下各个进程。

进程 详细描述
postmaster 整个数据库实例的总控进程,负责启动和关闭该数据库实例。
logger process 将数据库的日志写入到日志文件中
checkpointer process 当检查点发生时,脏缓存(指的是相对于原数据而言被修改过的)写入到文件中
writer process 周期性将脏缓存写入到文件中
wal writer process Write Ahead Log(预写式日志)
autovacuum launcher process 如果autovacuum开启时,这个是一个周期性回收膨胀表标记为已删除数据的一个进程
archiver process 当开启归档模式,周期性将WAL日志写入到指定的目录
stats collector process 做数据的统计收集工作。主要用于查询优化时的代价估算,包括一个表和索引进行了多少次的插入、更新、删除操作,磁盘块读写的次数、行的读次数。pg_statistic中存储了该进程收集的各类信息。
wal sender process replica 在开启流复制的主备模式时,该进程周期性将WAL文件发送到另一台服务器作为数据同步备份。

2.2 内存结构

共享内存一般指的是内存中专门为数据库缓存和事务日志缓存分配的区域,而最重要的组件就是共享缓存和WAL缓存。

共享缓存的主要目的是减少磁盘的IO,比如一些经常访问的数据块尽可能长的时间保存在共享缓存中,除此之外还有一些诸如进程、锁、统计信息也是在缓存中。

WAL缓存区是一块临时存储数据变更的临时区域,存储在该缓存区的内容会被周期性写入到WAL文件中,该区域对于数据库的备份和恢复都是非常重要的。

2.3 数据库结构

这里面说的结构是逻辑结构,不讨论物理结构。以下是一些理解数据库结构非常重要的内容。

关于数据库:

  • PostgreSQL是由多个数据库组成的,也可以称为数据库群。
  • 当执行了init(),系统会默认创建3个库:template0,template1,postgres。
  • template0和template1是为用户数据库创建的模板库,初始化后,这两个库是一模一样的。
  • template1可以被定制修改,用户创建新的数据库都是克隆该数据库的。

关于表空间:

  • 在初始化后,默认创建了两个表空间pg_default和pg_global。
  • 如果在创建表时候没有指定表空间,则默认是pg_default。
  • 数据库群中表的管理默认都是在pg_global中。
  • pg_default表空间的物理位置在$PGDATA\base。
  • pg_global表空间的物理位置在$PGDATA\global。

关于表:

  • 每张表包含三个文件。
  • 一个文件用于存储数据,文件名是表的OID。
  • 一个文件用于管理表的空余空间,文件名是OID_fsm。
  • 一个文件用于管理表块的可见性,文件名是OID_vm。
  • 索引没有_vm文件。

3 总结

总体来说,PostgreSQL的架构还是比较容易掌握的。上面总结的也是非常基础的内容,这个对于日常维护还是使用都是非常重要的。

原文地址:https://www.cnblogs.com/easonbook/p/10961261.html

时间: 2024-10-11 09:56:33

pg数据库的结构理解的相关文章

pg数据库data目录

概述 pg数据库和mysql数据库的安装目录结构很类似,程序和数据是分开的,在启动时候可以自行指定不同的数据目录来做到启动不同的数据库. 目录 下面表格来解释pg数据目录下,每个文件夹以及文件名的作用. 目录名 作用 base 该目录包含了数据库中各个数据库,每个数据库都是由一个文件夹组成,文件名是该数据库的oid,这个可以通过数据字典pg_database来查看对应的数据库名(select oid,datname from pg_database). pg_xlog/pg_wal 该目录包含w

黄聪:wordpress源码解析-数据库表结构(转)

如果是一个普通的用户,不需要了解wordpress数据库的结构.但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣.如果你已经尝试使用已经存在的wordpress api 去访问你需要的数据,但不直接访问数据库的情况下,这是不可能的,WordPress的提供WPDB的类,使这项任务变得简单. WordPress数据库的11个数据表分别是: 表名(点击表名查看详细介绍) 描述 wp_commentmeta 文章评论额外信息表 wp_comments 文章评论信息表

板邓:数据库的结构

前面已经提到,数据库服务器包括实例和数据库两部分. 其中数据库是用来存储数据的,而实例是用来访问数据库中的数据的.实例包括一组内存结构和后台进程,而数据库的结构需要从逻辑结构和物理结构两个方面来理解.数据库的逻辑结构是指数据的逻辑组织形式,是Oracle内部用来管理数据的机制.数据库的物理结构是从用户角度感觉到的结构,是在操作系统中存储和管理数据的机制.从逻辑结构上来讲,一个数据库包含若干个表空间,不同类型的数据存储在不同的表空间中,如系统数据.用户数据.临时数据和回滚数据等分别存储在不同的表空

Activiti数据库表结构(表详细版)

http://blog.csdn.net/hj7jay/article/details/51302829 1  Activiti数据库表结构 1.1      数据库表名说明 Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头. 并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配. u  ACT_GE_* : “GE”代表“General”(通用),用在各种情况下: u  ACT_HI_* : “HI”代表“History”(历史)

wordpress源码解析-数据库表结构(转)

如果是一个普通的用户,不需要了解wordpress数据库的结构.但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣.如果你已经尝试使用已经存在的wordpress api 去访问你需要的数据,但不直接访问数据库的情况下,这是不可能的,WordPress的提供WPDB的类,使这项任务变得简单. WordPress数据库的11个数据表分别是: 表名(点击表名查看详细介绍) 描述 wp_commentmeta 文章评论额外信息表 wp_comments 文章评论信息表

PG数据库之间的导入导出

本文将介绍如何对PG数据库进行导入.导出,主要利用的是PG自带的pg_dump.pg_dumpall.pg_restore.psql等命令,版本是9.4(不同版本的pg_dump \ pg_restore选项可能会有些不同,请注意). 导出.导入的整体思路是: 导出全局对象,如用户.编码.权限等,产生文件global-objs.dmp 导出每个数据库中的对象.结构,如建库语句.用户.权限.编码.表结构.自定义类型等,产生 [库名]-objs.dmp文件,如dxm-objs.dmp 导出每个数据库

pg数据库表接口和数据导出

导出命令 pg_dump -h localhost -p 5432 -U postgres --inserts -t human_info > D:\human_info_backup.sql testdb 命令说明 pg_dump:是pg数据库中自带的备份命令,在bin目录下,所有要执行的话,必须在bin目录下进行执行. -h:指定主机地址,就是pg数据库所在服务器,这里指定的主机地址就是本地localhost -p:指定主机端口,就是pg数据库应用的端口,这里使用默认的端口,默认貌似可以不用

不同数据库表结构的转化,PowerDesigner的使用教程

通过学习PowerDesigner工具,学习概念模型,物理模型,面向对象模型,业务模型,以及不同数据库表结构的转化. 通过案例给大家分享,sql server 2008r2 数据库和oracle数据库之间的转换方式.在学习转换之前先认识几个概念. 概念模型:对数据和信息进行建模,利用实体-关系图(E-R图)的形式组织数据,检验数据设计的有效性和合理性. 逻辑数据模型 (LDM):逻辑模型主要是使得整个概念模型更易于理解,同时又不依赖于具体的数据库实现,使用逻辑模型可以生成针对具体数据库管理系统的

FocusBI: 《DW/BI项目管理》之数据库表结构 (原创)

关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/s/1f9VdZUXztwylkOdFLbcmWw 密码:2r4v 数据行业发展的很快,很多一起做BI的朋友都已转入大数据.云计算.人工智能等高大上的领域去了,而我还停留在原地做BI,导致能一起讨论问题的人越来越少,我还有太多BI领域的知识不会,需要深入学习,只好一个人慢慢前行一点一点的去学. 在做BI实施的