ps -ef | grep postgres
\d pg_stat_activity
select pid, backend_type from pg_stat_activity;
一、总控制进程
Postmaster
负责启动和关闭数据库实例(通常我们都使用pg_ctl,实际上也是通过bin/postgres来实现的,只是做了一层命令包装)
当用户与PG建议连接时,实际上是通过Postmaster进程建立连接。此时客户端会发出身份验证的消息给Postmaster进程,Postmaster主进程根据消息中的信息进行客户端身份验证。如果验证通过,它会fork一个子进程postgres为这个连接提供服务,fork出来的进程被称为服务进程。
二、系统日志进程
SysLogger
默认是不启用的,通过postgresql.conf启用以后,才会有SysLogger进程
SysLogger会在日志文件达到指定大小时关闭当前日志文件,产生新的日志文件
log_destination | 配置日志输出目标,根据不同的运行平台会设置不同的值,Linux平台下默认为stderr |
logging_collector | 是否开启日志收集器,当设置为on时启动日志功能。否则,系统将不产生系统日志辅助进程 |
log_directory | 配置日志输出文件夹 |
log_filename | 配置日志文件名称命名规则 |
log_rotation_size | 配置日志文件大小,当前日志文件达到这个大小时会被关闭,然后创建一个新的文件来作为当前日志文件 |
三、后台写进程
BgWriter
当发生checkpoint时,将内存中的脏数据刷到磁盘做持久化存储的辅助进程
# 通过命令行输出相关参数
psql -c 'show all;' | grep bgwriter_
bgwriter_delay | 连续两次写数据之间的时间间隔也就是每隔200毫秒,数据库会产生一个checkpoint触发后台写进程 |
bgwriter_flush_after | 当检查点队列(内存中)的脏页/块达到了512kB时,触发后台写进程 |
bgwriter_lru_maxpages | 每次写的最大数据量是多少 |
bgwriter_lru_multiplier | 一个估算最近几次刷脏数据时的平均值因子 每次写入磁盘的数据块个数 |
四、预写日志进程
WalWriter
wal也称为xlog
它的意义,也是核心思想就是:先写日志后写数据,既能保证数据不丢失,还降低了读写压力
Oracle中对应的进程叫LogWriter
五、归档进程
PgArch
从PG 8.x版本开始,有了PITR即时/基于时间点恢复技术。PITR其中一个重要的基础依赖于WAL日志文件的归档功能
PgArch辅助进程的目标就是对WAL日志在磁盘上的存储形式进行归档备份
默认情况下和Oracle一样,没有开启归档/非归档模式,因此看不到PgArch进程
# postgresql.conf
# - Archiving -
archive_mode = off
archive_command = ''
六、自动清理进程
AutoVacuum
在PG数据库中,对数据进行UPDATE(修改)或者DELETE(删除)操作后,数据库不会立即删除旧版本的数据(Undo),而是标记为删除状态。这是因为PG数据库具有多版本的机制(MVCC),如果这些旧版本的数据正在被另外的事务打开,那么暂时保留他们是很有必要的。当数据提交后,旧版本的数据已经没有价值了,数据库需要清理垃圾数据腾出空间,而清理工作就是AutoVacuum进程进行的
七、统计信息收集进程
PgStat
统计信息:反映的数据的分布情况 --> 数据库的优化器CBO(cost based opimizer)、RBO
--> SQL最佳的执行计划
收集统计信息主要是为了让优化器做出正确的判断,选择最佳的执行计划
# postgresql.conf
# STATISTICS
track_activities = on
track_activity_query_size = 1024
track_counts = on
track_io_timing = off
track_wal_io_timing = off
track_functions = none
stats_temp_directory = 'pg_stat_tmp'
八、检查点进程
CheckPoint
触发检查点进程时,该进程操作的优先级是最高的
检查点是系统设置的事务序列点,设置检查点保证检查点前的日志信息刷到磁盘中
# postgresql.conf
# - Checkpoints -
checkpoint_timeout = 5min
checkpoint_completion_target = 0.9
checkpoint_flush_after = 256kB
checkpoint_warning = 30s
max_wal_size = 1GB
min_wal_size = 80MB