此文章仅做为学习用途,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本人无关。侵删
搭建编译环境
硬件要求
编译openGauss的硬件要求:
- 机器数量:1台
- 机器硬件规格:
- CPU: 4U
- Memory: 8G
- Free Disk:100G (Linux 64位)
软件要求
操作系统要求
openGauss支持的操作系统:
- CentOS 7.6 (x86 架构)
- openEuler-20.03-LTS (aarch64 架构)
- openEuler-20.03-LTS (X86 架构)
- openEuler-22.03-LTS(aarch64 架构)
- openEuler-22.03-LTS(x86_64架构)
- Kylin-V10 (aarch64 架构)
- FusionOS 22 (aarch64 架构)
- FusionOS 22 (X86 架构)
软件依赖要求
编译openGauss的软件依赖要求如表 软件依赖要求所示。
建议使用上述操作系统安装光盘或者源中,下列依赖软件的默认安装包,若不存在下列软件,可参看软件对应的建议版本。
表 1 软件依赖要求
环境变量配置
编译openGauss轻量版的环境变量配置已经统一写入一键式编译和打包脚本,因此无需自行配置。
内置stack工具
可获得性
本特性自3.0.0版本开始引入。
特性简介
stack工具是获取数据库中各线程的调用栈的工具,用于辅助数据库运维人员定位死锁、hang等问题。
客户价值
提供函数级别的调用栈信息,提升数据库内核运维人员分析、定位死锁、hang等问题的效率。
特性描述
可以通过函数gs_stack()或者工具gs_ctl stack两种方式获取数据库中线程的调用栈。
-
gs_stack()函数方式
-
select * from gs_stack(pid)获取指定线程调用栈。
openGauss=# select * from gs_stack(139663481165568); gs_stack -------------------------------------------------------------------- __poll + 0x2d + WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f + WaitLatch(Latch volatile*, int, long) + 0x2e + JobScheduleMain() + 0x90f + int GaussDbThreadMain<(knl_thread_role)9>(knl_thread_arg*) + 0x456+ InternalThreadFunc(void*) + 0x2d + ThreadStarterFunc(void*) + 0xa4 + start_thread + 0xc5 + clone + 0x6d + (1 row)
-
select * from gs_stack()获取所有线程的调用栈。
openGauss=# select * from gs_stack(); -[ RECORD 1 ]------------------------------------------------------------------------------------------------------- tid | 139670364324352 lwtid | 308 stack | __poll + 0x2d | CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 | int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long , int)) + 0x28 | comm_poll(pollfd*, unsigned long, int) + 0xb1 | ServerLoop() + 0x72b | PostmasterMain(int, char**) + 0x314e | main + 0x617 | __libc_start_main + 0xf5 | 0x55d38f8db3a7 [ RECORD 2 ]------------------------------------------------------------------------------------------------------- tid | 139664851859200 lwtid | 520 stack | __poll + 0x2d | WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f | SysLoggerMain(int) + 0xc86 | int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d | InternalThreadFunc(void*) + 0x2d | ThreadStarterFunc(void*) + 0xa4 | start_thread + 0xc5 | clone + 0x6d
-
-
gs_ctl stack方式获取调用栈
-
执行以下命令获取指定线程的调用栈。
gs_ctl stack -D data_dir -I lwtid
上述命令中-D data_dir用于指定需要获取调用栈的gaussdb进程的数据目录,-I lwtid用于指定目标线程的lwtid,lwpid可以ls /proc/pid/task/获取。具体步骤如下所示。
-
获取gaussdb进程号和数据目录。
ps -ux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND perfadm 308 9.3 10.1 8719348 1649108 ? Sl May20 58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending
-
通过进程号获取lwtid,task目录下的目录名就是lwtid。
ls /proc/308/task/ 1096 505 522 525 529 532 536 539 542 546 549 552 555 558 561 565 569 575 584 833 923 926 929 932 935 938
-
获取指定lwtid的调用栈。
gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1 -I 1096 [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack start: tid<140409677575616> lwtid<1096> __poll + 0x2d CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28 comm_poll(pollfd*, unsigned long, int) + 0xb1 ServerLoop() + 0x72b PostmasterMain(int, char**) + 0x329a main + 0x617 __libc_start_main + 0xf5 0x55cf616e7647 [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack finished!
-
-
执行以下命令获取所有线程的调用栈。
gs_ctl stack -D data_dir
上述命令中,-D data_dir用于指定需要获取调用栈的gaussdb进程的数据目录。具体步骤如下所示。
-
获取gaussdb进程号和数据目录。
ps -ux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND perfadm 308 9.3 10.1 8719348 1649108 ? Sl May20 58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending
-
获取所有线程的调用栈。
[panhongchang@euler_phy_194 panhongchang]$ gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1 [2022-05-21 10:59:44.063][34511][][gs_ctl]: gs_stack start: Thread 0 tid<140409677575616> lwtid<21045> __poll + 0x2d CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34 int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28 comm_poll(pollfd*, unsigned long, int) + 0xb1 ServerLoop() + 0x72b PostmasterMain(int, char**) + 0x329a main + 0x617 __libc_start_main + 0xf5 0x55cf616e7647 Thread 1 tid<140405343516416> lwtid<21060> __poll + 0x2d WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f SysLoggerMain(int) + 0xc86 int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d InternalThreadFunc(void*) + 0x2d ThreadStarterFunc(void*) + 0xa4 start_thread + 0xc5 clone + 0x6d
此处省略剩余调用栈。
-
-
特性增强
无。
特性约束
- 仅用于gaussdb进程,其他进程,如cms、gtm等不支持。
- 如果使用SQL的方式执行,则需要CN、DN进程处于正常状态,可连接和执行SQL。
- 如果使用gs_ctl的方式执行,则需要CN、DN进程处于可响应信号的状态。
- 不支持并发,在获取全线程栈的场景,各个线程的调用栈不处于同一时间点。
- 最多支持128层调用栈,如果实际情况超过128层,则仅保留栈顶的128层。
- 符号表没有被trip(当前release版本,使用的是strip –d,仅去掉了debug信息,符号表没有被trip,如果改为strip –s,则仅能显示指针,无法显示出符号名)。
- SQL执行方式仅支持monadmin、sysadmin用户。
- 注册了SIGURG信号的线程,才能获取调用栈。
- 对于屏蔽操作系统SIGUSR2的代码段,无法获取调用栈 ,如果线程没有注册signal_slot,同样无法获取调用栈。
依赖关系
无。
处理错误表
操作场景
当数据导入发生错误时,请根据本文指引信息进行处理。
查询错误信息
数据导入过程中发生的错误,一般分为数据格式错误和非数据格式错误。
-
数据格式错误
在创建外表时,通过设置参数“LOG INTO error_table_name”,将数据导入过程中出现的数据格式错误信息写入指定的错误信息表error_table_name中。您可以通过以下SQL,查询详细错误信息。
openGauss=# SELECT * FROM error_table_name;
错误信息表结构如表1所示。
表 1 错误信息表
-
非数据格式错误
对于非数据格式错误,一旦发生将导致整个数据导入失败。您可以根据执行数据导入过程中,界面提示的错误信息,帮助定位问题,处理错误表。
处理数据导入错误
根据获取的错误信息,请对照下表,处理数据导入错误。
表 2 处理数据导入错误
| ||
null value in column "staff_id" violates not-null constraint | ||