PostgreSQL是最像Oracle的开源数据库,咱们能够拿Oracle来比拟学习它的体系结构,比拟容易了解。PostgreSQL的次要构造如下:
一、存储构造
PG数据存储构造分为:逻辑存储构造和物理存储存储。其中:逻辑存储构造是外部的组织和治理数据的形式;物理存储构造是操作系统中组织和治理数据的形式。
1、逻辑存储构造
所有数据库对象都有各自的oid(object identifiers),oid是一个无符号的四字节整数,相干对象的oid都寄存在相干的system catalog表中,比方数据库的oid和表的oid别离寄存在pg\_database,pg\_class表中。
在逻辑存储构造中有几个术语须要解释:
- 数据库集群-Database cluster
也叫数据库集簇。它是指有单个PostgreSQL服务器实例治理的数据库汇合,组成数据库集群的这些数据库应用雷同的全局配置文件和监听端口、共用过程和内存构造。一个DataBase Cluster能够包含:多个DataBase、多个User、以及Database中的所有对象。如上图所示。
- 数据库-Database
在PostgreSQL中,数据库自身也是数据库对象,并且在逻辑上彼此拆散,除数据库之外的其余数据库对象(例如:表、索引等等)都属于他们各自的数据库。
- 表空间-tablespace
数据库在逻辑上分成多个存储单元,称作表空间。表空间用作把逻辑上相干的构造放在一起。数据库逻辑上是由一个或多个表空间组成。初始化的时候,会主动创立pg\_default和pg\_global两个表空间。
\db其中:pg_global:用于寄存零碎表。pg_default:该表空间的物理文件存储在数据目录中的base目录中。
创立本人的表空间,并在该表空间上创立表create tablespace mydemotbs location '/home/postgres/training/pgsql/data/mydemotbs';create table testtable1(tid int primary key,tname text) tablespace mydemotbs;
- 模式-Schema
当创立一个数据库时,会为其创立一个名为public的默认Schema。Schema是数据库中的命名空间,在数据库中创立的所有对象都是在Schema中创立,一个用户能够从同一个客户端连贯中拜访不同的Schema。而不同的Schema中能够有多个同名的Table、Index、View、Sequence、Function等等数据库对象。能够通过上面的形式来查看以后数据库的Schema
\dn
- 段-segment
一个段是调配给一个逻辑构造(一个表、一个索引或其余对象)的一组区,是数据库对象应用的空间的汇合;段能够有表段、索引段、回滚段、长期段和高速缓存段等。
- 区-extent
区是数据库存储空间调配的一个逻辑单位,它由间断数据块所组成。第一个段是由一个或多个盘区组成。当一段两头所有空间已齐全应用,PostgreSQL为该段调配一个新的范畴。
- 块-block(Page)
数据块是PostgreSQL 治理数据文件中存储空间的单位,为数据库应用的I/O的最小单位,是最小的逻辑部件。默认值8K。
- 数据库对象-Database object
如:表、视图、索引、序列、函数等等。在PostgreSQL中的所有数据库对象都由各自的对象标识符(OID)进行外部的治理。例如,数据库的OID存储在pg_database零碎表中,能够通过上面的语句进行查问。
select oid,datname from pg_database;
而数据库中的表、索引、序列等数据库对象的OID则存在了pg_class零碎表中,例如能够通过上面的语句查问后面创立的testtable1表的OID。
select oid,relname,relkind,relfilenode from pg_class where relname ='testtable1';
2、物理存储构造
在执行initdb的时候会初始化一个目录,通常咱们都会在系统配置相干的环境变量$PGDATA来示意,初始化实现后,会再这个目录生成相干的子目录以及一些文件。在postgresql中,表空间的概念并不同于其余关系型数据库,这里一个Tablespace对应的都是一个目录。如下图就是PG的物理构造:
每个目录的性能与作用如下所示:
而PostgreSQL的物理存储构造次要是指硬盘上存储的文件,包含:数据文件、日志文件、参数文件、管制文件、redo日志(WAL)。上面别离进行介绍。
- 数据文件(表文件)
顾名思义,数据文件用于存储数据。文件名以OID命名,对于超出1G的表数据文件,PostgreSQL会主动将其拆分为多个文件来存储,而拆分的文件名将由pg_class中的relfilenode字段来决定。如下所示:
select oid,relname,relkind,relfilenode from pg_class where relname ='testtable1';
查看目录表空间mydemotbs的目录(其中:13578是数据库OID,16385是表的OID)
在PostgreSQL中,将保留在磁盘中的块(Block)称为Page。数据的读写是以Page为最小单位,每个Page默认的大小是8K。在编译PostgreSQL时指定BLCKSZ大小将决定Page的大小。每个表文件由逗哥BLCKSZ字节大小的Page组成。在剖析型数据库中,适当减少BLCKSZ大小能够小幅度晋升数据库的性能。
- 日志文件
PostgreSQL日志文件的类型,分为以下几种:
① 运行日志(pg_log)
默认没有开启,开启后会主动生成。查看postgresql.conf文件的配置能够看到相干的参数设置。这个日志个别是记录服务器与DB的状态,比方各种Error信息,定位慢查问SQL,数据库的启动敞开信息,产生checkpoint过于频繁等的告警信息,诸如此类。该日志有.csv格局和.log。倡议应用.csv格局,因为它个别会按大小和工夫主动切割。pg_log是能够被清理删除,压缩打包或者转移,同时并不影响DB的失常运行。当咱们有遇到DB无奈启动或者更改参数没有失效时,第一个想到的就是查看这个日志。
② 重做日志(pg_xlog)
pg\_xlog 这个日志是记录的Postgresql的WAL信息,默认存储在目录$PGDATA/pg\_wal/,是一些事务日志信息(transaction log)。默认单个大小是16M,源码装置的时候能够更改其大小(./configure --with-wal-segsize=target_value 参数,即可设置)这些日志会在定时回滚复原(PITR), 流复制(Replication Stream)以及归档时能被用到,这些日志是十分重要的,记录着数据库产生的各种事务信息,不得随便删除或者挪动这类日志文件,不然你的数据库会有无奈复原的危险。
③ 事务日志(pg_xact)
pg\_xact是事务提交日志,记录了事务的元数据。默认开启。内容个别不能间接读。默认存储在目录$PGDATA/pg\_xact/。
④ 服务器日志
如果用pg_ctl启动的时候没有指定-l参数来指定服务器日志,谬误可能会输入到cmd前台。服务器日志记录了数据库的重要信息。
- 参数文件
次要包含postgresql.conf、pg\_hba.conf和pg\_ident.conf这三个参数文件。上面别离进行介绍:
① postgresql.conf
PostgreSQL的主要参数文件,有很具体的阐明和正文,和Oracle的pfile,MySQL的my.cnf相似。默认在$PGDATA下。很多参数批改后都须要重启。9.6之后反对了alter system来批改,批改后的会存在$PGDATA/postgresql.auto.conf下,能够reload或者 restart来使之失效。
② pg_hba.conf
这个是黑白名单的设置。文件里有具体的参数阐明,默认参数如下:
③ pg_ident.conf
pg\_ident.conf是用户映射配置文件,用来配置哪些操作系统用户能够映射为数据库用户。联合pg\_hba.conf中,method为ident能够用特定的操作系统用户和指定的数据库用户登录数据库。
- 管制文件
管制文件记录了数据库运行的一些信息,比方数据库id,是否open,wal的地位,checkpoint的地位等等。controlfile是很重要的文件。
管制文件的地位:$PGDATA/global/pg\_control,能够应用命令bin/pg\_controldata查看管制文件的内容,如下:
redo日志(WAL)
默认保留在$PGDATA/pg_wal目录下,如下所示:
文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下:00000001 00000000 00000001工夫线 逻辑ID 物理ID
通过上面的语句进行WAL的手动切换:
select pg_switch_wal();
再次查看pg_wal目录,如下所示:
二、过程构造
执行上面的命令列出所有的PostgreSQL的过程。
ps -ef | grep postgres
① Postmaster过程
主过程Postmaster是整个数据库实例的总管制过程,负责启动和敞开数据库实例。用户能够运行postmaster,postgres命令加上适合的参数启动数据库。实际上,postmaster命令是一个指向postgres的链接,如下图所示。
更多时候咱们应用pg\_ctl启动数据库,pg\_ctl也是通过运行postgres来启动数据库,它只是做了一些包装,让咱们更容易启动数据库,所以,主过程Postmaster理论是第一个postgres过程,此过程会fork一些与数据库实例相干的辅助子过程,并治理他们。
当用户与PostgreSQL数据库建设连贯时,实际上是先与Postmaster过程建设连贯。此时,客户端程序会收回身份证验证的音讯给Postmaster过程,Postmaster主过程依据音讯中的信息进行客户端身份验证。如果验证通过,它会fork一个子过程postgres为这个连贯服务,fork进去的过程被称为服务过程,查问pg\_stat\_activity表能够看到的pid,就是这些服务过程的pid。
select pid from pg_stat_activity;
② SysLogger过程
在postgresql.conf里启用 运行日志(pg_log)后,会有SysLogger过程。SysLogger会在日志文件达到指定的大小时敞开以后日志文件,产生新的日志文件。相干配置参数如下:
③ BgWriter后盾写过程
BgWriter是PostgreSQL中在后盾将脏页写出到磁盘的辅助过程,引入该过程次要为达到如下两个目标: 首先,数据库在进行查询处理时若发现要读取的数据不在缓冲区中时要先从磁盘中读入要读取的数据所在的页面,此时如果缓冲区已满,则须要先抉择局部缓冲区中的页面替换进来。如果被替换的页面没有被批改过,那么能够间接抛弃;但如果要被替换的页已被批改,则必须先将这页写出到磁盘中后能力替换,这样数据库的查询处理就会被阻塞。通过应用BgWriter定期写出缓冲区中的局部脏页到磁盘中,为缓冲区腾出空间,就能够升高查询处理被阻塞的可能性。 其次,PostgreSQL在定期作检查点时须要把所有脏页写出到磁盘,通过BgWriter事后写出一些脏页,能够缩小设置检查点时要进行的IO操作,使零碎的IO负载趋势安稳。通过BgWriter对共享缓冲区写操作的对立治理,防止了其余服务过程在须要读入新的页面到共享缓冲区时,不得不将之前批改过的页面写出到磁盘的操作。
④ WalWriter预写日志写过程
该过程用于保留WAL预写日志。预写式日志WAL(Write Ahead Log,也称为Xlog)的中心思想是对数据文件的批改必须是只能产生在这些批改曾经记录到日志之后,也就是先写日志后写数据。如果遵循这个过程,那么就不须要在每次事务提交的时候都把数据块刷回到磁盘,这一点与Oracle数据库是完全一致的。postgresql.conf文件中与WalWriter过程相干的参数如下:
#------------------------------------------------------------------------------# WRITE AHEAD LOG#------------------------------------------------------------------------------#wal_level = minimal # minimal, replica, or logical # (change requires restart)#fsync = on # flush data to disk for crash safety # (turning this off can cause # unrecoverable data corruption)#synchronous_commit = on # synchronization level; # off, local, remote_write, remote_apply, or on#wal_sync_method = fsync # the default is the first option # supported by the operating system: # open_datasync # fdatasync (default on Linux) # fsync # fsync_writethrough # open_sync#full_page_writes = on # recover from partial page writes#wal_compression = off # enable compression of full-page writes#wal_log_hints = off # also do full page writes of non-critical updates # (change requires restart)#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers # (change requires restart)#wal_writer_delay = 200ms # 1-10000 milliseconds#wal_writer_flush_after = 1MB # measured in pages, 0 disables#commit_delay = 0 # range 0-100000, in microseconds#commit_siblings = 5 # range 1-1000
⑤ PgArch归档过程
从PostgreSQL 8.x开始,有了PITR(Point-In-Time-Recovery)技术,该技术支持将数据库复原到其运行历史中任意一个有记录的工夫点;PITR的另一个重要的根底就是对WAL文件的归档性能。PgArch辅助过程的指标就是对WAL日志在磁盘上的存储模式进行归档备份。但在默认状况下,PostgreSQL是非归档模式,因而看不到PgArch过程。PgArch过程通过postgresql.conf文件中的如下参数进行配置:
# - Archiving -#archive_mode = off # enables archiving; off, on, or always # (change requires restart)#archive_command = '' # command to use to archive a logfile segment # placeholders: %p = path of file to archive # %f = file name only # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'#archive_timeout = 0 # force a logfile segment switch after this # number of seconds; 0 disables
⑥ AutoVacuum主动清理过程
在PG数据库中,对数据进行UPDATE或者DELETE操作后,数据库不会立刻删除旧版本的数据,而是标记为删除状态。这是因为PG数据库具备多版本的机制,如果这些旧版本的数据正在被另外的事务关上,那么临时保留他们是很有必要的。当事务提交后,旧版本的数据曾经没有价值了,数据库须要清理垃圾数据腾出空间,而清理工作就是AutoVacuum过程进行的。postgresql.conf文件中与AutoVacuum过程相干的参数有:
#------------------------------------------------------------------------------# AUTOVACUUM#------------------------------------------------------------------------------#autovacuum = on # Enable autovacuum subprocess? 'on' # requires track_counts to also be on.#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and # their durations, > 0 logs only # actions running at least this number # of milliseconds.#autovacuum_max_workers = 3 # max number of autovacuum subprocesses # (change requires restart)#autovacuum_naptime = 1min # time between autovacuum runs#autovacuum_vacuum_threshold = 50 # min number of row updates before # vacuum#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts # before vacuum; -1 disables insert # vacuums#autovacuum_analyze_threshold = 50 # min number of row updates before # analyze#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table # size before insert vacuum#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum # (change requires restart)#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age # before forced vacuum # (change requires restart)#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for # autovacuum, in milliseconds; # -1 means use vacuum_cost_delay#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for # autovacuum, -1 means use # vacuum_cost_limit
⑦ PgStat统计信息收集过程
PgStat过程是PostgreSQL数据库的统计信息收集器,用来收集数据库运行期间的统计信息,如表的增删改次数,数据块的个数,索引的变动等等。收集统计信息次要是为了让优化器做出正确的判断,抉择最佳的执行打算。postgresql.conf文件中与PgStat过程相干的参数,如下:
#------------------------------------------# RUNTIME STATISTICS#------------------------------------------# - Query/Index Statistics Collector -#track_activities = on#track_counts = on#track_io_timing = off#track_functions = none # none, pl, all#track_activity_query_size = 1024 # (change requires restart)#stats_temp_directory = 'pg_stat_tmp'
⑧ 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
三、内存构造
PostgreSQL的内存构造,分为:本地内存和共享内存。它们的关系如下图所示:
① 本地内存:每个后端过程(backend process)本人应用的
② 共享内存:所有过程独特应用