前言
在数据库管理领域,KingbaseES以其卓越的存储架构设计赢得了众多企业级用户的青睐。作为国产数据库的代表,其存储管理机制尤其是控制文件的设计理念,堪称数据库容错设计的典范。

本文将从控制文件的结构和重做日志管理,剖析KingbaseES存储管理的核心------控制文件、日志管理,带友友们掌握关键组件的全生命周期管理。
一、什么是控制文件?重做日志管理又是什么
1.1 控制文件的物理本质
KingbaseES的控制文件是数据库的"数字基因图谱",存储于data/global/sys_control路径下。这个8KB的二进制文件看似小巧,却承载着数据库的"生命密码":
每个KingbaseES都有一个控制文件,它是一个记录数据库内部状态的重要文件。
控制文件中包括:
初始化静态信息
WAL及检查点的动态信息
一些配置信息
当KingbaseES启动时,控制文件必须可供数据库正确读取和写入。如果没有控制文件或控制文件不可读,数据库无法启动。
KingbaseES的控制文件是在初始化数据库的时候创建的。
1.2 控制文件的生命周期三阶段
控制文件的生命周期:
初始化阶段:在initdb过程中自动生成,此时写入系统标识符、默认块大小等基础配置。
运行阶段:通过WalWriter进程持续更新检查点信息,形成"运行日志-控制文件"的双向校验机制。
维护阶段:支持多副本配置,通过control_file_copy参数可指定最多3个同步副本,实现"一主多备"的容错架构。
1.3 重做日志管理
KingbaseES中的重做日志依靠预写式日志(WAL)实现的,它是有多个重做日志段文件组成,这些段文件记录了对数据库页面所做的所有更改,任何还没有被应用到数据页面的改变可以根据其日志记录重做。
1.4 WalWriter进程
WalWriter进程会周期性地将重做日志块写入到磁盘。KingbaseES中,为每个实例分配一个后台进程,所有后台进程采用共享缓存区的方式进行重做日志文件的操作。WalWriter进程可以避免其他服务进程在事务提交时需要将重做日志同步地写入磁盘造成性能下降,事务提交记录不是在提交时同步地写入磁盘,而是在一个已知的预先设置的时间异步地写入。
1.5 重做日志的内容
KingbaseES中,对数据库所有的修改通过重做日志记录的方式放在重做日志中。
重做日志被存放在数据目录的sys_wal目录里,它是作为一个文件段的集合存储的,通常每个段16MB大小(不过这个大小可以通过initdb配置选项--wal-segsize来修改)。每个段分割成多个页,通常每个页为8K(该尺寸可以通过--block-size配置选项来修改)。
每个页中存放多个重做日志记录,重做日志记录内容取决于它记录的事件类型。段文件的名字是不断增长的数字,从000000010000000000000000开始。目前这些数字不能回卷,不过要把所有可用的数字都用光也需要非常非常长的时间。
1.6 KingbaseES数据库如何写入重做日志
KingbaseES中,采用了共享缓存区的方式将重做日志的I/O操作合并在一起。
共享缓存区可以理解为一个环形的共享缓存,每次缓存空间满后,会将头部的页面刷新到磁盘,同时写入新的页面,并将头部往后移动一位。具体来说,需要写入新的日志记录时:
当共享缓存区中有足够的空间,顺序写入到缓存区中。
当共享缓存区写到尾部且空间不足时,从头部刷出信息后重复利用。
KingbaseES数据库一次只使用一个重做日志段文件来存储从重做日志缓冲区写入的重做记录。
日志切换是数据库停止写入当前重做日志段文件并开始写入下一个重做日志段文件。通常,当当前重做日志文件完全填满并且必须继续写入下一个重做日志文件时,会发生日志切换。
回收和未回收的重做日志
KingbaseES数据库一次只使用一个重做日志段文件来存储从重做日志缓冲区写入的重做记录。 在执行检查点之前,从上一个检查点起产生的重做日志是不能被回收或删除的,如果开启了归档模式,重做日志可以正常归档。 执行检查点之后,上一个检查点与此次检查点之间的重做日志可以被回收或删除,具体回收还是删除需要靠配置参数决定。
日志切换与日志序列号
日志切换是数据库停止写入当前重做日志段文件并开始写入下一个重做日志段文件。通常,当当前重做日志文件完全填满并且必须继续写入下一个重做日志文件时,会发生日志切换。
手动的切换日志
当每个新的重做日志记录被写入时,重做日志记录被追加到重做日志中。 插入位置由日志序列号(LSN)描述,该日志序列号是日志中的字节偏移量, 随每个新记录单调递增。
二、控制文件准则
可以通过指南了解控制文件的一些信息。
控制文件路径 不能改变。
控制文件的大小 固定不变的。
2.1 控制文件路径
KingbaseES严格控制文件路径不可变更,这种"路径绑定"策略源于对数据完整性的极致追求:
- 绝对路径约束:所有控制文件必须存放于
data/global目录下,禁止通过符号链接变更存储位置。 - 多副本拓扑:支持配置
control_file_copy参数指定备份路径。 - 磁盘空间预控:通过
kingbase.conf中的control_file_size参数可预设控制文件增长阈值,避免磁盘空间耗尽导致数据库宕机。
2.2 控制文件的大小
KingbaseES中的控制文件的大小是固定不变的。
KingbaseES控制文件在内存中尽量保持小于512个字节以使其适合一个典型的磁盘驱动的物理簇的大小。
KingbaseES控制文件的物理大小是8K,这样做是为了控制文件格式变化时保持物理大小不变。
三、控制文件创建与备份
控制文件在初始化数据库的时候创建
3.1 控制文件创建
控制文件的创建是数据库初始化的核心环节,控制文件内部信息的创建:
初始化命令:
bash
initdb -D /home/kingbase/data --wal-segsize=32 --block-size=8192
控制文件内部信息一部分在初始化时创建,一部分在运行时动态修改。
控制文件的静态信息在初始化时自动生成,运行过程中不允许修改,例如系统标识符。
控制文件的配置信息允许用户在初始化时一次性定制,不再允许修改,例如重做日志段尺寸。
控制文件的WAL及检查点的动态信息,在KingbaseES运行中动态修改。
3.2 备份控制文件
KingbaseES使用基础备份的方式备份控制文件。在基础备份执行的过程中,控制文件随着数据目录一起被备份起来。
通过kingbase.conf的配置来实现控制文件多副本。
kingbase.conf配置:
ini
control_file_copy = '/home/kingbase/control.bk'
副本的创建步骤:
- 数据库关闭状态下拷贝主控制文件至备份路径
- 修改配置文件指定副本路径
- 启动数据库验证副本有效性
故障切换机制:当主控制文件损坏时,可通过副本快速恢复,实现"秒级"故障切换。
基础备份
KingbaseES是使用的"全量+增量"备份策略,控制文件随数据目录同步备份。
基础备份命令
bash
sys_basebackup -D /backup/path -Ft -z -P
全量备份:包含控制文件、数据文件、WAL日志的完整快照;
增量备份:通过WAL日志实现增量备份,结合
archive_command参数可配置归档的策略;压缩传输:
-z参数启用压缩传输,可节省一半以上的存储空间,提升备份效率。
3.3 控制文件恢复
恢复步骤
- 关闭数据库服务
- 拷贝备份控制文件至原路径
- 启动数据库服务
- 验证控制文件有效性
恢复验证机制:通过sys_controldata验证控制文件信息一致性,确保恢复成功。
性能调优:恢复后可执行VACUUM FULL优化数据文件,提升数据库性能。
四、重做日志管理
4.1 重做日志段文件的大小
KingbaseES允许配置重做日志段文件的大小。
在初始化阶段进行配置,通过initdb配置选项--wal-segsize进行选择。
通过 sys_resetwal 工具的选项--wal-segsize进行选择。
4.2 重做日志文件的块大小
KingbaseES允许配置重做日志文件的块大小。
每个重做日志段文件被分割成多个block,默认每个block为8K。该尺寸通过 initdb 配置选项--block-size来修改。
4.3 重做日志文件的数量
KingbaseES允许配置重做日志文件的数量。
KingbaseES中,在执行检查点后会删除或回收不需要的重做日志段文件。可以通过配置参数max_wal_size和min_wal_size来限制检查点后的重做日志段文件的数量。
max_wal_size
在检查点之间允许重做日志增长到的最大尺寸。这是一个软限制, 在特殊的情况下重做文件尺寸可能会超过max_wal_size。如果指定值时没有单位,则以兆字节为单位。默认为 1 GB。增加这个参数 可能导致崩溃恢复所需的时间。这个参数只能在kingbase.conf或者服务器命令行中设置。
min_wal_size
只要重做日志磁盘用量保持在这个设置之下,在检查点时旧的重做日志文件总是被回收以便未来使用,而不是直接被删除。这可以被用来确保有足够的重做日志空间被保留来应付重做日志使用的高峰,例如运行大型的批处理任务。 如果指定值时没有单位,则以兆字节为单位。默认是 80 MB。这个参数只能在kingbase.conf或者服务器命令行中设置。
4.4 重做日志记录延迟拷贝
某一些情况下,一台后备服务器使用主服务器提供的重做日志记录尽快进行恢复。使用数据的延时拷贝可以提供纠正数据丢失错误的机会。
通过kingbase.conf中的配置参数recovery_min_apply_delay,允许备机的恢复延迟一段固定的时间,如果没有指定单位则以毫秒为单位。
需要注意:
只有在事务提交的重做日志记录上才会发生延迟,其他记录还是会被尽可能快地重放。
一旦恢复中的数据库已经达到一致状态,延迟就会产生,直到后备机被提升或者触发。在那之后,后备机将会结束恢复并且不再等待。
修改后,需要重启 standby节点才能生效。
总结
KingbaseES的控制文件设计与重做日志管理充分体现了"工程化、精细化、智能化"的现代数据库设计理念。通过全生命周期的管理规范,既保证了数据库的稳定运行,又为未来的功能扩展预留了充足空间。