一、sys_controldata功能概述
1、sys_controldata是Kingbase ES数据库中的一个工具,用于查看数据库的控制文件信息。控制文件是记录数据库集群状态信息的重要文件,包括版本信息、文件信息、检查点信息、事务状态信息等。sys_controldata主要功能如下图
2、sys_controldata能够以用户可读的形式打印出指定数据目录的控制文件内容,通常位于data/global目录下,名为sys_control。
[kingbase@Node1 ~]$ [kingbase@Node1 ~]$ ls $KINGBASE_DATA/global/ 1136 1214 1260_vm 2023 2672 2846 3593 4179 4186 6127 8042 sys_filenode.map 1136_fsm 1214_fsm 1261 2121 2676 2847 4060 4180 6000 6127_fsm 8046 sys_internal.init 1136_vm 1214_vm 1261_fsm 2396 2677 2964 4061 4181 6001 6127_vm 8048 1137 1232 1261_vm 2396_fsm 2694 2965 4175 4182 6002 6144 8059 1213 1233 1262 2396_vm 2695 2966 4176 4183 6100 6145 8074 1213_fsm 1260 1262_fsm 2397 2697 2967 4177 4184 6114 7968 8076 1213_vm 1260_fsm 1262_vm 2671 2698 3592 4178 4185 6115 7969 sys_control [kingbase@Node1 ~]$
二、sys_controldata常用功能
使用sys_controldata时,可以通过命令行参数指定数据目录,如果未指定则默认使用环境变量KINGBASE_DATA来找到对应数据目录。
1、查看sys_controldata 支持的参数
代码如下:
[kingbase@Node1 ~]$ [kingbase@Node1 ~]$ sys_controldata --help sys_controldata 显示 Kingbase 数据库簇控制信息. 使用方法: sys_controldata [选项][数据目录] 选项: [-D, --kingbase-data=]DATADIR data directory -V, --version 输出版本信息, 然后退出 -?, --help 显示此帮助, 然后退出 If no data directory (DATADIR) is specified, the environment variable KINGBASE_DATA is used. 报告错误至 <kingbase-bugs@kingbase.com.cn>. [kingbase@Node1 ~]$
2、查看数据库test的控制文件信息,可以使用以下命令:
说明:sys_controldata后未跟DATA时,默认是$KINGBASE_DATA
代码如下:
[kingbase@Node1 ~]$ [kingbase@Node1 ~]$ sys_controldata sys_control 版本: 1201 Catalog 版本: 202305151 数据库系统标识符: 7374074518301680068 数据库簇状态: 在运行中 sys_control 最后修改: 2024年06月09日 星期日 20时35分40秒 最新检查点位置: 0/1F9E11F0 最新检查点的 REDO 位置: 0/1F9E11C0 最新检查点的重做日志文件: 00000001000000000000001F Latest checkpoint's WalTimeLineID: 1 最新检查点的PrevTimeLineID: 1 最新检查点的full_page_writes: 开启 最新检查点的NextXID: 0:95652 最新检查点的 NextOID: 65564 最新检查点的NextMultiXactId: 1 最新检查点的NextMultiOffsetD: 0 最新检查点的oldestXID: 1012 最新检查点的oldestXID所在的数据库:1 最新检查点的oldestActiveXID: 95652 最新检查点的oldestMultiXid: 1 最新检查点的oldestMulti所在的数据库:1 最新检查点的oldestCommitTsXid:0 最新检查点的newestCommitTsXid:0 最新检查点的时间: 2024年06月09日 星期日 20时35分36秒 不带日志的关系: 0/3E8使用虚假的LSN计数器 最小恢复结束位置: 0/0 最小恢复结束位置时间表: 0 开始进行备份的点位置: 0/0 备份的最终位置: 0/0 需要终止备份的记录: 否 arg setting: replica wal_log_hints设置: 开启 max_connections设置: 100 max_worker_processes设置: 8 max_wal_senders设置: 32 max_prepared_xacts设置: 100 max_locks_per_xact设置: 64 track_commit_timestamp设置: 关闭 最大数据校准: 8 数据库块大小: 8192 大关系的每段块数: 131072 WAL的块大小: 8192 每一个 WAL 段字节数: 16777216 标识符的最大长度: 64 在索引中可允许使用最大的列数: 32 TOAST区块的最大长度: 1988 大对象区块的大小: 2048 日期/时间 类型存储: 64位整数 正在传递Flloat4类型的参数: 由值 正在传递Flloat8类型的参数: 由值 数据页校验和版本: 1 数据页校验和算法设备: 0 当前身份验证: 8eeeafdeadb9df6038e126a420519017c75e5424fcb826289e97f2d984a5e29c 数据库模式: 1 身份验证方法模式: 0 [kingbase@Node1 ~]$
三、修改控制文件路径
3.1、启用/Kingbase/ES/V9/cluster/global_backup/sys_controldata,并在在/Kingbase/ES/V9/cluster目录下新建目录global_backup,并设置属主、属组、权限
代码如下:
[kingbase@Node1 ~]$ [kingbase@Node1 ~]$ sudo mkdir /Kingbase/ES/V9/cluster/global_backup [kingbase@Node1 ~]$ [kingbase@Node1 ~]$ sudo chown -R kingbase:kingbase /Kingbase/ES/V9/cluster/global_backup [kingbase@Node1 ~]$ [kingbase@Node1 ~]$ sudo chmod -R 777 /Kingbase/ES/V9/cluster/global_backup [kingbase@Node1 ~]$
3.2、修改kingbase.conf,设置control_file_copy参数
代码如下:
[kingbase@node1 ~]$ [kingbase@node1 ~]$ echo "control_file_copy = '/Kingbase/ES/V9/global_backup/sys_control'" >> /Kingbase/ES/V9/data/kingbase.conf [kingbase@node1 ~]$
3.3、重新启动数据库
代码如下:
[kingbase@node1 ~]$ sys_ctl start 等待服务器进程启动 ....2024-06-10 07:48:35.221 CST [5507] 日志: sepapower扩展初始化完成 2024-06-10 07:48:35.230 CST [5507] 日志: 正在启动 KingbaseES V009R001C001B0025 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit 2024-06-10 07:48:35.234 CST [5507] 日志: 正在监听IPv4地址"0.0.0.0",端口 54321 2024-06-10 07:48:35.234 CST [5507] 日志: 正在监听IPv6地址"::",端口 54321 2024-06-10 07:48:35.240 CST [5507] 日志: 在Unix套接字 "/tmp/.s.KINGBASE.54321"上侦听 2024-06-10 07:48:35.333 CST [5507] 日志: 日志输出重定向到日志收集进程 2024-06-10 07:48:35.333 CST [5507] 提示: 后续的日志输出将出现在目录 "sys_log"中. 完成 服务器进程已经启动
3.4、验证control_file_copy参数是否生效
代码如下:
[kingbase@node1 ~]$ ksql test system -c 'show control_file_copy' 用户 system 的口令: control_file_copy ------------------------------------------- /Kingbase/ES/V9/global_backup/sys_control (1 行记录)
四、重建控制文件
4.1、模拟控制文件损坏
4.1.1、修改kingbase.conf,设置control_file_copy参数
代码如下:
[kingbase@node1 ~]$ echo "control_file_copy = ''" >> $KINGBASE_DATA/kingbase.conf
4.1.2、使用system用户登录test数据库
代码如下:
[kingbase@node1 ~]$ ksql -Usystem -dtest 用户 system 的口令: 输入 "help" 来获取帮助信息.
4.1.3、向表t01插入测试数据并查看
代码如下:
test=# Create table t01(id int); CREATE TABLE test=# INSERT INTO t01 VALUES(3); INSERT 0 1 test=# SELECT * FROM t01; id ---- 3 (1 行记录) test=#
4.1.4、删除$KINGBASE_DATA/global/目录下的控制文件sys_control
代码如下:
test=# \! rm $KINGBASE_DATA/global/sys_control
4.1.5、手动触发检查点(数据库崩溃)
代码如下:
test=# checkpoint; 警告: 中断联接, 因为其它服务器进程崩溃 描述: The kingbase has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 提示: 一会儿你将可以重联接数据库并且重复你的命令. 服务器意外地关闭了联接 这种现象通常意味着服务器在处理请求之前 或者正在处理请求的时候意外中止
4.1.6、启动数据库(数据库无法启动)
代码如下:
[kingbase@node1 ~]$ sys_ctl start sys_ctl: 其他服务器进程可能正在运行; 尝试启动服务器进程 等待服务器进程启动 ....kingbase: could not find the database system Expected to find it in the directory "/Kingbase/ES/V9/data", but could not open file "/Kingbase/ES/V9/data/global/sys_control": 没有那个文件或目录 已停止等待 sys_ctl: 无法启动服务器进程 检查日志输出. [kingbase@node1 ~]$
4.2、查找wal文件
- 确定新的wal最小的起始位置(-l参数的值)
- 查找$KINGBASE_DATA/sys_wal目录下的最大日志文件编号
- 最大编号加1得到wal最小的起始位置
代码如下:
[kingbase@Node1 /]$ ls -l $KINGBASE_DATA/sys_wal 总用量 540680 -rw------- 1 kingbase kingbase 16777216 5月 28 23:37 000000010000000000000002 ........................................................................... -rw------- 1 kingbase kingbase 16777216 6月 1 23:21 00000001000000000000001A -rw------- 1 kingbase kingbase 16777216 6月 1 23:21 00000001000000000000001B -rw------- 1 kingbase kingbase 371 6月 1 23:21 00000001000000000000001B.00000028.backup -rw------- 1 kingbase kingbase 16777216 6月 4 22:55 00000001000000000000001C -rw------- 1 kingbase kingbase 16777216 6月 8 23:07 00000001000000000000001D -rw------- 1 kingbase kingbase 16777216 6月 8 23:08 00000001000000000000001E -rw------- 1 kingbase kingbase 16777216 6月 9 21:43 00000001000000000000001F -rw------- 1 kingbase kingbase 16777216 6月 9 21:47 000000010000000000000020 -rw------- 1 kingbase kingbase 16777216 6月 9 21:53 000000010000000000000021 -rw------- 1 kingbase kingbase 16777216 6月 9 22:28 000000010000000000000022 drwx------ 2 kingbase kingbase 4096 6月 9 21:53 archive_status
4.3、确认下一个事务ID
- 确定下一个事务id(-x参数的值)
- 查找$KINGBASE_DATA/sys_xact目录下的最大编号为0000
- 最大编号加1,再在末尾补位00000,得到下一个事务id
代码如下:
[kingbase@Node1 /]$ ls -l $KINGBASE_DATA/sys_xact/ 总用量 256 -rw------- 1 kingbase kingbase 262144 6月 9 21:53 0000
4.4、确定下一个多事务ID和最旧的多事务ID
- 确定下一个多事务ID和最旧的多事务ID(-m参数的值)
- 查找$KINGBASE_DATA/sys_multixact/offsets目录下的最大编号为0000和最小编号0000
- 最大编号加1,再在末尾补位0000,得到下一个多事务ID
- 最小编号在末尾补位0000,得到下一个最旧的多事务ID
- 下一个最旧的多事务ID不能为0,如果为0进行加1处理
代码如下:
[kingbase@Node1 /]$ [kingbase@Node1 /]$ ls -l $KINGBASE_DATA/sys_multixact/offsets/ 总用量 8 -rw------- 1 kingbase kingbase 8192 6月 9 21:53 0000 [kingbase@Node1 /]$
4.5、确定下一个多事务偏移量
- 确定下一个多事务偏移量(-O参数的值)
- 查找$KINGBASE_DATA/sys_multixact/members目录下的最大编号为0000
- 最大编号加1,然后乘以0xCC80,得到下一个多事务偏移量
代码如下:
[kingbase@Node1 /]$ ls -l $KINGBASE_DATA/sys_multixact/members/ 总用量 8 -rw------- 1 kingbase kingbase 8192 5月 28 23:35 0000
4.6、在$KINGBASE_DATA/global目录下创建空控制文件sys_control
代码如下:
[kingbase@Node1 /]$ [kingbase@Node1 /]$ touch $KINGBASE_DATA/global/sys_control
4.7、删除$KINGBASE_DATA目录下的kingbase.pid文件
代码如下:
[kingbase@Node1 /]$ [kingbase@Node1 /]$ rm -rf $KINGBASE_DATA/kingbase.pi d
4.8、执行sys_resetwal重建控制文件
代码如下:
[kingbase@Node1 /]$ [kingbase@Node1 /]$ sys_resetwal -l 000000010000000000000022 -x 0x000100000 -m 0x000100000,0x00000001 -O 0xCC80 -f -D /Kingbase/ES/V9/cluster/data -g 1 重置预写日志
4.9、启动数据库服务
代码如下:
[kingbase@Node1 /]$ sys_ctl start 等待服务器进程启动 ....2024-06-09 22:41:08.269 CST [49904] LOG: sepapower extension initialized 2024-06-09 22:41:08.275 CST [49904] LOG: starting KingbaseES V009R001C001B0025 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit 2024-06-09 22:41:08.275 CST [49904] LOG: listening on IPv4 address "0.0.0.0", port 54321 2024-06-09 22:41:08.275 CST [49904] LOG: listening on IPv6 address "::", port 54321 2024-06-09 22:41:08.284 CST [49904] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321" 2024-06-09 22:41:08.459 CST [49904] LOG: redirecting log output to logging collector process 2024-06-09 22:41:08.459 CST [49904] HINT: Future log output will appear in directory "sys_log". 完成 服务器进程已经启动
4.10、启动数据库服务
代码如下:
[kingbase@Node1 /]$ ksql test system -c 'select count(*) from film;' count ------- 1000 (1 行记录) [kingbase@Node1 /]$
五、控制文件的重要组成部分和作用
Kingbase ES数据库控制文件的组成部分和作用 Kingbase ES数据库的控制文件是一个记录数据库内部状态的重要文件,它包含以下几个主要部分及其作用:
- 初始化静态信息:这部分信息包括数据库的版本号、创建时间、数据库的物理结构信息等,它们在数据库初次创建时被写入控制文件,并在数据库运行期间保持不变。
- WAL及检查点的动态信息:WAL(Write-Ahead Logging)是一种日志记录机制,用于确保事务的持久性。检查点是数据库恢复过程中的一个重要步骤,用于确定恢复的起点。控制文件中的动态信息记录了WAL文件的位置和检查点的信息,以便在数据库崩溃后能够快速恢复。
- 一些配置信息:这部分信息包括数据库的运行参数和系统设置,如内存分配、并发控制参数等。这些信息可以在数据库运行期间根据需要进行调整,以优化数据库性能。
- 控制文件在数据库启动时必须可供数据库正确读取和写入。如果没有控制文件或控制文件不可读,数据库无法启动。因此,控制文件对于数据库的正常运行至关重要。
- 此外,Kingbase ES还支持控制文件的多路备份功能,通过设置control_file_copy参数,可以指定一个或多个控制文件的副本路径,以防原始控制文件丢失或损坏。这样可以提高数据库的可靠性和容错能力。
六、问题解决
- 6.1、启动数据库提示,shared_preload_libraries在 oracle 模式时不包含liboracle_parser
代码如下:
[kingbase@node1 sys_log]$ sys_ctl start 等待服务器进程启动 ....2024-06-10 09:00:08.697 CST [5797] 致命错误: shared_preload_libraries在 oracle 模式时不包含liboracle_parser 2024-06-10 09:00:08.697 CST [5797] 日志: 数据库系统已关闭 已停止等待 sys_ctl: 无法启动服务器进程 检查日志输出.
- 6.2、修改kingbase.conf的兼容性
代码如下:
[kingbase@node1 ~]$ vi /Kingbase/ES/V9/data/kingbase.conf ---修改内容如下: shared_preload_libraries = '$libdir/plugin_debugger,liboracle_parser, sepapower, sys_kwr, sys_stat_statements, sys_spacequota, auto_bmr, sys_squeeze, src_restrict' # (change requires restart)
- 6.3、再次启动服务
代码如下:
[kingbase@node1 sys_log]$ sys_ctl start 等待服务器进程启动 ....2024-06-10 09:02:30.192 CST [5817] 日志: sepapower扩展初始化完成 2024-06-10 09:02:30.201 CST [5817] 日志: 正在启动 KingbaseES V009R001C001B0025 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit 2024-06-10 09:02:30.205 CST [5817] 日志: 正在监听IPv4地址"0.0.0.0",端口 54321 2024-06-10 09:02:30.205 CST [5817] 日志: 正在监听IPv6地址"::",端口 54321 2024-06-10 09:02:30.213 CST [5817] 日志: 在Unix套接字 "/tmp/.s.KINGBASE.54321"上侦听 2024-06-10 09:02:30.316 CST [5817] 日志: 日志输出重定向到日志收集进程 2024-06-10 09:02:30.316 CST [5817] 提示: 后续的日志输出将出现在目录 "sys_log"中. 完成 服务器进程已经启动 [kingbase@node1 sys_log]$
七、重要提醒
控制文件的内容非常关键,因为它们包含了数据库集群的核心状态信息。如果控制文件损坏或丢失,数据库将无法启动。因此,定期备份控制文件是非常重要的,以防止数据丢失。
最后修改时间:2024-06-11 09:54:42
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。