WalWriter进程
预写式日志WAL(Write Ahead Log,也称为Xlog)的中心思想是对数据文件的修改必须是只能发生在这些修改已经记录到日志之后,也就是先写日志后写数据。
WAL日志的缓冲区和控制结构在共享内存里,WalWriter进程作用是周期性的从wal buffer刷新数据到磁盘
PgArch辅助进程
在发生WAL日志重复使用切换时或者到达参数设置archive_timeout的时间时,将WAL日志文件进行归档,复制到磁盘上去.
每次做归档以后,过时的WAL日志文件就可以删除。
PgArch辅助进程的目标就是对WAL日志在磁盘上的存储形式(Xlog文件)进行归档备份。
通常,归档日志的日志文件的大小和wal日志文件大小一样,如果arvhive_timeout参数设置了,那么到这个参数时间会自动执行一次日志归档,即使wal日志文件没有写满,归档日志的一个日志文件也是16M就会造成存储浪费
检查点进程
检查点进程会触发数据库写进程,把内存中标记为已提交的块,全部写入到磁盘中去,数据库写进程执行之前会触发一次日志写进程,以保证写入到磁盘的数据文件所对应的重做日志以生成重做日志保存到磁盘中去.
pg会产生WAL预写式日志文件来记录数据库中每个数据文件的改变
但是只会有一个wal段(wal文件的一部分,大小为16MB)是当前可写的
如果当前使用的WAL段文件超过了16MB,则会关闭当前的段文件,然后把另外一个可重复使用的段文件作为当前段文件来使用,能够被重复使用的段文件必须保证其中的内容都在最后一次检查点之前产生并保证该wal对应的数据文件都已经写入到磁盘中.即因为会重复使用WAL日志的段文件,所以导致磁盘中被保存下来的只是最近产生的一部分的WAL日志文件.(难道放日志文件的文件夹的大小是设置的固定的???)
在pg_wal下边有archiver_status目录,记录了每一个wal段文件的状态,如果是.ready代表就绪(可以进行归档了),如果是.done代表已完成(已经归档完成),pgarch进程会找到所有为就绪的段文件,然后对其进行归档,归档成功后,状态再变成已完成.
这样在恢复时,先用备份还原数据文件,然后再重放WAL归档日志到指定的时间点,这个备份方法只支持整个数据集簇的恢复
参考文章:
https://blog.csdn.net/weixin_30329623/article/details/95286686?
https://www.toutiao.com/i6827461769821159939/?