几种开源数据库对元数据的管理
背景
想扩展Spark,实现一个自定义的【元数据库】,为实现元数据库,准备参考:
- Hive
- PostgreSQL
- MySQL
这几种的元信息库的表结构
Hive
完整的ER图比较大,点击->【这里】 查看完整图
大致分为这么几类:
- 数据库
- 表信息
- 分区
- 函数
- 类型
- 索引
- 存储信息
- 列
- 倾斜列
- SERDE
- 角色
- 杂项
表结构
这里主要列一下 库信息、表信息的定义
数据库表的结构
| 字段 | 解释 |
|---|---|
| DB_ID | 数据库的编号,默认的数据库编号为1,如果创建其他数据库的时候,这个字段会自增,主键 |
| DESC | 对数据库进行一个简单的介绍 |
| DB_LOCATION_URI | 数据库的存放位置,默认是存放在hdfs://ip:9000/user/hive/warehouse,如果是其他数据库,就在后面添加目录,默认位置可以通过参数hive.metastore.warehouse.dir来设置 |
| NAME | 数据库的名称 |
| OWNER_NAME | 数据库所有者名称 |
| OWNER_TYPE | 数据库所有者的类型 |
数据库表对应的参数表
| 字段 | 解释 |
|---|---|
| DB_ID | 数据库的编号 |
| PARAM_KEY | 参数名称 |
| PARAM_VALUE | 参数值 |
表信息
| 字段 | 解释 |
|---|---|
| TBL_ID | 在hive中创建表的时候自动生成的一个id,用来表示,主键 |
| CREATE_TIME | 创建的数据表的时间,使用的是时间戳 |
| DBS_ID | 这个表是在那个数据库里面 |
| LAST_ACCESS_TIME | 最后一次访问的时间戳 |
| OWNER | 数据表的所有者 |
| RETENTION | 保留时间 |
| SD_ID | 标记物理存储信息的id |
| TBL_NAME | 数据表的名称 |
| TBL_TYPE | 数据表的类型,MANAGED_TABLE, EXTERNAL_TABLE, VIRTUAL_VIEW, INDEX_TABLE |
| VIEW_EXPANDED_TEXT | 展开视图文本,非视图为null |
| VIEW_ORIGINAL_TEXT | 原始视图文本,非视图为null |
表信息管理的参数
| 字段 | 解释 |
|---|---|
| TBL_ID | 表id |
| PARAM_KEY | 参数key |
| PARAM_VALUE | 参数value |
结论
Hive的元信息,除了基本的 库、表、索引、函数外
还包含了权限、优化方面的东西
Hive的 库、表都关联了一个参数表,这么设计参数增加起来会很容易,但是参数会很多,quickSql也是这么设计的
可以先实现 库信息、表信息 这两个最主要的
参考
Hive metastore
Hive MetaStore的结构
AdminManual Metastore Administration
HiveMetaStore.pdf
Hive MetaStore数据库表结构
PostgreSQL
用 DBeaver 生成的,图比较大,点击 -> 【这里】
pg_catalog相关的表和描述如下:
| Catalog Name | Purpose |
|---|---|
| pg_aggregate | aggregate functions |
| pg_am | relation access methods |
| pg_amop | access method operators |
| pg_amproc | access method support functions |
| pg_attrdef | column default values |
| pg_attribute | table columns (“attributes”) |
| pg_authid | authorization identifiers (roles) |
| pg_auth_members | authorization identifier membership relationships |
| pg_cast | casts (data type conversions) |
| pg_class | tables, indexes, sequences, views (“relations”) |
| pg_collation | collations (locale information) |
| pg_constraint | check constraints, unique constraints, primary key constraints, foreign key constraints |
| pg_conversion | encoding conversion information |
| pg_database | databases within this database cluster |
| pg_db_role_setting | per-role and per-database settings |
| pg_default_acl | default privileges for object types |
| pg_depend | dependencies between database objects |
| pg_description | descriptions or comments on database objects |
| pg_enum | enum label and value definitions |
| pg_event_trigger | event triggers |
| pg_extension | installed extensions |
| pg_foreign_data_wrapper | foreign-data wrapper definitions |
| pg_foreign_server | foreign server definitions |
| pg_foreign_table | additional foreign table information |
| pg_index | additional index information |
| pg_inherits | table inheritance hierarchy |
| pg_init_privs | object initial privileges |
| pg_language | languages for writing functions |
| pg_largeobject | data pages for large objects |
| pg_largeobject_metadata | metadata for large objects |
| pg_namespace | schemas |
| pg_opclass | access method operator classes |
| pg_operator | operators |
| pg_opfamily | access method operator families |
| pg_partitioned_table | information about partition key of tables |
| pg_policy | row-security policies |
| pg_proc | functions and procedures |
| pg_publication | publications for logical replication |
| pg_publication_rel | relation to publication mapping |
| pg_range | information about range types |
| pg_replication_origin | registered replication origins |
| pg_rewrite | query rewrite rules |
| pg_seclabel | security labels on database objects |
| pg_sequence | information about sequences |
| pg_shdepend | dependencies on shared objects |
| pg_shdescription | comments on shared objects |
| pg_shseclabel | security labels on shared database objects |
| pg_statistic | planner statistics |
| pg_statistic_ext | extended planner statistics (definition) |
| pg_statistic_ext_data | extended planner statistics (built statistics) |
| pg_subscription | logical replication subscriptions |
| pg_subscription_rel | relation state for subscriptions |
| pg_tablespace | tablespaces within this database cluster |
| pg_transform | transforms (data type to procedural language conversions) |
| pg_trigger | triggers |
| pg_ts_config | text search configurations |
| pg_ts_config_map | text search configurations’ token mappings |
| pg_ts_dict | text search dictionaries |
| pg_ts_parser | text search parsers |
| pg_ts_template | text search templates |
| pg_type | data types |
| pg_user_mapping | mappings of users to foreign servers |
大概分这么几类:
- 访问模式、权限、安全等
- 数据类型
- 库信息
- 表空间
- 表信息、表分区、表的层次关系
- sequence、索引、触发器、函数、存储过程
- 外部数据
- 统计信息
表结构
pg_database 库信息
| 名字 | 类型 | 引用 | 描述 |
|---|---|---|---|
| datname | name | 数据库名字 | |
| datdba | oid | pg_authid.oid | 数据库所有人,通常为其创建者 |
| encoding | int4 | 数据库的字符编码方式(pg_encoding_to_char() 能够将这个数字转换为相应的编码名称) | |
| datistemplate | bool | 如果为真则此数据库可以用于 CREATE DATABASE 的 TEMPLATE 子句,把新数据库创建为此数据库的克隆。 | |
| datallowconn | bool | 如果为假则没有人可以连接到这个数据库。这个字段用于保护 template0 数据库不被更改。 | |
| datconnlimit | int4 | 设置该数据库上允许的最大并发连接数,-1 表示无限制。 | |
| datlastsysoid | oid | 数据库里最后一个系统 OID ;对 pg_dump 特别有用。 | |
| datfrozenxid | xid | 该数据库中中所有在这个之前的事务 ID 已经被一个固定的(“frozen”)事务 ID 替换。这用于跟踪该数据库是否需要为了防止事务 ID 重叠或者允许收缩 pg_clog 而进行清理。它是针对每个表的 pg_class.relfrozenxid 中的最小值。 | |
| dattablespace | oid | pg_tablespace.oid | 该数据库的缺省表空间。在这个数据库里,所有 pg_class.reltablespace 为零的表都将保存在这个表空间里;特别要指出的是,所有非共享的系统表也都存放在这里。 |
| datconfig | text[] | 运行时配置变量的会话缺省值 | |
| datacl | aclitem[] | 访问权限,参阅 GRANT 和 REVOKE 获取详细描述。 |
pg_class 表信息
| 名字 | 类型 | 引用 | 描述 |
|---|---|---|---|
| relname | name | 表、索引、视图等的名字。 | |
| relnamespace | oid | pg_namespace.oid | 包含这个关系的名字空间(模式)的 OID |
| reltype | oid | pg_type.oid | 对应这个表的行类型的数据类型(索引为零,它们没有 pg_type 记录)。 |
| relowner | oid | pg_authid.oid | 关系所有者 |
| relam | oid | pg_am.oid | 如果行是索引,那么就是所用的访问模式(B-tree, hash 等等) |
| relfilenode | oid | 这个关系在磁盘上的文件的名字,如果没有则为 0 | |
| reltablespace | oid | pg_tablespace.oid | 这个关系存储所在的表空间。如果为零,则意味着使用该数据库的缺省表空间。如果关系在磁盘上没有文件,则这个字段没有什么意义。 |
| relpages | int4 | 以页(大小为 BLCKSZ)的此表在磁盘上的形式的大小。它只是规划器用的一个近似值,是由 VACUUM, ANALYZE 和几个 DDL 命令,比如 CREATE INDEX 更新。 | |
| reltuples | float4 | 表中行的数目。只是规划器使用的一个估计值,由 VACUUM, ANALYZE 和几个 DDL 命令,比如 CREATE INDEX 更新。 | |
| reltoastrelid | oid | pg_class.oid | 与此表关联的 TOAST 表的 OID ,如果没有为 0 。TOAST 表在一个从属表里"离线"存储大字段。 |
| reltoastidxid | oid | pg_class.oid | 对于 TOAST 表是它的索引的 OID ,如果不是 TOAST 表则为 0 |
| relhasindex | bool | 如果它是一个表而且至少有(或者最近有过)一个索引,则为真。它是由 CREATE INDEX 设置的,但 DROP INDEX 不会立即将它清除。如果 VACUUM 现一个表没有索引,那么它将清理 relhasindex 。 | |
| relisshared | bool | 如果该表在整个集群中由所有数据库共享则为真。只有某些系统表(比如 pg_database)是共享的。 | |
| relkind | char | r = 普通表, i = 索引, S = 序列, v = 视图, c = 复合类型, t = TOAST 表 | |
| relnatts | int2 | 关系中用户字段数目(除了系统字段以外)。在 pg_attribute 里肯定有相同数目对应行。又见 pg_attribute.attnum | |
| relchecks | int2 | 表里的检查约束的数目;参阅 pg_constraint 表 | |
| reltriggers | int2 | 表里的触发器的数目;参阅 pg_trigger 表 | |
| relukeys | int2 | 未使用(不是唯一值的数目) | |
| relfkeys | int2 | 未使用(不是表中外键的数目) | |
| relrefs | int2 | 未使用 | |
| relhasoids | bool | 如果为关系中每行都生成一个 OID 则为真 | |
| relhaspkey | bool | 如果这个表有一个(或者曾经有一个)主键,则为真。 | |
| relhasrules | bool | 如表有规则就为真;参阅 pg_rewrite 表 | |
| relhassubclass | bool | 如果有(或者曾经有)任何继承的子表,为真。 | |
| relfrozenxid | xid | 该表中所有在这个之前的事务 ID 已经被一个固定的(“frozen”)事务 ID 替换。这用于跟踪该表是否需要为了防止事务 ID 重叠或者允许收缩 pg_clog 而进行清理。如果该关系不是表则为零(InvalidTransactionId)。 | |
| relacl | aclitem[] | 访问权限。参阅 GRANT 和 REVOKE 获取详细信息。 | |
| reloptions | text[] | 访问方法特定的选项,使用"keyword=value"格式的字符串 |
pg_attribute 字段信息
| 名字 | 类型 | 引用 | 描述 |
|---|---|---|---|
| attrelid | oid | pg_class.oid | 此字段所属的表 |
| attname | name | 字段名字 | |
| atttypid | oid | pg_type.oid | 这个字段的数据类型 |
| attstattarget | int4 | 控制 ANALYZE 为这个字段积累的统计细节的级别。零值表示不收集统计信息。负数表示使用系统缺省的统计对象。正数值的确切信息是和数据类型相关的。对于标量数据类型,attstattarget 既是要收集的"最常用数值"的目标数目,也是要创建的柱状图的目标数量。 | |
| attlen | int2 | 是本字段类型的 pg_type.typlen 的拷贝 | |
| attnum | int2 | 字段数目。普通字段是从 1 开始计数的。系统字段(比如 oid)有(任意)正数。 | |
| attndims | int4 | 如果该字段是数组,那么是维数,否则是 0 。目前,一个数组的维数并未强制,因此任何非零值都表示"这是一个数组"。 | |
| attcacheoff | int4 | 在磁盘上的时候总是 -1 ,但是如果加载入内存中的行描述器中,它可能会被更新以缓冲在行中字段的偏移量。 | |
| atttypmod | int4 | 记录创建新表时支持的类型特定的数据(比如一个 varchar 字段的最大长度)。它传递给类型相关的输入和长度转换函数当做第三个参数。其值对那些不需要 atttypmod 的类型通常为 -1 。 | |
| attbyval | bool | 这个字段类型的 pg_type.typbyval 的拷贝。 | |
| attstorage | char | 这个字段的类型的 pg_type.typstorage 的拷贝。对于可压缩的数据类型(TOAST),这个字段可以在字段创建之后改变,以便于控制存储策略。 | |
| attalign | char | 这个字段类型的 pg_type.typalign 的拷贝 | |
| attnotnull | bool | 这代表一个非空约束。可以改变这个字段以打开或者关闭这个约束。 | |
| atthasdef | bool | 这个字段有一个缺省值,此时它对应 pg_attrdef 表里实际定义此值的记录。 | |
| attisdropped | bool | 这个字段已经被删除了,不再有效。一个已经删除的字段物理上仍然存在表中,但会被分析器忽略,因此不能再通过 SQL 访问。 | |
| attislocal | bool | 这个字段是局部定义在关系中的。请注意一个字段可以同时是局部定义和继承的。 | |
| attinhcount | int4 | 这个字段所拥有的直接祖先的个数。如果一个字段的祖先个数非零,那么它就不能被删除或重命名。 |
外部表
包含三个表:
- pg_foreign_data_wrapper
- pg_foreign_server
- pg_foreign_table
结论
PG的库、表、字段信息跟Hive一样,也包含了权限认证方面的东西
此外还有很多PG自己的东西,比如
- 库信息:模板库,库的最大连接,清理标记
- 表信息:表空间、索引类型、页大小、表类型(普通表、索引、序列、视图),统计信息
- 字段信息:字段类型、字段数目、压缩情况、缺省值、约束、统计信息
基本是包含了很多存储细节、优化信息,数据是PG自己管理的,所以它可以这么存
如果是外部表,可以更多参考Hive的实现,内部表可以参考PG的
参考
pg_catalog Overview
System Catalogs
PG文档
MySQL
大致分为这么几类:
- 字符集和排序规则相关
- 权限相关
- 库、表、字段、以及表空间、分区和相关参数
- 视图、存储过程、触发器、函数和相关参数
- 约束、外键等
- 全局状态和变量、session状态和变量、processlist等
- 插件、引擎、存储空间
- InnoDB相关参数
表结构
库信息表结构
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| CATALOG_NAME | varchar(512) | NO | |||
| SCHEMA_NAME | varchar(64) | NO | |||
| DEFAULT_CHARACTER_SET_NAME | varchar(32) | NO | |||
| DEFAULT_COLLATION_NAME | varchar(32) | NO | |||
| SQL_PATH | varchar(512) | YES | NULL |
Table信息表结构
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| TABLE_CATALOG | varchar(512) | NO | |||
| TABLE_SCHEMA | varchar(64) | NO | |||
| TABLE_NAME | varchar(64) | NO | |||
| TABLE_TYPE | varchar(64) | NO | |||
| ENGINE | varchar(64) | YES | NULL | ||
| VERSION | bigint(21) unsigned | YES | NULL | ||
| ROW_FORMAT | varchar(10) | YES | NULL | ||
| TABLE_ROWS | bigint(21) unsigned | YES | NULL | ||
| AVG_ROW_LENGTH | bigint(21) unsigned | YES | NULL | ||
| DATA_LENGTH | bigint(21) unsigned | YES | NULL | ||
| MAX_DATA_LENGTH | bigint(21) unsigned | YES | NULL | ||
| INDEX_LENGTH | bigint(21) unsigned | YES | NULL | ||
| DATA_FREE | bigint(21) unsigned | YES | NULL | ||
| AUTO_INCREMENT | bigint(21) unsigned | YES | NULL | ||
| CREATE_TIME | datetime | YES | NULL | ||
| UPDATE_TIME | datetime | YES | NULL | ||
| CHECK_TIME | datetime | YES | NULL | ||
| TABLE_COLLATION | varchar(32) | YES | NULL | ||
| CHECKSUM | bigint(21) unsigned | YES | NULL | ||
| CREATE_OPTIONS | varchar(255) | YES | NULL | ||
| TABLE_COMMENT | varchar(2048) | NO |
列信息表结构
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| TABLE_CATALOG | varchar(512) | NO | |||
| TABLE_SCHEMA | varchar(64) | NO | |||
| TABLE_NAME | varchar(64) | NO | |||
| COLUMN_NAME | varchar(64) | NO | |||
| ORDINAL_POSITION | bigint(21) unsigned | NO | 0 | ||
| COLUMN_DEFAULT | longtext | YES | NULL | ||
| IS_NULLABLE | varchar(3) | NO | |||
| DATA_TYPE | varchar(64) | NO | |||
| CHARACTER_MAXIMUM_LENGTH | bigint(21) unsigned | YES | NULL | ||
| CHARACTER_OCTET_LENGTH | bigint(21) unsigned | YES | NULL | ||
| NUMERIC_PRECISION | bigint(21) unsigned | YES | NULL | ||
| NUMERIC_SCALE | bigint(21) unsigned | YES | NULL | ||
| DATETIME_PRECISION | bigint(21) unsigned | YES | NULL | ||
| CHARACTER_SET_NAME | varchar(32) | YES | NULL | ||
| COLLATION_NAME | varchar(32) | YES | NULL | ||
| COLUMN_TYPE | longtext | NO | NULL | ||
| COLUMN_KEY | varchar(3) | NO | |||
| EXTRA | varchar(30) | NO | |||
| PRIVILEGES | varchar(80) | NO | |||
| COLUMN_COMMENT | varchar(1024) | NO | |||
| GENERATION_EXPRESSION | longtext | NO | NULL |
结论
MySQL的元数据,抛开数据库独有的部分,大体上跟PG差不多,只是多了InnoDB相关的信息
参考
A Diagram of the MySQL information schema
Introduction information schema
INFORMATION_SCHEMA Table Reference
ER-DIAGRAM OF THE INNODB DATA DICTIONARY
INFORMATION_SCHEMA Tables
MySQL 5.7 INFORMATION_SCHEMA 详解
MySQL information_schema 详解