背景
在数据库系统中,保证数据库可以由错误状态恢复到正确状态的机制,称为备份与恢复。数据库的备份是一个长期的过程,恢复可看作是备份的一个逆过程,恢复的效果、好坏,很大程度上是依赖于备份的策略。此外,数据库管理员在数据恢复时采用的步骤正确与否,将直接影响最终的恢复结果。
WAL日志
WAL即 Write Ahead Log(预写日志),是数据库系统中常见的一种手段,用于保证数据操作的完整性的一种标准方法。其中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被写入。利用WAL日志进行恢复的方法能最大程度上恢复数据库系统未落盘数据,能明显提高数据库可用性和容错容灾能力。
WAL日志机制
在任何时间,优炫数据库在数据集簇目录的ux_wal/子目录下都保持有一个预写式日志(WAL)。该日志存在的目的是为了保证系统崩溃后的安全。如果系统崩溃,可以“重放(replay)”从最后一次检查点以来的日志项来恢复数据库,保证数据一致性。
WAL日志文件默认16MB的情况下,并分为若干页,每页8KB。
熟悉优炫数据库的伙伴们都知道,WAL日志写入是在缓存中进行的,WAL日志在数据库恢复、高可用、流复制、逻辑复制等模块中扮演着极其重要的角色。当库中的数据发生变更时:
change发生时:先要将变更后内容计入WAL buffer中,在将变更后的数据写入data buffer;
commit发生时:WAL buffer中数据刷新到磁盘;
checkpoint发生时:将所有data buffer刷新到磁盘。
为了实现WAL日志的机制,需要保证脏页(Data Buffer中修改过的数据)在刷新到磁盘前,脏页对应的WAL日志记录已经刷新到磁盘中。在事务提交之前,生成该事务提交的日志记录(唯一标示为LSN–Log sequence number)。
LSN可理解为WAL日志记录的在日志中的偏移量。表示XLOG record记录写入到事务日志中位置。LSN的值为无符号64位整型(uint64)。在事务日志中,LSN单调递增且唯一。
基于WAL日志,恢复某时间点或最新时间点,通过命名方式来查找是非常方便。
基于WAL日志优势总结
数据备份恢复。读取WAL日志的内容,可恢复数据库丢失的内容。
减少了写磁盘的次数。在日志提交时,只需把日志文件刷新到磁盘,无需事务修改的所有数据文件,可降低频繁IO对性能的影响。
同步开销小。在多用户环境里,事务的提交可用日志文件一次提交完成,同步日志比同步数据库的开销小。
异步地写入。避免其他服务进程在事务提交时,需要同步写入日志到磁盘,只需在已知时间异步写入即可。