1.postgresql 后台进程
1.1 主进程postmaster:/data/postgresql/postgresdir/bin/postgres
主进程postmaster 是整个数据库实例的总控进程,负责启动和关闭数据库实例。
1.2 logger 系统日志进程
只有在参数logging_cllect 设置为“on”时,主进程才会启动logger 辅助进程。其通过postmaster进程、所有服务进程及其他辅助进程收集所有的stderr 输出,并将其输出写入日志文件。
1.3 checkpointer 检查点进程
checkpoint就是一个事务顺序的记录点,checkpoint主要是进行刷脏页,redo时会参考checkpoint进行日志回放。除了刷脏之外还会更新一些位点信息,清理一些不再需要的wal。用来保证数据的一致性和完整性。
什么时候数据库才会进行checkpoint?
a. 超级用户手动执行checkpoint命令
b. 参数checkpoint_timeout中指定的间隔(默认300秒)
c. 写入WAL的数据量已达到参数max_wal_size(默认值:1GB)
d. online backup开始的时候
e. 执行pg_start_backup函数时
f. 在实例关闭时(除了pg_ctl stop -m命令执行)
e. 在进行数据库配置时(例如CREATE DATABASE / DROP DATABASE语句)
当执行checkpoint时,数据库主要完成以下几个工作:
a. 识别shared buffers中所有的脏页
b. 将脏页写入相应的数据文件
c. 确保修改后的文件通过fsync()写入到磁盘
1.4 background writer 后台写进程
background writer 进程是把共享内存中的脏页写到磁盘上的进程。当向数据库中插入或更新数据时,并不会马上把数据持久化到数据文件中。主要是为了提高插入、更新、删除数据的性能。
1.5 walwriter 预写式日志写进程
walwriter 是写wal 日志的进程。在修改数据之前必须把这些修改操作记录到磁盘中,这样后面更新实际数据时就不需要实时地把数据持久化到文件中了。如果机器突然宕机或数据库异常退出,导致一部分内存中的脏数据没有及时地刷新到文件中,在数据库重启后,通过读取wal 日志把最后一部分的wal 日志重新执行一遍,就可以将数据库恢复到宕机时的状态。
1.6 autovacuum launcher 自动清理进程
对表进行delete 操作后,原有数据并不会立刻删除,而且在更新数据时,页并不会在原有数据上做更新,而是会新生成一行数据,原有数据只是会标记为删除状态,只有在没有并发的其他事务读到这些旧数据时,才会将其删除。
1.7 stats collector 统计数据收集进程
主要做数据的收集统计,收集的信息主要用于查询优化时的代价估算,这些信息包括在一个表和索引上进行了多少次插入、更新和删除操作,,磁盘块读写的次数以及行的读取次数。pg_statistic表。
1.8 logical replication launcher
用于逻辑复制,订阅者通过 logical replication launcher进程向发布者订阅表的更新并获取更新。
1.9 archiver 归档进程
wal 日志会循环使用,较早的wal 日志会被覆盖。归档进程会在覆盖前把wal 日志备份出来。pg 数据库可以利用 PITR 技术利用全量备份和wal 归档日志,把数据恢复到全量备份后的任意时间点。
2.内存结构
2.1 本地内存
主要存储一些不需要全局存储的数据。主要有以下几个:
临时缓冲区:用于访问临时表的本地缓冲区。
work_mem:内部排序操作和hash 表在使用临时磁盘文件之前的内存缓冲区。
maintenance:在维护性操作(比如vacuum、create index、和alter table ass foreign key 等)中使用的内存缓冲区。
2.2 共享内存
postgresql 启动后会生成一块共享内存,主要用于数据块的缓冲区,以提高读写性能。wal日志缓冲区和clog (commit log) 缓冲区也存在于共享内存中。除此之外还有一些全局信息也会保存在共享内存,比如进程信息、锁信息、全局统计信息等。
标签:wal,postgresql,数据库,checkpoint,进程,内存,缓冲区,后台,日志 From: https://blog.51cto.com/u_11103985/8239193