暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss 系统表

原创 小小亮 2021-12-17
1555

系统表又称为数据字典或者元数据,存储管理数据库对象的定义信息,如表、索引、触发器等。用户可通过系统表查询用户定义的具体对象信息,如表的每个字段类型。因为openGauss支持一个实例管理多个数据库所以系统表分为实例级别的系统表和数据库级别的系统表。实例级别的系统表在一个实例管理的多个数据库之间共享,整个实例只有一份,这些系统表为pg_authidpg_auth_memberspg_database、pg_db_role_setting pg_tablespacepg_shdependpg_shdescriptionpg_shseclabel。数据库级别的系统表比如pg_classpg_dependpg_indexpg_attribute等,每个数据库各有一份。


一、系统表定义

openGauss系统表定义全部在src/include/catalog目录下每个头文件就是一个系统表的定义pg_database.h就是对pg_database的定义pg_database.h主要包括pg_database的表OIDobject identifier对象标识符)、类型OID结构体定义字段个数和每个字段IDidentifier标识符枚举值数据库初始化默认值。下面是代码及其具体解释

/*  pg_database本身也是一张表,DatabaseRelationId表示pg_database在系统表pg_class中的OID为1262(pg_class系统表中保存的是表的定义信息) */ 
#define DatabaseRelationId    1262
/*  pg_database本身也是一个结构类型,DatabaseRelation_Rowtype_Id表示pg_database在系统表pg_type中的OID为1248  */ 
#define DatabaseRelation_Rowtype_Id  1248
/* pg_database本身也是一个结构类型,DatabaseRelation_Rowtype_Id表示pg_database在系统表pg_type中的OID为1248  */
/*  BKI_SHARED_RELATION表示pg_database是实例级别的系统表 */
CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO
{
    NameData    datname;              /* 数据库名称 */
    Oid         datdba;               /* 数据库拥有者 */
    int4        encoding;             /* 字符集编码 */
    NameData    datcollate;           /* LC_COLLATE 设置值 */
    NameData    datctype;             /* LC_CTYPE 设置值 */
    bool        datistemplate;        /* 是否允许作为模板数据库*/
    bool        datallowconn;         /* 是否允许链接 */
    int4        datconnlimit;         /* 最大连接数*/
    Oid         datlastsysoid;        /* 系统OID最大值*/
    ShortTransactionId datfrozenxid;  /* 冻结事务ID,所有小于这个值的事务ID已经冷冻。为了兼容原来的版本,使用32位事务ID*/
    Oid         dattablespace;     /* 数据库的缺省表空间 */
    NameData    datcompatibility;/* 数据库兼容模式,比如除0是报错还是当做正常处理*/
#ifdef CATALOG_VARLEN          /* 下面字段是变长字段 */
    aclitem        datacl[1];        /* 访问权限*/
#endif
    TransactionId datfrozenxid64; /* 冷冻事务ID,64-bit(比特)事务ID */
} FormData_pg_database;


CATALOG的宏定义代码为

#define CATALOG(name,oid)  typedef struct CppConcat(FormData_,name)


因此CATALOG(pg_database,1262)就是对结构体FormData_pg_database的定义之所以采用CATALOG是因为这个格式是和BKIbackend interface后端接口脚本约定的格式BKI脚本根据这个格式生成数据库的建表脚本

接下来是数据库对象字段总数和每个字段ID的值的定义代码,定义这些值的目的主要代码访问数据库对象时清晰、方便维护、避免魔鬼数字(魔鬼数字指在代码中没有具体含义的数字、字符串。魔鬼数字会影响代码可读性,使读者无法理解看到的数字对应的含义,从而难以理解程序的意图)。


#define Natts_pg_database                14
#define Anum_pg_database_datname        1
#define Anum_pg_database_datdba            2
#define Anum_pg_database_encoding        3
#define Anum_pg_database_datcollate        4
#define Anum_pg_database_datctype        5
#define Anum_pg_database_datistemplate    6
#define Anum_pg_database_datallowconn    7
#define Anum_pg_database_datconnlimit    8
#define Anum_pg_database_datlastsysoid    9
#define Anum_pg_database_datfrozenxid    10
#define Anum_pg_database_dattablespace    11
#define Anum_pg_database_compatibility    12
#define Anum_pg_database_datacl            13
#define Anum_pg_database_datfrozenxid64    14


最后是创建数据库时的默认数值。代码中的值表示默认创建template1数据库DATA的字段值和数据库结构体的值一一对应。对应代码如下:

DATA(insert OID = 1 (  template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1663 "DB_COMPATIBILITY" _null_ 3));
SHDESCR("default template for new databases");
#define TemplateDbOid            1
#define DEFAULT_DATABASE  "postgres"


系统表头文件的内容和格式基本类似


二、系统表的访问

系统表定义后接下来介绍数据库在运行过程中对系统表的访问openGauss对系统表的访问主要是通过syscache机制syscache机制是一个通用的机制,主要对系统表的数据进行缓存,提升系统表数据的访问速度,详细细节参照具体章节描述这里主要描述与pg_database相关的部分pg_database在枚举类型enum SysCacheIdentifier中定义的枚举值有一个DATABASEOID表示根据数据库OID访问pg_database系统表。同时需要把pg_database系统表访问模式添加到struct cachedesc cacheinfopg_database相关的代码如下

{DatabaseRelationId, /* DATABASEOID */
        DatabaseOidIndexId,
        1,
        {ObjectIdAttributeNumber, 0, 0, 0},
        4},


这几个值与cachedesc结构体的字段对应表示pg_database表的OID索引的OID搜索时有1key字段搜索key字段IDObjectIdAttributeNumber初始化为4hash相关的代码如下

struct cachedesc {
    Oid reloid;   /* 缓存的表的OID */
    Oid indoid;   /* 缓存数据的索引OID */
    int nkeys;    /*  缓存搜索的key的个数 */
    int key[4];   /* key属性的编号*/
    int nbuckets; /* 缓存hash桶的个数*/
};


系统表的定义和访问主要逻辑如上问所述。与pg_database相关的SQL命令是ALTER DATABASECREATE DATABASEDROP DATABASE,这些命令执行的结果是把数据库相关的信息存储到pg_database系统表中

其他系统表的逻辑与pg_database相似不再重复


最后修改时间:2021-12-17 17:56:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论