一、说明
sys_rewind—把一个 KingbaseES 数据目录与另一个从该目录中复制出来的数据目录同步
sys_rewind 是用于在集簇的时间线分叉以后,同步一个 KingbaseES 集簇和同一集簇的另一份拷贝的工具。一
种典型的场景是让一个故障后的旧主服务器重新上线为一个备服务器,并且使该备机跟随新的主机。
其结果等效于把目标数据目录替换成源数据目录。关系文件中只有更改过的块才会被拷贝,所有其他的文件会被
整个拷贝,包括配置文件。
sys_rewind 比起做一个新的基础备份或者 rsync 等工具的优势在于,sys_rewind 不要求通读集簇中未更改的
块。这使得它在数据库很大并且在集簇间只有小部分块不同时速度很快。
sys_rewind 检查源集簇和目标集簇的时间线历史来判断它们在哪一点分叉,并且期望在目标集簇的 sys_wal 目
录中找到 WAL 来返回到分叉点。
分叉点可能会在目标时间线、源时间线或者它们的共同祖先上找到。在典型的失效场景中,目标集簇在分叉后很
快就被关闭,这不是问题,但是如果目标集簇在分叉后已经运行了很长时间,旧的 WAL 文件可能已经不存在了。
在这样的情况下,它们可以被手工从 WAL 归档复制到 sys_wal 目录,或者通过配置 primary_conninfo 或 re�store_command 在启动时取得。
sys_rewind 的使用并不限于失效的场景,例如一个后备服务器可能被提升、运行一些写事务,然后被倒回再次
成为一个后备。当目标服务器在运行了 sys_rewind 之后第一次启动时,它将进入到恢复模式并且重放源服务器在分
叉点之后产生的所有 WAL。
当 sys_rewind 被运行时有某些 WAL 在源服务器上不可用,并且因此无法被 sys_rewind 会话所复制,则在目
标服务器被启动时必须让这些 WAL 可用。
这可以通过在目标数据目录中创建一个 recovery.signal 文件以及在 kingbase.conf 中配置合适的 re�store_command 来实现。
sys_rewind 要求目标服务器在 kingbase.conf 中启用了 wal_log_hints 选项,或者在用 initdb 初始化集簇时
启用了数据校验。目前默认情况下这两者都没有被打开。full_page_writes 也必须被设置为 on,这是默认的。
警告: 如果在处理时 sys_rewind 失败,则目标的数据目录很可能不在可恢复的状态。在这种情况下,推荐
创建一个新的备份。
如果 sys_rewind 发现它无法直接写入的文件,它将立刻失败。例如当源服务器和目标服务器为只读的
SSL 密钥及证书使用相同的文件映射,就会发生这种情况。如果在目标服务器上存在这样的文件,推荐在运行
sys_rewind 之前移除它们。
在做了 rewind 之后,一些那样的文件可能已经被从源服务器拷贝,这样就有必要移除已经拷贝的数据并且
恢复到 rewind 之前使用的链接集合。
如果一个数据库通过 sys_rewind 进行了恢复,在数据库没有启动的情况下,不能再次通过 sys_rewind 进
行恢复。
二、 命令行参数
sys_rewind [option...] { -D | --target-kingbase_data } directory { --source-kingbase_data=directory |
--source-server=connstr }
9.3 参数说明
sys_rewind 接受下列命令行参数:
-D directory --target-kingbase_data=directory
这个选项指定要与源数据目录同步的目标数据目录。在运行 sys_rewind 之前目标服务器必须被干净地关
闭。
--source-kingbase_data=directory
指定要和目标服务器同步的源服务器的数据目录的文件系统路径。这个选项要求源服务器必须被干净地关
闭。
--source-server=connstr
指定一个 libkci 连接串用于连接要与目标服务器同步的源 KingbaseES 服务器。该连接必须是正常的 (非
复制的) 连接,其角色具有足够的权限来执行源服务器上 sys_rewind 的使用功能或超级用户角色。此选
项要求源服务器处于运行状态,且不处于恢复模式。
-k --key-path
指定主密钥文件路径,解析被加密的 WAL 日志时需从主密钥文件获取解密密钥。如果不设置此参数,会
从默认的路径获取主密钥文件,如果默认路径下的主密钥文件也不存在,会停止。
-n --dry-run
做除了实际修改目标目录之外的其他所有事情。
-N --no-sync
默认情况下,sys_rewind 将等待所有文件安全写入磁盘。这个选项会导致 sys_rewind 不需要等待就返
回,这样会更快,但是这意味着后续的操作系统崩溃会导致同步数据目录损坏。通常,此选项对测试很有
用,但在创建生产安装时不应使用。
-P --progress
启用进度报告。在从源集簇拷贝数据时,打开这个选项将会发送一个近似的进度报告。
--debug
打印冗长的调试输出,这主要对于调试 sys_rewind 的开发者有用。
-V --version
显示版本信息然后退出。
-? --help
显示帮助然后退出。
四、用户权限要求
当使用集群主机作为源执行 sys_rewind 时,可以使用具有足够权限的用户来执行 sys_rewind,而不是超级用
户。下面是如何创建一个名为 rewind_user 的用户:
CREATE USER rewind_user LOGIN;
GRANT EXECUTE ON function sys_catalog.sys_ls_dir(text, boolean, boolean) TO rewind_user;
GRANT EXECUTE ON function sys_catalog.sys_stat_file(text, boolean) TO rewind_user;
GRANT EXECUTE ON function sys_catalog.sys_read_binary_file(text) TO rewind_user;
GRANT EXECUTE ON function sys_catalog.sys_read_binary_file(text, bigint, bigint, boolean) TO rewind_user;
五、 SYS_REWIND的工作原理
当使用集群主机作为源执行 sys_rewind 时,有必要在执行完成后执行 CHECKPOINT, 其控制文件反映了最新的时
间线信息。
5、1 如何工作
其基本思想是从源集簇拷贝所有文件系统级别的改变到目标集簇:
1. 以源集簇的时间线历史从目标集簇分叉出来的点之前的最后一个检查点为起点,扫描目标集簇的 WAL 日志。
对于每一个 WAL 记录,读取每一个更改过的数据块。这会得到在目标集簇中从源集簇被分支出去以后所有更
改过的数据块列表。
2. 使用直接的文件系统访问(--source-kingbase_data)或者 SQL(--source-server),把所有那些更改过的
块从源集簇拷贝到目标集簇。
3. 把所有其他诸如 sys_xact 和配置文件(除了关系文件之外所有的东西)从源集簇拷贝到目标集簇。与基础备
份类似,在从源集簇拷贝的数据中,目录 sys_dynshmem/、sys_notify/、sys_replslot/、sys_serial/、
sys_snapshots/、sys_stat_tmp/以及 sys_subtrans/的内容会被忽略。任何以 kingbase_tmp 开始的文件或
目录都会被忽略,backup_label、tablespace_map、sys_internal.init、kingbase.opts 以及 kingbase.
pid 也是这样。
4. 从源集簇应用 WAL,从失效处创建的检查点开始(严格来说,sys_rewind 并不应用 WAL,它只是创建一个备