openGauss 搭建编译环境|内置stack工具|处理错误表

此文章仅做为学习用途,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本人无关。侵删

搭建编译环境

硬件要求

编译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 软件依赖要求

所需软件

建议版本

libaio-devel

建议版本:0.3.109-13

flex

要求版本:2.5.31 以上

bison

建议版本:2.7-4

ncurses-devel

建议版本:5.9-13.20130511

glibc-devel

建议版本:2.17-111

patch

建议版本:2.7.1-10

redhat-lsb-core

建议版本:4.1

readline-devel

建议版本:7.0-13

cmake

建议版本:3.18

环境变量配置

编译openGauss轻量版的环境变量配置已经统一写入一键式编译和打包脚本,因此无需自行配置。

内置stack工具

可获得性

本特性自3.0.0版本开始引入。

特性简介

stack工具是获取数据库中各线程的调用栈的工具,用于辅助数据库运维人员定位死锁、hang等问题。

客户价值

提供函数级别的调用栈信息,提升数据库内核运维人员分析、定位死锁、hang等问题的效率。

特性描述

可以通过函数gs_stack()或者工具gs_ctl stack两种方式获取数据库中线程的调用栈。

  1. 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
      
  2. gs_ctl stack方式获取调用栈

    • 执行以下命令获取指定线程的调用栈。

      gs_ctl stack -D data_dir -I lwtid
      

      上述命令中-D data_dir用于指定需要获取调用栈的gaussdb进程的数据目录,-I lwtid用于指定目标线程的lwtid,lwpid可以ls /proc/pid/task/获取。具体步骤如下所示。

      1. 获取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
        
      2. 通过进程号获取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
        
      3. 获取指定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进程的数据目录。具体步骤如下所示。

      1. 获取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
        
      2. 获取所有线程的调用栈。

        [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
        

        此处省略剩余调用栈。

特性增强

无。

特性约束

  1. 仅用于gaussdb进程,其他进程,如cms、gtm等不支持。
  2. 如果使用SQL的方式执行,则需要CN、DN进程处于正常状态,可连接和执行SQL。
  3. 如果使用gs_ctl的方式执行,则需要CN、DN进程处于可响应信号的状态。
  4. 不支持并发,在获取全线程栈的场景,各个线程的调用栈不处于同一时间点。
  5. 最多支持128层调用栈,如果实际情况超过128层,则仅保留栈顶的128层。
  6. 符号表没有被trip(当前release版本,使用的是strip –d,仅去掉了debug信息,符号表没有被trip,如果改为strip –s,则仅能显示指针,无法显示出符号名)。
  7. SQL执行方式仅支持monadmin、sysadmin用户。
  8. 注册了SIGURG信号的线程,才能获取调用栈。
  9. 对于屏蔽操作系统SIGUSR2的代码段,无法获取调用栈 ,如果线程没有注册signal_slot,同样无法获取调用栈。

依赖关系

无。

处理错误表

操作场景

当数据导入发生错误时,请根据本文指引信息进行处理。

查询错误信息

数据导入过程中发生的错误,一般分为数据格式错误和非数据格式错误。

  • 数据格式错误

    在创建外表时,通过设置参数“LOG INTO error_table_name”,将数据导入过程中出现的数据格式错误信息写入指定的错误信息表error_table_name中。您可以通过以下SQL,查询详细错误信息。

    openGauss=# SELECT * FROM error_table_name;
    

    错误信息表结构如表1所示。

    表 1 错误信息表

    列名称

    类型

    描述

    nodeid

    integer

    报错节点编号。

    begintime

    timestamp with time zone

    出现数据格式错误的时间。

    filename

    character varying

    出现数据格式错误的数据源文件名。

    rownum

    numeric

    在数据源文件中,出现数据格式错误的行号。

    rawrecord

    text

    在数据源文件中,出现数据格式错误的原始记录。

    detail

    text

    详细错误信息。

  • 非数据格式错误

    对于非数据格式错误,一旦发生将导致整个数据导入失败。您可以根据执行数据导入过程中,界面提示的错误信息,帮助定位问题,处理错误表。

处理数据导入错误

根据获取的错误信息,请对照下表,处理数据导入错误。

表 2 处理数据导入错误

错误信息

原因

解决办法

missing data for column "r_reason_desc"

  1. 数据源文件中的列数比外表定义的列数少。
  2. 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。

    示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。

    BE|Belgium\|1
  1. 由于列数少导致的报错,选择下列办法解决:
    • 在数据源文件中,增加列“r_reason_desc”的字段值。
    • 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。
  2. 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。

extra data after last expected column

数据源文件中的列数比外表定义的列数多。

  • 在数据源文件中,删除多余的字段值。
  • 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。

invalid input syntax for type numeric: "a"

数据类型错误。

在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。

null value in column "staff_id" violates not-null constraint

非空约束。

在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。

duplicate key value violates unique constraint "reg_id_pk"

唯一约束。

  • 删除数据源文件中重复的行。
  • 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。
    openGauss=# INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons;

value too long for type character varying(16)

字段值长度超过限制。

在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值