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

闲聊Kingbase 的sys_controldata的作用及功能


一、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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论