Q: core文件调试方法
A:
一、提示信息
数据库服务运行期间由于数据库本身的bug导致服务程序崩溃,会在/home/kingbase 或 /home/kingbase/KingbaseES/bin 路径下,生成一个core文件。
二、调试方式
1、首先进入到kingbase主程序的bin目录下,例如:
cd /home/kingbase/KingbaseES/bin/
2、执行gdb 命令,进入gdb调试交互界面,语法如下:
gdb 引发core的程序名 core文件名
例如,core文件在/dbbackup/路径下,文件名为core-kingbase-1111
调试命令为:
gdb kingbase /dbbackup/core-kingbase-1111
3、执行上述命令如果正确,则会进入交互界面。在交互界面内执行命令加载符号信息文件。语法如下:
symbol-files /path/kingbase_debug_file
例如,符号信息文件为 /home/kingbase/KingbaseES/kingbasedebug/kingbase.debug,则加载命令为:
symbol-files /home/kingbase/KingbaseES/kingbasedebug/kingbase.debug
回车确认后,会提示是否加载,选择y。
4、输入如下命令,将后续的调试信息都输出到一个指定文件内。
set logging /path/filename :设置输出的文件名
set logging on :这个命令输入后,此后的调试信息都会输出到上一命令指定的文件内。
5、输入命令 bt,将所有输出的信息复制到文本内,发挥公司研发人员进行分析。
6、执行 thread apply all bt命令。随后输出q命令退出。将之前设定的输出文件,整个发回公司给研发人员分析。
三、其他调试命令
1、在加载符号信息文件完毕后,执行 info threads 命令,列出线程信息。可能的结果如下(举例数据):
6 kingbase 23456 sabc libc();
5 kingbase 23432 ....
4 kingbase 23123 ...
3 kingbase 23421 ...
2 kingbase 23415 ...
1 kingbase 23112 ...
这个结果中,第一列是线程号,第三列是操作系统级别上的进程号
2、执行thread x,来切换线程,再执行bt命令,打印堆栈信息。例如,需要打印编号为1 的线程,和编号为2的线程的堆栈信息。
thread 1
输入后,会提示已经切换到该线程,随后输入命令
bt
会打印出 线程1 对应的堆栈信息。
再次输入
thread 2
会提示已经切换到线程2,再次输入命令
bt
会打印出线程2的堆栈信息。
Q: 数据库core文件分析
A:
数据库异常core文件一般生成在数据库属主的家目录下:/home/kingbase
数据库core文件分析:
1、 拷贝对应数据库版本的符号信息文件到kingbase用户可访问的目录下
2、 执行gdb /home/kingbase/KingbaseES/bin/kingbase core.****
3、 添加程序符号信息Symbol_file /home/kingbase/kingbasedebug/kingbase.dug
4、 使用bt打印堆栈信息
简单进行分析如果与数据库相关,则需要反馈回公司研发人员,如果与OS相关,则联系平台管理人员进行协调;
手动生成core文件对数据库线程信息进行分析;
1、 数据库进程存在,但是数据库内存异常,对外服务出现卡顿或停止服务的现象,分析:
1) 分析操作系统I/O和内存的使用情况
I/O异常处理
a) 使用iostat工具查看:
avg-cpu: %user %nice %system %iowait %steal %idle
0.02 0.00 0.04 0.01 0.00 99.93
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 0.37 0.03 0.24 0.79 4.94 20.85 0.00 8.93 1.09 0.03
内存异常处理
top命令查看数据库占用内存的情况,查看VIRT占用的情况,如果该值大于操作系统内存或该值接近mem+swap,根据RES的使用情况,则进行分析;
[root@h10-48 ~]# free -m
total used free shared buffers cached
Mem: 3947 858 3088 0 185 537
-/+ buffers/cache: 135 3811
Swap: 8001 0 8001
手动生成core文件方法,打印堆栈信息进行分析:
1、 gcore PID(core文件生成在当前目录下,生成core文件的目录所在的分区剩余空间必须大于TOP看到的RES值的)
2、 kill -s SIGSEGV PID
3、 使用pstack直接生成堆栈信息
数据库线程信息:
在数据库中执行:alter system set trace_memory_context = on; alter system set trace_memory_context = off;,定时执行两句生成线程信息进行分析;