首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库没有生成 core 文件的情况
更新时间:2024-04-25 09:26
在 OceanBase 数据库环境中,如果没有生成 core 文件,可能是由于以下原因导致的。
ulimit -c 等于 0
大多数部署工具都会在启动 OBServer 时加上 ulimit -c unlimited 以保证生成完整的 coredump 文件,不过有时出现宕机,人为的手动重启 OBServer 时直接执行 ./bin/observer,这样拉起来的 OBServer 将重读新的 ulimit,如果 ulimit 是 0,后续将无法生成 coredump 文件。
示例。
ulimit -c
unlimited
上述示例中 -c 用于控制 core 文件的大小,此处 ulimt -c 的输出结果为 unlimited,所以只要磁盘空间足,core 文件生成是完整的,如果该 ulimt -c 的输出结果值很小或者等于 0,那么生成的 core 文件不完整,甚至不生成 core 文件。
启动 OBServer 时的 -c 状态可以从 observer.log 日志中获取(存在启动日志)。
grep 'RLIMIT' observer.log*
输出结果如下:
INFO print_limit (main.cpp:340) [20475][][T0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=5] [operator()] RLIMIT_CORE = unlimited
OBServer 打印 crash error 日志时,包含 ulimt -c 的结果,当无法生成coredump 时,可以通过 crash error 日志判断是否是 ulimit 是 0 造成的。
grep ‘CRASH ERROR' observer.log*
输出结果如下:
observer.log:CRASH ERROR!!! sig=6, sig_code=-6, sig_addr=14fcfc0000a3f9, RLIMIT_CORE=unlimited, timestamp=1663683871180567, tid=41977, tname=observer, trace_id=0-0-0-0, extra_info=((null)), lbt=0x1357aca9 0x135502d3 0x135501ba 0x13550116 0x7fcf35eae61f 0x7fcf35687277 0x7fcf35688967 0x4a4cdbd 0x4a3bf92 0x4a3ad64 0x7fcf35673444 0x4a383a8
core 文件目录权限不足
查看 core 文件的目录模式。
sysctl -a | grep pattern输出结果如下:
kernel.core_pattern = /data/core-%e-%p-%t显示当前目录内文件的详细属性信息。
ll /输出结果如下:
total 56 rwxrwxrwx 1 root root 7 Jun 2 2017 bin -> usr/bin dr-xr-xr-x 1 root root 4096 Nov 14 2019 boot drwxr-xr-x 4 root root 4096 Jun 15 21:10 data
core 文件的目标目录(由 kernel.core_pattern 指定),data 目录只有 root 用户有读写权限,如果是非 root 用户的进程将无法产生 core 文件。
磁盘空间不足
如果磁盘空间不足,可能导致 core 文件不完整或无法生成。
存在删除 core 文件的定时任务或人为误判存在 core 文件
当系统中存在定期删除 core 文件的任务,导致 core 文件被删除。
由于人为误判认为存在 core 文件。
磁盘扩容后无法生成 core 文件
在某些特殊情况下,例如磁盘扩容之后无法生成 core 文件。
进程在 coredump 期间被 kill -9
通常情况下,在 coredump 期间进程无法被强杀的,但在某些环境中碰到 coredump 期间执行了 kill -9 命令,最终导致生成的 core 文件不完整。
适用版本
OceanBase 数据库所有版本。