0
点赞
收藏
分享

微信扫一扫

金仓数据库事务日志与检查点


  • 事务日志与检查点

WAL文件,在金仓数据库中,事务日志文件称为Write Ahead Log(预写式日志,简称WAL)。

WAL存储了数据库系统中所有更改和操作的历史,相当于Oracle的REDO。

WAL机制是在这个写数据的过程中加入写对应wal log的过程。

WAL文件的默认存放位置是./data/sys_wal

一、查看WAL文件总大小

1、在KES服务器端查看

统计WAL段个数,通过日志个数和每个日志的大小计算日志总大小

金仓数据库事务日志与检查点_postgresql

2、在客户端查看

通过脚本查看WAL文件总大小

金仓数据库事务日志与检查点_数据库_02

 

 

  • WAL日志的切换

KES将xlog记录写入sys_wal子目录的WAL段文件中,默认情况下,每个WAL段文件大小是16MB,当出现下列情况时,WAL段就会发生切换。

  1. WAL段文件被写满。
  2. 启用了archive_mode,且超过了archive_timeout的时间。
  3. 执行函数sys_switch_wal。
  4. WAL段文件被写满自动切换。

1、查看系统当前WAL段。

金仓数据库事务日志与检查点_服务器_03

 

  1. 执行DML操作,产生日志,使WAL段写满后生成新的WAL段
  1. 创建测试表。

金仓数据库事务日志与检查点_服务器_04

 

  1. 插入数据

金仓数据库事务日志与检查点_国产数据库_05

 

  1. 查看系统当前WAL段

金仓数据库事务日志与检查点_金仓数据库_06

 

2、archive_timeout超时自动切换

1、配置归档参数。

在/KingbaseES/V8/data/kingbase.conf文件结尾添加下列语句:

金仓数据库事务日志与检查点_postgresql_07

然后创建在/KingbaseES/V8/data/目录下创建archive.conf 文件

(1)设置日志级别参数。

(2)设置归档命令参数archive_command,归档位置为/archive。

(3)设置开启归档模式参数archive_timeout为on。

(4)设置强制归档时间参数archive_timeout为1分钟。

添加下列参数:

金仓数据库事务日志与检查点_金仓数据库_08

 

重启数据库使归档参数生效。

2、使用循环,不断产生数据活动。

金仓数据库事务日志与检查点_金仓数据库_09

 

注意:

定时归档可以在一定程度上降低数据丢失风险,但是不要将archive_timeout参数设置的过短,这样会产生大量的WAL段文件,因为无论是否有业务发生,系统在达到archive_timeout时间隔离后都会切换WAL段文件,占用大量磁盘空间。

3、使用sys_switch_wal函数手动切换

查看系统当前正在使用的WAL文件

金仓数据库事务日志与检查点_金仓数据库_10

 

切换WAL段文件

金仓数据库事务日志与检查点_国产数据库_11

 

查看系统当前正在使用的WAL文件,已经被切换(有问题)

三、清理WAL日志

如果遇到WAL不能被收回或不能被重复利用导致空间不足问题,紧急情况下需要清理wal日志。

清理步骤:

  1. 一致性关闭数据库

清理日志前

金仓数据库事务日志与检查点_postgresql_12

 

  1. 删除WAL文件
  1. 使用sys_controldata命令获取最新的检查点的事物号和对象号

金仓数据库事务日志与检查点_服务器_13

 

  1. 第一步得到的结果作为参数,使用sys_resetwal删除WAL文件。

金仓数据库事务日志与检查点_金仓数据库_14

 

  1. 启动数据库服务

删除后

金仓数据库事务日志与检查点_金仓数据库_15

 

四、日志挖掘

金仓数据库提供了日志跟踪和挖掘工具sys_waldump,例:对表执行相关的修改操作后查看日志内容。

  1. 创建测试表

金仓数据库事务日志与检查点_金仓数据库_16

 

  1. 执行DML操作

显示开启事务,向表中插入数据、更新数据、删除数据,记录事务号和执行上述操作前的LSN。

金仓数据库事务日志与检查点_服务器_17

 

  1. 用sys_waldump挖掘日志位置的内容

金仓数据库事务日志与检查点_服务器_18

 

从以上看出输出内容可以看到wal日志中包含commit等操作

总结

  • WAL文件名称规则

WAL文件名称由三段8位的16进制数组成:前8个16进制字符:00000004表示timeline(时间轴)、中间8个16进制字符:00000000表示logid、最后8个16进制字符:00000046表示logseg,Logseg前6个16进制字符始终为0.

金仓数据库事务日志与检查点_国产数据库_19

 

  • 相关函数、命令
  1. 相关命令

金仓数据库事务日志与检查点_服务器_20

金仓数据库事务日志与检查点_postgresql_21

 

 

  1. 相关函数

金仓数据库事务日志与检查点_数据库_22

 

金仓数据库事务日志与检查点_数据库_23

 

金仓数据库事务日志与检查点_服务器_24

 

  • 实例恢复概述
  1. 数据库把每项操作记录到重做日志中。
  2. 当实例重新启动后,会重做(replay)这些日志让实例恢复到异常终止时的状态,这个动作通常称为”前滚”。
  3. “前滚”完成后,多数数据库还会把未完成的事物取消掉,就像这些事务从来没有执行过一样。这个动作称为回滚。
  4. 在前滚过程中,数据库是不能被用户访问的。
  5. 什么时候需要实例恢复?

当数据库实例异常终止后,重启实例会恢复到被异常终止时的状态。

  1. 异常终止时是什么状态?
  2. 内存中有脏块未来得及作最后一次检查点即关闭。
  3. 此时redo file比data file新鲜。
举报

相关推荐

0 条评论