Skip to content

DM 日志系统

达梦数据库的日志系统主要包括以下组件:

  • 重做日志(Redo Log):记录数据库的所有修改操作,用于崩溃恢复和实例恢复
  • 回滚日志(Undo Log):记录数据的旧值,用于事务回滚和MVCC
  • 归档日志(Archive Log):重做日志的副本,用于介质恢复和时间点恢复
  • 日志缓冲区:内存中的日志缓存区域,提高日志写入效率
  • 日志写入机制:控制日志的写入时机和方式

重做日志(Redo Log)

重做日志是达梦数据库日志系统的核心组件,记录了数据库的所有修改操作。

重做日志的作用

  • 确保事务持久性:当事务提交时,将事务的修改写入重做日志,即使系统崩溃,也可以通过重做日志恢复未写入磁盘的数据
  • 支持崩溃恢复:当数据库实例崩溃时,可以通过重做日志恢复到崩溃前的状态
  • 支持实例恢复:当数据库实例异常终止时,可以通过重做日志恢复未写入磁盘的修改
  • 支持介质恢复:当数据文件损坏时,可以通过重做日志和备份文件恢复数据

重做日志的结构

  • 日志文件组:重做日志以日志文件组的形式组织,每个日志文件组包含一个或多个日志文件
  • 日志文件:每个日志文件组包含一个或多个日志文件,这些文件是物理上的文件
  • 日志序列号(LSN):每个日志记录都有一个唯一的日志序列号,用于标识日志记录的顺序
  • 日志块:日志文件被划分为固定大小的日志块,默认大小为512字节

重做日志的管理

  • 日志文件组的创建:使用ALTER DATABASE语句创建日志文件组
  • 日志文件的添加:使用ALTER DATABASE语句向日志文件组添加日志文件
  • 日志文件的切换:当当前日志文件组满时,会自动切换到下一个日志文件组
  • 日志文件的循环使用:日志文件组采用循环使用的方式,当所有日志文件组都满时,会覆盖最早的日志文件组

重做日志的写入机制

  • 日志缓冲区:日志记录首先写入内存中的日志缓冲区
  • 日志写入触发条件:当日志缓冲区满、事务提交或定期(默认3秒)时,会将日志缓冲区的内容写入重做日志文件
  • 日志写入方式:支持同步写入和异步写入,生产环境建议使用同步写入

回滚日志(Undo Log)

回滚日志记录了数据的旧值,用于事务回滚和多版本并发控制(MVCC)。

回滚日志的作用

  • 支持事务回滚:当事务执行ROLLBACK或发生错误时,使用回滚日志恢复数据到事务开始前的状态
  • 支持MVCC:为读事务提供一致的数据视图,允许读事务和写事务并发执行
  • 支持一致性读:确保同一事务中多次读取同一数据时,结果一致

回滚日志的结构

  • 回滚段:回滚日志存储在回滚段中,回滚段是数据库的一个特殊段
  • 回滚段事务表:记录了使用该回滚段的所有事务信息
  • 回滚记录:每个修改操作都会生成一条回滚记录,包含数据的旧值和事务信息

回滚日志的管理

  • 回滚段的创建:系统自动创建回滚段,也可以手动创建
  • 回滚段的分配:当事务开始时,系统会为事务分配一个回滚段
  • 回滚段的扩展:当回滚段空间不足时,会自动扩展
  • 回滚记录的清理:当回滚记录不再被任何事务需要时,会被自动清理

归档日志(Archive Log)

归档日志是重做日志的副本,用于数据库的介质恢复和时间点恢复。

归档模式

达梦数据库支持两种运行模式:

  • 归档模式(Archive Mode):当重做日志切换时,会将当前日志文件的内容归档到归档目录
  • 非归档模式(No Archive Mode):不生成归档日志,只使用重做日志进行恢复

归档模式的优势

  • 支持介质恢复:当数据文件损坏时,可以使用备份文件和归档日志进行恢复
  • 支持时间点恢复:可以恢复到指定的时间点
  • 支持增量备份和恢复:可以基于归档日志进行增量备份和恢复
  • 提高数据安全性:归档日志提供了额外的数据保护

归档日志的配置

配置归档模式的步骤:

  1. 修改dm.ini文件,将ARCH_INI参数设置为1
  2. 创建dmarch.ini文件,配置归档路径和方式
  3. 重启数据库实例
  4. 使用ALTER DATABASE ARCHIVELOG语句启用归档模式

归档日志的管理

  • 归档日志的位置:可以配置归档日志存储在本地目录或远程位置
  • 归档日志的命名:可以配置归档日志的命名规则
  • 归档日志的压缩:可以配置归档日志的压缩,减少存储空间占用
  • 归档日志的清理:需要定期清理过期的归档日志,避免存储空间不足

日志缓冲区

日志缓冲区是内存中的一块区域,用于临时存储重做日志记录,提高日志写入效率。

日志缓冲区的作用

  • 提高日志写入效率:将多个日志记录批量写入磁盘,减少I/O次数
  • 减少磁盘I/O:减少磁盘I/O操作,提高数据库性能
  • 支持事务的快速提交:事务提交时只需要将日志写入日志缓冲区,而不需要立即写入磁盘(取决于日志写入方式)

日志缓冲区的配置

  • 大小配置:通过dm.ini文件中的LOG_BUFFER参数配置,默认大小为16MB
  • 调整建议:根据业务需求调整日志缓冲区大小,对于高并发的事务系统,可以适当增大日志缓冲区

日志缓冲区的刷新机制

日志缓冲区的刷新时机包括:

  • 事务提交:当事务提交时,会将该事务的日志记录刷新到磁盘
  • 日志缓冲区满:当日志缓冲区满时,会将所有日志记录刷新到磁盘
  • 定期刷新:默认每3秒自动刷新一次日志缓冲区
  • 检查点执行:当执行检查点时,会将日志缓冲区的内容刷新到磁盘

日志写入机制

日志写入机制控制日志的写入时机和方式,对于数据库的性能和可靠性有重要影响。

日志写入方式

  • 同步写入:事务提交时,将日志立即写入磁盘,确保事务的持久性,但会影响性能
  • 异步写入:事务提交时,只将日志写入日志缓冲区,然后由后台进程定期写入磁盘,性能较好,但可能会丢失数据

日志写入参数

  • SYNC_COMMIT:控制事务提交时日志的写入方式,0表示异步写入,1表示同步写入
  • FAST_COMMIT:控制是否使用快速提交机制,0表示不使用,1表示使用
  • LOG_WRITE_THREADS:控制日志写入线程的数量,默认值为1

日志写入优化

  • 使用高速存储设备:将日志文件存储在高速存储设备(如SSD)上,提高日志写入性能
  • 合理配置日志缓冲区大小:根据业务需求调整日志缓冲区大小
  • 选择合适的日志写入方式:根据业务对可靠性和性能的要求,选择合适的日志写入方式
  • 优化日志文件大小:将日志文件大小配置为合适的值,减少日志切换频率

日志相关视图

达梦数据库提供了以下视图用于监控和管理日志:

  • V$LOG:查看重做日志文件组的信息
  • V$LOGFILE:查看重做日志文件的信息
  • V$LOG_HISTORY:查看日志切换历史
  • V$ARCHIVED_LOG:查看归档日志的信息
  • V$ARCHIVE_DEST:查看归档目标的信息
  • V$LOG_BUFFER:查看日志缓冲区的使用情况

日志恢复机制

日志恢复是数据库恢复数据的重要机制,包括崩溃恢复、实例恢复和介质恢复。

崩溃恢复

当数据库实例崩溃时,会自动执行崩溃恢复,恢复过程包括:

  1. 重做阶段:使用重做日志恢复所有已提交的事务
  2. 回滚阶段:使用回滚日志回滚所有未提交的事务

实例恢复

当数据库实例异常终止时,会自动执行实例恢复,恢复过程与崩溃恢复类似。

介质恢复

当数据文件损坏时,需要执行介质恢复,恢复过程包括:

  1. 还原备份文件:将备份的数据文件还原到指定位置
  2. 恢复归档日志:应用归档日志,将数据恢复到故障发生前的状态
  3. 恢复重做日志:应用当前重做日志,将数据恢复到最新状态

时间点恢复

时间点恢复是指将数据库恢复到指定的时间点,恢复过程包括:

  1. 还原备份文件:将备份的数据文件还原到指定位置
  2. 恢复归档日志:应用归档日志,将数据恢复到指定的时间点
  3. 停止恢复:在指定的时间点停止恢复过程

日志管理最佳实践

重做日志管理建议

  • 合理配置日志文件大小:将日志文件大小配置为1GB-2GB,减少日志切换频率
  • 配置多个日志文件组:至少配置3个日志文件组,每个日志文件组包含1-2个日志文件
  • 将日志文件分布在不同磁盘:将日志文件分布在不同的磁盘上,提高I/O性能和可靠性
  • 监控日志文件使用率:定期监控日志文件的使用率,及时发现日志文件满的问题

归档日志管理建议

  • 启用归档模式:生产环境建议启用归档模式,确保数据的可恢复性
  • 配置合适的归档路径:将归档日志存储在与数据文件不同的磁盘上,提高可靠性
  • 配置多路归档:将归档日志同时归档到多个位置,提高可靠性
  • 定期清理归档日志:定期清理过期的归档日志,避免存储空间不足
  • 备份归档日志:将归档日志备份到离线存储设备,提高数据安全性

回滚日志管理建议

  • 合理配置回滚段大小:根据事务的大小和并发量,配置合适的回滚段大小
  • 监控回滚段使用率:定期监控回滚段的使用率,避免回滚段空间不足
  • 避免长事务:长事务会占用大量回滚段空间,应尽量避免

日志性能优化建议

  • 使用高速存储设备:将日志文件存储在高速存储设备(如SSD)上
  • 合理配置日志缓冲区大小:根据业务需求调整日志缓冲区大小
  • 选择合适的日志写入方式:根据业务对可靠性和性能的要求,选择合适的日志写入方式
  • 优化事务大小:将大事务拆分为多个小事务,减少日志写入量

版本差异

DM7 日志系统

  • 支持重做日志和回滚日志
  • 支持归档模式和非归档模式
  • 提供了基本的日志管理功能
  • 日志写入机制相对简单

DM8 日志系统

  • 增强了日志写入机制,提高了日志写入效率
  • 改进了日志缓冲区管理,提高了内存利用率
  • 增加了更多的日志监控视图
  • 优化了日志恢复机制,提高了恢复速度
  • 支持更多的归档配置选项

常见问题(FAQ)

Q1: 如何查看当前的日志模式?

A1: 可以使用以下语句查看当前的日志模式:

sql
SELECT ARCH_MODE FROM V$DATABASE;

Q2: 如何切换日志文件组?

A2: 可以使用以下语句手动切换日志文件组:

sql
ALTER SYSTEM SWITCH LOGFILE;

Q3: 如何查看归档日志的位置?

A3: 可以使用以下语句查看归档日志的位置:

sql
SELECT DEST_NAME, DEST_PATH FROM V$ARCHIVE_DEST;

Q4: 如何清理归档日志?

A4: 可以使用以下方法清理归档日志:

  • 使用达梦数据库提供的归档日志清理工具
  • 手动删除过期的归档日志文件
  • 配置归档日志的自动清理策略

Q5: 如何优化日志写入性能?

A5: 优化日志写入性能的方法包括:

  • 使用高速存储设备存储日志文件
  • 合理配置日志缓冲区大小
  • 选择合适的日志写入方式
  • 优化事务大小,减少日志写入量
  • 配置多个日志文件组,减少日志切换频率

Q6: 什么是日志序列号(LSN)?

A6: 日志序列号(LSN)是日志记录的唯一标识符,用于标识日志记录的顺序。每个日志记录都有一个唯一的LSN,LSN值越大,表示日志记录越新。LSN在数据库恢复过程中用于确定恢复的起始点和结束点。