金仓数据库学习笔记之WAL日志
- WAL日志
- WAL 日志的核心作用
- 金仓WAL日志控制参数
- 金仓WAL日志存储位置
- 查看WAL日志步骤
- 1、 登录数据库
- 小 tips:当看到命令前缀显示为:xxx=#时是表示当前ksql使用超级用户system登录xxx数据库,并执行相关sql命令。
- 2、查看WAL日志加密参数,确认WAL日志是否已经被加密
- 3、查看未加密wal日志
- 4、加密wal日志并查看
- 总结
WAL日志
WAL(Write-Ahead Logging,预写式日志)是数据库系统中一种关键的数据持久化和故障恢复机制。其核心思想是:在对数据库的实际数据文件进行修改之前,必须先将这些修改操作完整地记录到日志文件中。
WAL 日志的核心作用
- 保证数据持久性 (Durability):即使数据库在事务提交后、数据页刷盘前发生崩溃,重启后也能通过重放(Redo)WAL 日志来恢复已提交的事务,确保数据不丢失。
- 支持崩溃恢复 (Crash Recovery):数据库异常终止后,重启时会检查 WAL 日志,将已提交但未落盘的事务重做(Redo),将未提交但已部分写入的事务撤销(Undo),使数据库恢复到一致状态。
- 实现数据复制与高可用:WAL 日志记录了数据的增量变化,是流复制(Streaming Replication)、逻辑解码(Logical Decoding)等数据同步技术的基础,用于构建主从架构、读写分离和容灾备份。
- 提升写入性能:通过将随机写转换为顺序写(先写日志),并配合检查点(Checkpoint)机制批量刷脏页,可以显著减少磁盘 I/O 次数,提高数据库的写入吞吐量。
- WAL 日志就是数据库的“操作日记”,它确保了在任何意外情况下,数据库都能“记住”自己应该变成什么样子,从而保障数据的完整性与服务的连续性。
金仓WAL日志控制参数
金仓WAL日志加密控制参数:wal_encryption,该参数为PGC_SIGHUP级别的GUC参数,默认关闭状态。
金仓WAL日志存储位置
金仓数据库wal日志存储在:$KINGBASE_DATA/.wallet目录下的主密钥文件:masterkey.kr文件中。 该主密钥文件在查看加密日志时需要使用。
如:
如果不知道这个$KINGBASE_DATA是什么,可以通过echo命令进行查询:
查看WAL日志步骤
1、 登录数据库
ksql 数据库名 system 用system用户登录数据库
小 tips:当看到命令前缀显示为:xxx=#时是表示当前ksql使用超级用户system登录xxx数据库,并执行相关sql命令。
当看到命令前缀为:XXX=>时则表示当前ksql使用非超级用户登录XXX数据库以执行命令。
2、查看WAL日志加密参数,确认WAL日志是否已经被加密
执行命令:wal_encryption;
off表示是关闭状态。
3、查看未加密wal日志
wal日志记录事务操作,为测试wal日志情况,测试步骤为:创建表格、BEGIN命令开始事务,并执行相关操作:
SELECT txid_current(),sys_current_wal_lsn() ,
sys_walfile_name (sys_current_wal_lsn());
如图:
对数据表执行增删改等操作,并以END结束事务:
上述命令中:
SELECT txid_current(),sys_current_wal_lsn() ,
sys_walfile_name (sys_current_wal_lsn());
涉及了查看 WAL 日志信息的三个关键函数:
| 函数名 | 描述 | 返回值说明 |
|---|---|---|
txid_current() | 查询当前会话正在执行的事务的唯一 ID。 | 返回一个递增的事务 ID (Transaction ID),用于唯一标识一个事务。 |
sys_current_wal_lsn() | 返回当前 WAL 日志的写入位置,即日志序列号 (LSN)。 | 如图返回的LSN 为0/XXXXXXXX,是一个表示 WAL 日志中特定位置的 64 位十六进制数。 |
sys_walfile_name(sys_current_wal_lsn()) | 根据给定的 LSN,返回对应的 WAL 日志文件名。 | 返回形如0000000100000001000000A1的文件名,该文件包含了指定 LSN 所在的 WAL 记录。 |
接着使用wal日志查看命令查看对应日志:sys_waldump -s wal日志序列号 /data/sys_wal/wal日志文件名 -d
-d 选项为:显示日志条目加密状态
将查询到的wal日志序列号以及文件名代入之后可查询到:
查询到的enc:no即表示日志条目未加密。
4、加密wal日志并查看
将wal日志加密需要修改参数:wal_encryption 为 on,并使之生效。
修改参数sql命令为:
ALTER SYSTEM SET wal_encryption TO on;
修改系统参数之后需要重新加载conf文件:
SELECT sys_reload_conf;
操作步骤为:
修改好参数之后,即可重新查询wal日志。
但经常会出现如下错误:
提示找到了加密的日志文件,但没有找到可用的加密key文件。
需要在执行sys_waldump命令 使用 -k选项指定主密钥文件:
** 查询到enc: yes则表示对包含敏感数据的日志条目是加密存储的。 enc: no表示对不包含敏感数据的日志条目是不会加密存储的。**
总结
1、金仓数据库的wal日志加密具有选择性,数据库系统无法自动判断wal日志条目是否包含敏感数据,并对敏感数据条目进行选择能性加密,这种加密模式可有效减少因全量加密带来的性能开销。但加密操作本身是会消耗一定CPU资源的。
2、主密钥文件masterkey.kr非常重要,如果没有该文件则无法解密已加密的wal日志,若该文件丢失则不测再通过sys_waldump解密查看历史的加密wal日志内容。
物理备份时候会因为没有该文件无法解密wal日志而恢复失败。
若没有对于主密钥文件的安全、可靠备份,还会影响流复制备库时无法应用主库加密wal日志导致复制中断。3、wal日志加密后,查询日志时-d 参数输出的enc: yes以及enc:no 分别表示:表示该条 WAL
日志记录已被加密,其描述信息(desc:…)和内容在存储上是密文,无法直接读取。必须使用-k 参数指定正确的主密钥文件才能解密查看。4、wal日志开启加密后需要谨慎关闭,因其存在潜在数据泄露风险,加密功能从开启变成关闭后,若发生全页写则可能会将之前已经加密的wal日志中所修改的数据页包含敏感数据完整映像,以明文形式记录到后续加密的wal日志中,这样敏感数据就可能通过后面的未加密日志泄露了。
生产环境谨慎操作!!!5、wal日志加密与表空间加密、表加密之间的区别主要在于:
WAL日志加密主要是保护数据库的事务日志; 而表空间与表加密则是保护的存储在数据文件中的静态数据,也就是保护的是数据文件。 对于WAL日志进行加密则可以保障在事务日志里面不以明文形式记录数据变更的内容,是在数据变更的过程中提供额外的安全保护层,与静态数据加密共同构成多方位的保护体系。