1.background writer (后台写进程)
与OracleDBWR进程工作原理类似,都是负责把缓冲区里面的脏块写到数据文件中,写的目的有两个:
1.为了保存数据。
2.为了释放内存空间。
触发background writer 写的条件:
1.脏块达到了阈值。
2.内存没有可用空间了。
3.超过bgwriter_delay 参数设置的时间,bgwriter会写。
与Oracle不同的是:
oracle的内存结构包括shard pool与缓冲区 buffer cache以及redo log buffer等其它内存结构,oracle同步dbwr进程把脏块写入到数据文件。
PG 的缓冲区叫做Shared buffer pool ,如果学过oracle,这里类似于oracle的shared pool+buffer cache。
2.WAL writer (WAL写进程)
作用:把日志缓冲区WAL buffer里面的日志条目写到日志文件
触发WAL writer 写的条件:
1.发出commit。
2.WAL buffer空间不足。
3.超时,commit_delay:表示一个已经提交的数据在WAL缓冲区中存放的时间,默认值是0毫秒,表示不用延迟;设置为非0值时事务执行commit后不会立即写入WAL中,而仍存放在WAL缓冲区中,等待WalWriter进程周期性地写入磁盘。
4.bgwriter写进程之前,WAL writer要先写。
与Oracle LGWR进程原理十分相似。
3.CheckPoint(CKPT)
职责:
1.把WAL buffer里面的脏块写入到数据文件
这一点与oracle 有些不同,oracle的检查点进程是给DBWR进程发信号,让DBWR进程去写,而PG的CKPT进程本身就有写脏块的能力。
2.更新检查点信息到控制文件与日志文件
3.数据库发生备份的时候会发生检查点
4.autoVacuum进程
在PG数据库中,对数据进行UPDATE或者DELETE操作后,数据库不会立即删除旧版本的数据,而是标记为删除状态。这是因为PG数据库具有多版本的机制,如果这些旧版本的数据正在被另外的事务打开,那么暂时保留他们是很有必要的。当事务提交后,旧版本的数据已经没有价值了,数据库需要清理垃圾数据腾出空间,而清理工作就是AutoVacuum进程进行的。
5.statistics collector 进程
PG 统计收集器。
无论是oracle还是PG 优化器能做出正确的执行计划依赖于正确的统计信息,statistics collector 进程 负责收集对象最新的统计信息, 便于优化器做出正确的执行计划,当然,Oracle 11g中也有自动收集统计信息的功能,但Oracle中没有一个单独的进程来做这件事。
6.logging collector 日志收集进程
我认为类似于Oracle 的diag进程,负责各种Error信息,定位慢查询SQL,数据库的启动关闭信息,发生checkpoint过于频繁等的告警信息,诸如此类。
PG的pg_log 日志默认竟然是不开启的?
7.archiver 归档进程
copy WAL日志进行归档,与oracle 一样,数据库在归档模式才会有这个进程。