为啥Point-in-Time Recovery (PITR)的postgresql文档中没有提到pg_clog?
Posted
技术标签:
【中文标题】为啥Point-in-Time Recovery (PITR)的postgresql文档中没有提到pg_clog?【英文标题】:Why is pg_clog not mentioned in the postgresql document of Point-in-Time Recovery (PITR)?为什么Point-in-Time Recovery (PITR)的postgresql文档中没有提到pg_clog? 【发布时间】:2018-01-29 07:18:43 【问题描述】:首先,请原谅我的英语不好。
postgresql 9.x 文档的“Continuous Archiving and Point-in-Time Recovery (PITR)”一章中没有提到关键字“pg_clog”。但正如我从数据库系统实现一书中了解到的,提交日志是数据库从故障或备份中恢复的必要条件,因为它们有助于数据库恢复到一致性。
是不是因为提交记录也写在了其他文件中?例如,WAL?
谢谢。
【问题讨论】:
【参考方案1】:提交日志包含特定事务是否已提交或回滚的信息。
当向表中写入行时,尚不清楚事务是否会成功。而不是在事务提交或恢复时将该信息存储在每个行版本(“元组”)中,PostgreSQL 仅在提交日志中标记事务的状态。
所以需要有commit log来判断某个tuple是否可见;没有它,数据库将无法使用。
恢复文档中没有特别提到提交日志,因为它是数据目录的一部分,并在检查点时写入磁盘。
对于恢复,没有必要在您恢复的检查点之外有提交日志信息:因为COMMIT
和ROLLBACK
记录在事务日志(“WAL”)中,所有信息都在那里并将在恢复期间写入提交日志。
【讨论】:
有趣。如果事务日志中提供了相同的信息,那么为什么需要提交日志?这是一种性能优化,因为搜索 WAL 档案的效率会降低吗? 当然,从 WAL 中提取这些信息是非常低效的。但这也是不可能的,因为一旦 WAL 文件被归档和回收,服务器就不再可以使用它们了。以上是关于为啥Point-in-Time Recovery (PITR)的postgresql文档中没有提到pg_clog?的主要内容,如果未能解决你的问题,请参考以下文章