GaussDB 预写日志回收参数设置
1 问题现象
在GaussDB数据库运行过程中,会出现大量日志,既有保证数据库安全可靠的wal日志(预写式日志,也称为Xlog),也有用于数据库日常维护的运行和操作日志等。在数据库发生故障时,可以参考这些日志进行问题定位和数据库恢复的操作。在这篇文章中详细讲述wal相关内容与演示日志回收几个参数设置。
2 技术背景
预写式日志wal(Write Ahead Log,也称为Xlog)是指如果要修改数据文件,必须是在这些修改操作已经记录到日志文件之后才能进行修改,即在描述这些变化的日志记录刷新到永久存储器之后。在系统崩溃时,可以使用wal日志对GaussDB数据库进行恢复操作。
为了避免随机I/O写性能过低的情况,会先将事务的数据库修改写入一个顺序追加的wal日志文件中,由于写日志文件是顺序I/O操作,可以达到一个很高的性能。
当系统崩溃发生时,数据库可以通过日志中记录的数据变化恢复系统崩溃前的操作。在日志回放的过程中,数据库会根据日志记录的先后顺序,依次读取每个日志的内容,然后判断该日志记录的事务对数据库数据文件的修改是否和当前相关数据文件的内容一致。如果一致,说明数据库停机之前的修改已经写入数据文件中,该日志修改无须回放;如果不一致,则说明数据库停机之前的修改还没有写入数据文件中,上次数据库停机可以是异常宕机导致,该日志对应的事务操作需要重新在相关数据文件中执行,才能保证恢复成功。
wal日志实际默认被划分为16M大小的一系列文件,这些文件默认存储在数据目录的pg_xlog子目录下,被称为wal段(WAL Segment),Checkpoint线程将日志数据写入到WAL BUFFER中,由后台wal日志线程异步刷盘。
其中,Checkpoint是wal日志中的一个位点,在这个点位之前数据库中的所有数据和wal中反映的信息相同(即可以认为这个点位前的数据已经落盘到数据文件中了)。Checkpoint也是一个操作,这个操作会往wal日志里写checkpoint位点。主要作用:
1、记录redo point,标记redo point之前的数据均已刷脏,完成持久化存储;
2、标记redo point之前的wal日志可以被清理加收;
3、脏页刷盘
GaussDB数据库中Checkpoint分全量和增量,内部使用的是增量Checkpoint,1分钟执行1次。全量Checkpoint,Checkpoint期间会将缓存中脏页全部下刷落盘,导致I/O紧张,影响正常业务;不能频繁触发,redo推进慢时,宕机后redo的时间会变长。
对于增量Checkpoint,缓冲区脏页按顺序放到一个缓存队列,后台wal日志线程会依照顺序依次刷盘,Checkpoint根据刷页进度推进redo点;频率不受限制,及时推进,降低RTO。wal日志对数据库异常恢复有重要的作用,建议定期对WAL日志进行备份。
3 WAL日志相关参数
wal日志主要有以下几个相关参数:
参数名称 | 参数说明 | 取值范围 |
wal_level | 设置写入WAL信息量的级别,不能为空或被注释掉 须知:
|