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

KCP 模拟题练习 16 - 控制文件丢失

原创 Lucifer三思而后行 2024-10-08
524

【单选题】当 KES 实例正在运行时,控制文件丢失,此时执行 checkpoint 操作,会有怎样的结果?

  • checkpoint 执行正常
  • 实例崩溃
  • checkpoint 执行失败,但是实例继续运行
  • 不能确定

解题思路:

介绍

KingbaseES 数据库的控制文件是记录数据库内部信息的重要文件,一但控制文件损坏,数据库将会宕机,且无法启动。

控制文件默认存放在数据文件目录下的 global 目录下:

[kingbase@kes:/home/kingbase]$ cd /data/global/ [kingbase@kes:/data/global]$ ll sys_control -rw------- 1 kingbase kingbase 8192 10月 8 16:00 sys_control

通过 sys_controldata 命令可以查看控制文件的内容:

[kingbase@kes:/home/kingbase]$ export KINGBASE_DATE=/data [kingbase@kes:/home/kingbase]$ sys_controldata sys_control 版本: 1201 Catalog 版本: 202211151 数据库系统标识符: 7418197114018412488 数据库簇状态: 在运行中 sys_control 最后修改: 2024年10月08日 星期二 16时00分11秒 最新检查点位置: 0/1CF23F0 最新检查点的 REDO 位置: 0/1CF23C0 最新检查点的重做日志文件: 000000010000000000000001 最新检查点的 TimeLineID: 1 最新检查点的PrevTimeLineID: 1 最新检查点的full_page_writes: 开启 最新检查点的NextXID: 0:1064 最新检查点的 NextOID: 24576 最新检查点的NextMultiXactId: 1 最新检查点的NextMultiOffsetD: 0 最新检查点的oldestXID: 1032 最新检查点的oldestXID所在的数据库:1 最新检查点的oldestActiveXID: 1064 最新检查点的oldestMultiXid: 1 最新检查点的oldestMulti所在的数据库:1 最新检查点的oldestCommitTsXid:0 最新检查点的newestCommitTsXid:0 最新检查点的时间: 2024年10月08日 星期二 16时00分07秒 不带日志的关系: 0/3E8使用虚假的LSN计数器 最小恢复结束位置: 0/0 最小恢复结束位置时间表: 0 开始进行备份的点位置: 0/0 备份的最终位置: 0/0 需要终止备份的记录: 否 wal_level设置: replica wal_log_hints设置: 关闭 max_connections设置: 100 max_worker_processes设置: 8 max_wal_senders设置: 10 max_prepared_xacts设置: 0 max_locks_per_xact设置: 64 track_commit_timestamp设置: 关闭 最大数据校准: 8 数据库块大小: 8192 大关系的每段块数: 131072 WAL的块大小: 8192 每一个 WAL 段字节数: 16777216 标识符的最大长度: 64 在索引中可允许使用最大的列数: 32 TOAST区块的最大长度: 1988 大对象区块的大小: 2048 日期/时间 类型存储: 64位整数 正在传递Flloat4类型的参数: 由值 正在传递Flloat8类型的参数: 由值 数据页校验和版本: 0 当前身份验证: c4e1fd6b06f9a8aed87af6ecd6fe351980a0c2d5377215695d959f1af2a2b0a5 数据库模式: 1 身份验证方法模式: 0

控制文件中记录内容如下:

  • 建库时生成的静态信息:初始化数据库时产生,固定不变,无需手动维护。
  • kingbase.conf 中的配置信息:conf 中的相关参数被修改,会自动更新控制文件,无需手动维护。
  • wal 以及 checkpoint 的动态信息:当发生检查点、日志切换等操作,则会自动更新控制文件,无需手动维护。

注意:KES 中的控制文件路径不能改变。

备份控制文件

控制文件无法手动修改,无法单独备份,只能在使用 sys_rman、sys_basebackup 备份数据库时一起备份控制文件。

启动、关闭和恢复数据库时需要读取控制文件中的相关信息。

通过参数 control_file_copy 可以实现控制文件冗余(多路复用):

-- 参数 control_file_copy 默认不启用 test=# show control_file_copy; control_file_copy ------------------- (1 行记录)

启用 control_file_copy:

## 使用 root 用户创建目录 /cf_copy 并设置目录权限 [root@kes ~]# mkdir -p /cf_copy [root@kes ~]# chown kingbase:kingbase /cf_copy [root@kes ~]# chmod 700 /cf_copy [root@kes ~]# su - kingbase ## 查看配置参数示例 [kingbase@kes:/data]$ cat kingbase.conf | grep control_file_copy # control_file_copy = '' #example: control_file_copy = 'filepath/filename' #control_file_copy = 'filepath1/filename1;filepath2/filename2' ## 配置 kingbase.conf 文件,这里复制 2 份 [kingbase@kes:/data]$ cat<<-EOF>>/data/kingbase.conf control_file_copy='/cf_copy/sys_control_1;/cf_copy/sys_control_2' EOF ## 查看配置后的参数值 [kingbase@kes:/data]$ grep -v "^\s*\(#\|$\)" /data/kingbase.conf | grep control_file_copy control_file_copy='/cf_copy/sys_control_1;/cf_copy/sys_control_2' ## 重启数据库 [kingbase@kes:/data]$ sys_ctl restart 等待服务器进程关闭 .... 完成 服务器进程已经关闭 等待服务器进程启动 ....2024-10-08 17:10:40.808 CST [9023] 日志: sepapower extension initialized 2024-10-08 17:10:40.812 CST [9023] 日志: 正在启动 KingbaseES V008R006C007B0024 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit 2024-10-08 17:10:40.812 CST [9023] 日志: 正在监听IPv4地址"0.0.0.0",端口 54321 2024-10-08 17:10:40.812 CST [9023] 日志: 正在监听IPv6地址"::",端口 54321 2024-10-08 17:10:40.813 CST [9023] 日志: 在Unix套接字 "/tmp/.s.KINGBASE.54321"上侦听 2024-10-08 17:10:40.914 CST [9023] 日志: 日志输出重定向到日志收集进程 2024-10-08 17:10:40.914 CST [9023] 提示: 后续的日志输出将出现在目录 "sys_log"中. 完成 服务器进程已经启动

验证参数生效:

test=# show control_file_copy; control_file_copy ----------------------------------------------- /cf_copy/sys_control_1;/cf_copy/sys_control_2 (1 行记录)

查看控制文件:

[kingbase@kes:/home/kingbase]$ ll /cf_copy/* -rw------- 1 kingbase kingbase 8192 10月 8 17:10 /cf_copy/sys_control_1 -rw------- 1 kingbase kingbase 8192 10月 8 17:10 /cf_copy/sys_control_2

可以看到数据库配置已经生效,现在有 3 份控制文件。

模拟破坏控制文件

登录数据库,对一张测试表 test 插入数据:

test=# \c test system 您现在已经连接到数据库 "test",用户 "system". test=# \d test 数据表 "public.test" 栏位 | 类型 | 校对规则 | 可空的 | 预设 ------+---------+----------+--------+------ id | integer | | | 索引: "idx_test_id" btree (id) -- 插入一条数据 test=# insert into test values (1); INSERT 0 1 -- 人为删除控制文件 /data/global/sys_control test=# \! rm /data/global/sys_control -- 插入第二条数据,可以成功插入 test=# insert into test values (2); INSERT 0 1 -- 可以成功查询,说明删除之后不影响正常的 DML 操作,必须要触发检查点才会报错 test=# select * from test; id ---- 1 2 (2 行记录) -- 但是手动触发检查点之后,数据库宕机了 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. 提示: 一会儿你将可以重联接数据库并且重复你的命令. 服务器意外地关闭了联接 这种现象通常意味着服务器在处理请求之前 或者正在处理请求的时候意外中止

此时尝试启动数据库,会提示无法找到控制文件,启动失败:

[kingbase@kes:/home/kingbase]$ sys_ctl start sys_ctl: 其他服务器进程可能正在运行; 尝试启动服务器进程 等待服务器进程启动 ....kingbase: 无法找到数据库系统 预期在目录 "/data" 找到, 但是无法打开文件 "/data/global/sys_control": 没有那个文件或目录 已停止等待 sys_ctl: 无法启动服务器进程 检查日志输出.

这里我们已经得到答案了,当控制文件被破坏后,手动触发检查点,实例会直接崩溃。

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

评论