openGauss内核分析(九):数据库表的创建过程

文章详细描述了openGauss数据库中创建表的过程,从ProcessUtility模块开始,经过standard_ProcessUtility函数解析SQL,到CreateCommand和DefineRelation函数处理CreateStmt,最后通过heap_create_with_catalog创建物理表并注册到系统表中。

openGauss内核分析(九):数据库表的创建过程

除了DML之外的所有查询都通过ProcessUtility模块来执行,包括了各类DDL语句、事务相关语句、游标相关语句等。上层调用函数为exec_simple_query函数,其中PortalStart函数和PortalDrop函数部分较为简单。核心函数是PortalRun函数下层调用的standard_ProcessUtility函数,该函数通过switch case语句处理了各种类型的查询语句,包括事务相关查询、游标相关查询、schema相关操作、表空间相关操作、表定义相关操作等。

standard_ProcessUtility函数会根据nodeTag(parsetree)的值来确定sql的操作类型,create table一般都是进入T_CreateStmt分支,调用CreateCommand函数。

void standard_ProcessUtility(Node* parse_tree, const char* query_string, ParamListInfo params, bool is_top_level,
    DestReceiver* dest,
#ifdef PGXC
    bool sent_to_remote,
#endif /* PGXC */
    char* completion_tag,
    bool isCTAS)
{
……
    errno_t errorno = EOK;
switch (nodeTag(parse_tree)) { // 根据nodeTag(parsetree)的值来确定sql的操作类型
……
        case T_CreateStmt: { // create table
#ifdef PGXC
            CreateCommand((CreateStmt*)parse_tree, query_string, params, is_top_level, sent_to_remote, isCTAS);
#else
            CreateCommand((CreateStmt*)parse_tree, query_string, params, is_top_level, isCTAS);
#endif
        } break;
……

图片

CreateCommand函数先解析parse_tree获取stmt,如果stmt为空则表明表已经存在。如果stmt不为空对stmts进行遍历,如果是 CreateStmt就调用DefineRelation。AlterTableCreateToastTable判断是否需要创建toast表并创建,AlterCStoreCreateTables判断是否需要创建列存表并创建。

#ifdef PGXC
void CreateCommand(CreateStmt *parse_tree, const char *query_string, ParamListInfo params,
                   bool is_top_level, bool sent_to_remote, bool isCTAS)
#else
void CreateCommand(CreateStmt *parse_tree, const char *query_string, ParamListInfo params, bool is_top_level,
    bool isCTAS)
#endif
{
……
    /* Run parse analysis ... */
    if (u_sess->attr.attr_sql.enable_parallel_ddl) // 先解析parse_tree获取stmt
        stmts = transformCreateStmt((CreateStmt*)parse_tree, query_string, NIL, true, &namespace_id, is_first_node);
    else
        stmts = transformCreateStmt((CreateStmt*)parse_tree, query_string, NIL, false, &namespace_id);

    /*
     * If stmts is NULL, then the table is exists.
     * we need record that for searching the group of table.
     */
    if (stmts == NIL) { // 如果stmt为空则表明表已经存在
        table_is_exist = true;
……
    /* ... and do it */
    foreach (l, stmts) { // 遍历stmts
        Node* stmt = (Node*)lfirst(l);

        if (IsA(stmt, CreateStmt)) {  // 如果是 CreateStmt就调用DefineRelation
            Datum toast_options;
            static const char* const validnsps[] = HEAP_RELOPT_NAMESPACES;
           
            /* forbid user to set or change inner options */
            ForbidOutUsersToSetInnerOptions(((CreateStmt*)stmt)->options);
            
            /* Create the table itself */
            rel_oid = DefineRelation((CreateStmt*)stmt,
                                    ((CreateStmt*)stmt)->relkind == RELKIND_MATVIEW ?
                                                                    
RELKIND_MATVIEW : RELKIND_RELATION,                                                                    
                                    InvalidOid, isCTAS);
……
            AlterTableCreateToastTable(rel_oid, toast_options, AccessShareLock);
            AlterCStoreCreateTables(rel_oid, toast_options, (CreateStmt*)stmt);
            AlterDfsCreateTables(rel_oid, toast_options, (CreateStmt*)stmt);
            AlterCreateChainTables(rel_oid, toast_options, (CreateStmt *)stmt);
……

DefineRelation函数获取到表名relname、名字空间relnamespace、表空间reltablespace、表类型relkind和relpersistence等信息后调用heap_create_with_catalog创建relation。

(gdb) f 0
#0  heap_create_with_catalog (relname=0x7fb4fa872140 "t100", relnamespace=2200, reltablespace=0, relid=0, reltypeid=0,
    reloftypeid=0, ownerid=10, tupdesc=0x7fb4ff2e2e50, cooked_constraints=0x0, relkind=114 'r', relpersistence=112 'p',
    shared_relation=false, mapped_relation=false, oidislocal=false, oidinhcount=0, oncommit=ONCOMMIT_NOOP,
    reloptions=140415352057720, use_user_acl=true, allow_system_table_mods=false, partTableState=0x0, row_compress=1 '\001',
    bucketinfo=0x0, record_dependce=true, ceLst=0x0, storage_type=HEAP_DISK, partLockMode=1) at heap.cpp:2521

其中heap_create内部首先调用了RelationBuildLocalRelation创建RelationData,并加入到relCache,RelationData表示一个表的元信息,这些信息都可以由系统表元组中的信息构造得到。然后根据这些信息通过调用RelalionCreateStorage函数创建物理文件。heap_create_with_catalog主要完成表物理文件的创建和表元信息注册到系统表中,涉及系统包包括pg_class,pg_attribute,pg_depend,pg_object,pg_type,pg_index和pg_partition。

图片

:创建表create table的函数调用栈

#0  RelationCreateStorage
#1  heap_create
#2  heap_create_with_catalog
#3  DefineRelation
#4  CreateCommand
#5  standard_ProcessUtility
#6  gsaudit_ProcessUtility_hook
#7  pgaudit_ProcessUtility
#8  hypo_utility_hook
#9  ProcessUtility
#10 PortalRunUtility
#11 PortalRunMulti
#12 PortalRun
#13 exec_simple_query
#14 PostgresMain
<think>好的,我需要帮助用户解决在Server3上安装和配置openGauss数据库的问题,包括创建系统用户、数据库用户以及日常管理指南。首先,我需要回顾用户提供的引用内容,确保回答符合他们的需求。 首先,用户引用了关于删除数据库、模板数据库、连接信息和参数设置的引用,但这些可能不是直接相关的。不过,用户现在需要的是安装和配置openGauss的详细步骤,所以应聚焦于此。 接下来,我需要回忆openGauss的安装流程。通常,安装数据库需要先准备环境,如创建系统用户、设置权限、配置系统参数等。然后才是安装数据库软件,初始化数据库实例,配置数据库参数,创建数据库用户,以及日常管理任务。 用户提到了创建系统用户opengauss数据库管理员opengauss,这可能有些混淆。通常,系统用户是用来运行数据库服务的,而数据库管理员是数据库内的用户,比如通过SQL创建的。需要明确区分这两个概念。 步骤可能包括: 1. 创建系统用户opengauss,设置权限和目录。 2. 安装openGauss软件,可能需要下载安装包,解压,运行安装脚本。 3. 初始化数据库实例,使用gs_initdb命令,指定数据目录、端口等参数。 4. 配置数据库参数,如监听地址、最大连接数等,可能需要修改postgresql.conf或通过gs_guc工具。 5. 创建数据库管理员用户oaadmin,使用CREATE USER语句,并赋予权限。 6. 配置远程连接,可能需要修改pg_hba.conf文件,添加允许的IP范围。 7. 日常管理命令,如启动、停止服务,备份恢复,日志检查等。 需要注意用户提到的日常检查管理指南,这部分需要包含检查数据库状态、日志监控、备份策略等。 另外,用户可能遇到的问题包括权限不足、端口冲突、配置文件错误等,应该在步骤中加入注意事项,比如关闭防火墙、检查端口占用、确保系统参数如内核参数设置正确。 需要确保命令正确,例如使用gsql连接数据库,执行SQL语句创建用户,使用gs_guc工具修改配置。同时,要注释每一步的作用,让用户明白为什么这样做。 可能还需要考虑版本差异,不同版本的openGauss安装步骤可能略有不同,但用户没有指定版本,所以给出通用步骤,并建议参考官方文档。 最后,生成相关问题,帮助用户进一步学习,比如性能调优、用户权限管理、备份恢复方法等。 需要验证步骤是否正确,比如是否需要在安装前安装依赖包,是否要配置环境变量,以及如何设置系统用户的sudo权限等。可能遗漏的步骤需要补充,比如配置SSH互信(如果是在集群环境),但用户可能只是单机安装,所以可以忽略。 总之,整理出逻辑清晰、步骤详细且带有注释的安装配置指南,并涵盖用户要求的创建用户和日常管理部分。</think>### openGauss数据库安装配置指南(Server3) #### 一、系统准备(root用户操作) ```bash # 创建系统用户组及用户 groupadd oinstall && useradd -g oinstall -m opengauss echo "opengauss_password" | passwd --stdin opengauss # 设置用户密码 # 创建安装目录并授权 mkdir -p /opt/opengauss/data && chown -R opengauss:oinstall /opt/opengauss # 修改系统参数 echo "kernel.sem=250 32000 100 999" >> /etc/sysctl.conf sysctl -p ``` #### 二、软件安装 1. **下载安装包** 通过官网获取openGauss安装包(以3.0.0为例): ```bash wget https://opengauss.org/download/3.0.0/openGauss-3.0.0-CentOS-64bit.tar.gz ``` 2. **解压安装** ```bash tar -zxvf openGauss-3.0.0-CentOS-64bit.tar.gz -C /opt/opengauss cd /opt/opengauss/simpleInstall ``` 3. **初始化数据库** ```bash su - opengauss gs_initdb --pgdata=/opt/opengauss/data \ --nodename=server3 \ --encoding=UTF-8 \ --locale=en_US.UTF-8 \ --username=opengauss \ --pwpasswd=DBAdmin@123 ``` #### 三、数据库配置 1. **修改监听配置** ```bash gs_guc set -D /opt/opengauss/data -c "listen_addresses = '*'" gs_guc set -D /opt/opengauss/data -c "port = 5432" ``` 2. **创建数据库管理员** ```bash gsql -d postgres -p 5432 -U opengauss -W DBAdmin@123 # 执行SQL CREATE USER oaadmin WITH PASSWORD 'OaAdmin@456' CREATEDB CREATEROLE; \q ``` 3. **配置远程访问** 修改`/opt/opengauss/data/pg_hba.conf`: ``` host all all 0.0.0.0/0 sha256 ``` #### 四、服务管理 ```bash # 启动服务 gs_ctl start -D /opt/opengauss/data # 查看状态 gs_ctl status -D /opt/opengauss/data # 停止服务 gs_ctl stop -D /opt/opengauss/data ``` #### 五、日常检查(系统用户opengauss操作) 1. **连接测试** ```bash gsql -d postgres -U oaadmin -W OaAdmin@456 -h Server3_IP -p 5432 ``` 2. **日志检查** ```bash tail -f /opt/opengauss/data/pg_log/*.log ``` 3. **备份操作** ```bash gs_dump -U oaadmin -W OaAdmin@456 -p 5432 -F c -f /backup/oa_backup.dmp oadb ``` [^1]: 用户权限设置参考数据库安全规范 [^2]: 安装目录建议保留10%以上空闲空间 [^3]: 生产环境建议启用SSL加密连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值