暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓数据库系列_ KingbaseES 归档功能详解与配置步骤

1159

金仓数据库 KingbaseES V9 归档设置与恢复模拟测试

一、归档介绍

1.1 数据库归档概念介绍

数据库归档是一项至关重要的数据库管理功能,既能有效保障数据的高可用性,又能显著提升数据库的整体性能。归档的作用主要体现在以下两个方面:

  1. 数据安全与高可用性:通过配置归档功能,数据库系统会持续生成并保存 WAL(Write-Ahead Logging)日志。这些日志记录了数据库的所有变更操作,确保在主机宕机、磁盘故障等灾难性事件发生时,能够使用这些日志恢复数据库至故障前的某个时间点,从而保障数据安全和系统的高可用性。
  2. 性能优化:归档还可以帮助将不常用的历史数据从主数据库中移除,并将其存储在较低成本的存储系统中。这一操作可以有效减轻主数据库的存储压力,减少查询时的负载,进而提升系统的整体性能。同时,归档数据的转移也简化了日常的数据库维护工作。对于不断增长的数据量,定期执行归档操作对保持系统高效运行尤为重要。

通过合理配置归档策略,数据库系统不仅能够确保在灾难恢复中快速响应,还能实现持续高效的运行,同时降低长期的存储成本。

1.2 归档重做日志介绍

归档重做日志(Archived Redo Logs)是数据库系统中一项至关重要的机制,主要用于保障数据的安全性和系统的高可用性,特别是在发生系统故障、崩溃或其他灾难性事件时。归档重做日志为数据库提供了一种可靠的恢复手段,能够帮助系统快速回到故障前的稳定状态。

1.2.1 什么是归档重做日志

归档重做日志是指数据库系统将写满的重做日志文件(Redo Logs)备份到归档存储中,供后续的数据恢复或备份使用。重做日志是数据库系统中记录所有事务操作的核心日志,它确保即便在系统崩溃后,依然可以通过这些日志将数据库恢复到一致的状态。

非归档模式下,重做日志是循环使用的,当日志文件写满时,新生成的日志会覆盖旧日志,从而节约存储空间。然而,在归档模式下,写满的重做日志不会被覆盖,而是被保存到一个指定的归档存储中,形成归档重做日志。这些日志通常被用于长期存储需求和灾难恢复。

1.2.2 归档重做日志的作用

归档重做日志的作用主要体现在以下几个方面:

  1. 数据恢复:在系统崩溃或灾难恢复的情况下,归档重做日志可以帮助将数据库恢复到特定的时间点,确保数据的一致性和完整性。
  2. 备份与恢复的配合:归档重做日志通常与数据库备份结合使用。备份可以提供数据库在某个时间点的快照,而归档日志可以记录从备份时间点之后发生的所有事务变化。通过应用归档日志,系统可以将数据库恢复到最新的状态。
  3. 防止数据丢失:与非归档模式不同,归档模式下的重做日志不会被覆盖,这意味着即便在日志覆盖之前发生故障,归档重做日志依然可以用于恢复,避免数据丢失。
  4. 异地灾备:归档重做日志可以通过网络传输到远程服务器,以支持异地灾难备份方案。即便发生数据中心级别的故障,归档日志仍能确保远程存储的数据完整性,并用于在异地恢复数据库。

1.2.3 归档重做日志的工作原理

  1. 重做日志的生成:数据库系统持续生成重做日志,记录每个事务的变更操作。这些日志会被写入重做日志文件中,直至该文件被写满。
  2. 日志归档:在归档模式下,当一个重做日志文件写满时,系统会将该日志文件归档到指定的存储位置,这些存储可以是磁盘、云存储或远程服务器,形成归档重做日志。
  3. 日志循环使用:一旦重做日志文件成功归档,系统会重新利用该日志文件记录新的事务操作。归档的日志文件则安全地保存在归档存储中,供将来数据恢复或备份时使用。

通过这种工作机制,归档重做日志为数据库系统提供了可靠的日志管理方式,确保数据安全和系统高可用性,同时为灾难恢复、异地备份等方案提供了强有力的支持。

-- 小贴士 WAL 是一种数据写入策略,用于在数据变更之前先将变更写入日志文件(WAL 日志)。它的主要作用有: 1) 数据一致性:通过 WAL,数据库系统在发生崩溃或故障时可以根据日志重放数据,确保数据不会丢失。 2) 性能提升:WAL 允许 PostgreSQL 在提交事务时减少对实际数据文件的同步操作,而是优先将变更写入 WAL 日志,降低对磁盘 I/O 的影响。 3) 崩溃恢复:如果数据库崩溃,WAL 日志可以通过重做(REDO)操作恢复最后一次成功提交的事务。 WAL 日志是以段 (segment) 形式存储的,默认大小是 16MB。这些 WAL 日志会不断生成,记录数据库的所有修改操作。 所有的数据库变更操作首先写入 WAL 日志,无论是否启用了归档。即使没有归档,WAL 日志也会被保存在本地,直到被下一个 WAL 文件覆盖。 WAL 原理简单示意图 +-----------------+ WAL 日志 +-----------------+ | 主数据库运行中 | ------------> | 归档存储位置 | +-----------------+ 归档 WAL 日志 +-----------------+ | | | | V V | 写入磁盘 恢复时重放日志 | | V V 数据文件 WAL 日志

二、金仓数据库归档配置步骤

2.1 查看归档模式

KingbaseES 安装后,默认未开启归档,需要手工开启归档。

[kingbase@testingdb ~]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+--------+----------+-------------+-------------+------------------- kingbase | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | security | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | template0 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system + | | | | | system=CTc/system template1 | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system + | | | | | system=CTc/system test | system | UTF8 | zh_CN.UTF-8 | zh_CN.UTF-8 | (5 rows) -- 查看数据目录 kingbase=# show data_directory; data_directory ------------------------------- /database/kingbase/ES/V9/data (1 row) -- 查看归档模式 off 表示未开启归档 kingbase=# show archive_mode; archive_mode -------------- off (1 row)

image.png

另外还可以通过 SQL 语句查询归档相关信息,如下所示:

[kingbase@testingdb data]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------ archive_command | (disabled) archive_mode | off archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows)

image.png

2.2 开启归档模式

开启归档,需提前做好相关准备工作,包括 创建目录、设置权限和属主、编辑 kingbase.conf 配置文件或通过命令进行设置。

数据库的参数分两种:静态参数、动态参数

静态参数:需要重启数据库才能生效,主要用于底层资源配置。

动态参数:无需重启,运行时可修改,常用于性能优化和灵活调整。

kingbaseES 和归档相关的主要有以下几个参数:

-- archive_mode (静态参数) 用于启用或禁用 WAL 日志归档功能,kingbaseES 包含 on、off、always 三个取值 off:禁用 WAL 归档 on:启用 WAL 归档 always:KingbaseES 特有的扩展,不管是主库还是备库,始终进行 WAL 日志归档 -- archive_command (静态参数) 指定一个 shell 命令,用于将 WAL 日志段复制到一个归档位置,通常是使用 cp 或 rsync -- wal_segment_size (静态参数) 决定了每个 WAL 段文件的大小。默认情况下为 16 MB,可以在初始化数据库集群时进行配置 -- archive_timeout (动态参数) 用于设置将部分已填充的 WAL 段文件写入归档的时间间隔

可通过如下两种方式来开启归档:

方式一:编辑 kingbase.conf 脚本开启归档

-- 使用 kingbase 用户编辑 $PGDATA/kingbase.conf,如下设置 archive_mode = on archive_command = 'DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f'

重启数据库服务

[root@testingdb ~]# systemctl restart kingbased.service

查看归档信息

[kingbase@testingdb data]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------------------------------------------------------------------------------------------------------------ archive_command | DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f archive_mode | on archive_timeout | 10 wal_level | replica wal_segment_size | 16777216 (5 rows) -- 查看归档日志信息 [kingbase@testingdb arch]$ pwd /database/kingbase/ES/V9/arch [kingbase@testingdb arch]$ ls -lrt ./20241009/ total 16384 -rw------- 1 kingbase kingbase 16777216 Oct 9 17:41 000000010000000000000001

image-20241009181517871

方式二:通过 SQL 命令开启归档

[kingbase@testingdb ~]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------ archive_command | (disabled) archive_mode | off archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows) kingbase=# ALTER SYSTEM SET archive_mode = 'on'; ALTER SYSTEM kingbase=# alter system set archive_command = 'DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f'; ALTER SYSTEM kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------ archive_command | (disabled) archive_mode | off archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows) kingbase=# \q

image.png

重启数据库服务

[root@testingdb ~]# systemctl restart kingbased.service

查看归档信息

[kingbase@testingdb ~]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------------------------------------------------------------------------------------------------------------ archive_command | DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f archive_mode | on archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows) kingbase=# show archive_mode; archive_mode -------------- on (1 row)

image.png

archive_timeout 参数是动态参数,可通过 alter system 命令对其进行修改,但修改该值后,如果不加载配置查询到的值仍然是原值,如下所示。

[kingbase@testingdb ~]$ ksql -p 54321 -U system kingbase Password for user system: Type "help" for help. kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------------------------------------------------------------------------------------------------------------ archive_command | DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f archive_mode | on archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows) kingbase=# ALTER SYSTEM SET archive_timeout = '10s'; ALTER SYSTEM kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------------------------------------------------------------------------------------------------------------ archive_command | DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f archive_mode | on archive_timeout | 0 wal_level | replica wal_segment_size | 16777216 (5 rows) -- 因为未重新加载配置,所以 archive_timeout 查询到的值依然是 0 -- 通过 SELECT pg_reload_conf(); 来重新加载配置 kingbase=# SELECT pg_reload_conf(); pg_reload_conf ---------------- t # (t 即 true,表示数据库已经成功重新加载了配置文件) (1 row) kingbase=# SELECT name, setting FROM pg_settings WHERE name IN ('archive_timeout', 'wal_segment_size', 'wal_level', 'archive_mode', 'archive_command'); name | setting ------------------+------------------------------------------------------------------------------------------------------------------ archive_command | DATE=`date +%Y%m%d`; DIR="/database/kingbase/ES/V9/arch/$DATE"; (test -d $DIR || mkdir -p $DIR) && cp %p $DIR/%f archive_mode | on archive_timeout | 10 wal_level | replica wal_segment_size | 16777216 (5 rows) kingbase=# --- 通过上述命令可以发现 archive_timeout 值已修改

image.png

本文通过详尽的介绍,展示了如何在金仓数据库 KingbaseES V9 中配置和使用归档功能。归档不仅是一项提升数据库安全性和高可用性的关键技术,同时也是数据库管理中的一项重要策略。通过归档 WAL 日志,数据库在发生意外时可以迅速恢复到故障前的状态,从而避免数据丢失。合理配置归档不仅能增强系统的容灾能力,还能有效缓解数据库的性能压力,保证系统在日常和极端情况下的平稳运行。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论