相关概念¶
事务日志管理作为神通数据库系统管理支持的重要功能,一方面负责支持事务的原子性、一致性及持久性,保证数据库系统在发生语句错误、实例故障等情况下能够快速使系统恢复到一致的状态,另一方面也为用户提供了安全、可靠的离线/在线备份恢复功能,保证数据库系统在发生介质故障时能快速还原到以前的备份时点,尽可能减少数据的丢失带来的损失。
事务日志管理的基础就是在线日志,它包括一个或多个在线日志文件,在这些文件中存储自文件产生以来对数据库所作的所有修改,神通数据库中的每个实例都有一个相关联的在线日志,目的是保护数据库防止实例失败。
在线日志文件¶
在线日志文件是事务日志存储的载体。事务日志用来描述对数据库中数据段块的一种修改。当做数据库恢复时,神通数据库将读取事务日志并修改相应数据。在线日志文件可以在创建时设置是否自动扩展及扩展参数。
日志段是日志空间管理的主要载体,根据是否为创建文件时创建分为内生段和扩展段。日志文件中以段为单位管理空间,日志回刷时查找可用段进行写入日志数据,日志收缩时根据参数从文件尾部查找未用的扩展段收缩。
日志块是日志空间管理的最小单位,日志段由若干个日志块组成,日志回刷时以块为单位写入数据。
日志序列号(LSN)是日志数据的唯一标识。在实例或介质恢复过程中,通过使用所需的归档日志和在线日志的日志序列号,神通数据库将以升序的日志序列号顺序正确应用重做日志文件。
数据校验和是日志块中数据正确与否的检测依据。神通数据库在写入任何日志块时都将首先计算日志块的校验和,并将校验和写入日志块中。下一次神通数据库读取某一日志块时,将使用校验和来检测该日志块的正确性。若检查校验和失败,神通数据库将返回错误信息。
日志缓冲区¶
事务日志写缓冲区:为保证事务日志写操作性能,神通数据库在内存中开辟一块缓冲区专门用于存放上层写入的日志,待必要时由回刷线程将缓冲区中的内容写到在线日志文件中。配置参数LOG_WRITE_BUFFER_PAGES用于设置日志写缓冲区页数,默认为0x20000,在大事务操作中,增加写缓冲区页数,可以提高性能。
事务日志读缓冲区:为保证事务日志读操作性能,神通数据库在内存中开辟一块缓冲区专门用于存放从文件中读取的日志,用于系统启动时的实例恢复、事务Undo、归档物理恢复。配置参数LOG_READ_BUFFER_PAGES用于设置日志读缓冲区页数,默认为0x10000,在大事务回滚时,增加读缓冲区页数,可以提高性能。
日志回刷机制¶
神通数据库采用循环方式在日志缓冲区中进行事务日志缓冲,并且由后台日志回刷线程(LFT,Log Flush Thread)回写入当前活动的在线日志文件。
LFT以块为单位回写日志缓冲区的数据到日志文件。回写时,首先判断当前日志段是否存有日志空间,如果没有,则需要查找一个新的可重用日志段。日志段的选取原则是:优先考虑使用内生段,这可以使扩展段有机会被收缩;采用顺时针循环查找策略,这可以尽量保证磁头连续地向一个方向移动。
日志回刷线程LFT每隔一定的时间间隔回写日志缓冲区中的日志信息到当前活动的在线日志文件中,可以通过设置DB_CFG_LOG_FLUSH_INTERVAL配置参数控制LFT检查日志缓冲区的时间间隔。
提交事务时,LFT会将事务的所有重做记录从日志缓冲区写入到当前活动的在线日志文件中。只有事务的所有日志记录都安全的回写到磁盘,用户进程才会被告知事务已经提交。
如果日志缓冲区已满,或者提交了另外一个事务,LFT也会将重做日志缓冲区中所有重做日志条目刷新到当前活动的在线日志文件中。
日志文件空间管理¶
神通数据库可以通过日志扩展与收缩管理在线日志文件空间。
在日志回刷时,如果出现日志文件空间不足,神通数据库会根据创建文件时设置的初始大小、自动扩展参数和最大日志文件大小进行日志扩展,允许自动扩展需要在创建日志文件时开启自动扩展选项AUTOEXTEND,默认为ON。
如果发生了扩展,则在一段时间后要尽量将扩展的日志空间收缩到初始状态。 神通数据库提供两种手段进行日志收缩:
- 自动收缩,在线日志空间的使用率低于一定的阈值时进行自动收缩。 需要在数据库运行时开启 SHRINKLOG 命令为 ALTER DATABASE SHRINKLOG [ ON | OFF ]; 默认为 ON。
- 强制收缩,可通过 ALTER SYSTEM SHRINKLOG percent%; 强制收缩日志空间。