概述
WAL日志(Write Ahead Log),意为预写式日志,特点是先记后做(类似于mysql种的redo日志),也被称作xlog日志,默认存放于数据目录的pg_xlog文件夹下:$PGDATA/pg_xlog,该日志的重要性不言而喻。在磐维数据库中,参数wal_keep_segments控制了正常情况下保留的xlog文件数量,故该日志会被自动删除(可以通过wal_keep_segments * 16M 来预估pg_xlog文件夹的存储峰值),所以,在日常运维中不建议人为对这种日志进行操作。
在生产实践中,如果我们不小心删除了xlog日志,又会带来什么样的影响呢?又有什么办法进行恢复呢?
xlog删除场景以及影响
- 数据库正常运行期间删除xlog:
- 删除后数据库持续正常运行:理论上不影响
- 删除后数据库发生正常关闭:可以正常启动数据库,因为正常关机时会执行脏页落盘且恢复最新的一个wal日志,检查点和xlog记录的lsn一致,所以在启动阶段无需做回放,理论上不影响
- 删除后数据库发生异常关闭:无法启动数据库,因为实例恢复阶段没有可用的wal文件,从而导致数据库无法启动
- 数据库关闭状态下删除xlog:无法启动数据库,因为实例恢复阶段没有可用的wal文件,从而导致数据库无法启动
- 删除后数据库持续正常运行:理论上不影响
- 删除后数据库发生正常关闭:可以正常启动数据库,因为正常关机时会执行脏页落盘且恢复最新的一个wal日志,检查点和xlog记录的lsn一致,所以在启动阶段无需做回放,理论上不影响
- 删除后数据库发生异常关闭:无法启动数据库,因为实例恢复阶段没有可用的wal文件,从而导致数据库无法启动
对于数据库能否正常启动,需要分析:
- 需要实例恢复,则需要相应的xlog存在且连续
- 无需实例恢复,需要保证最新的一个wal日志存在
恢复方式
对于误删pg_xlog下的xlog文件导致数据库无法启动的情况,有以下几种恢复策略可供选择:
- 使用归档(需要提前开启归档)
- 使用备机build功能(需要是集群架构)
- 使用物理备份(如果归档记录不全,会有一些数据量丢失,谨慎使用)
- pg_resetxlog(需要保证pg_xlog目录下的文件夹archive_status存在且权限为700,可手搓,恢复后可能会有一些数据量丢失,谨慎使用)