初次接触openGauss或GaussDB数据库的逻辑对象,被其中的表空间、数据库、schema和用户之间的关系,以及授权管理困惑住了,与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系,以加深理解。
1、GaussDB数据库逻辑对象
1.1 表空间、Database和表
GaussDB数据库中逻辑对象包括表空间、Database和表、索引等,其中Database是数据的集合、表空间是数据在物理上的位置,数据库中的所有对象都存储在表空间中。
- 表空间Tablespace:表空间是一个目录,数据库中可以存在多个表空间,其中存储的是它所包含的数据库的各种物理文件。每个表空间可以对应多个Database。gaussdb中系统默认表空间pg_default,当建表时未指定表空间都使用默认表空间。
- Database:数据库是逻辑上的抽象,各个database之间相互隔离,同一个database上的数据库对象可以存在多个表空间中。Gaussdb中会默认创建postgres数据库
- 表Table:Table是数据的结构化视图,存储特定类型的数据。每张表只能属于一个数据库,也只能对应到一个Tablespace。每张表对应的数据文件必须在同一个Tablespace中。
其中关系如图所示,总结如下:
- 数据库实例中可以定义多个Database和表空间;
- 一个Database中可以包含多个表空间;
- 一个表空间中可以包含多个数据库;
- 一个数据库中可以包含多个表;
- 一个表必须属于一个数据库,并存储在一个表空间中。
1.2 用户和Schema
GaussDB数据库中用户user、角色role和schema各自不同的作用:
- 用户是数据库中的实体,用于标识和管理数据库中的各种操作权限和资源使用权限。每个用户都有唯一的用户名,用于登录数据库和执行相关操作。在GaussDB中,用户和用户组在实例范围内是共享的,也就是默认情况下通过单个用户可以连接到任一数据库,但是数据不是共享的,受到权限的管控。
- 角色是一组用户的集合,通过角色可以将权限授予一组用户,而不是单独授予每个用户。角色可以包含其他角色,形成层次结构。通过为角色分配权限,然后将角色授予用户,可以实现权限的快速分配和撤销。
- Schema是数据库对象的集合,它包含了数据库中的所有表、视图、存储过程、函数等对象。每个数据库可以包含一个或多个Schema,用于将数据库对象组织成逻辑上独立的组。通过Schema,可以允许多个用户使用同一数据库而不相互干扰,将数据库对象组织成易于管理的逻辑组。在数据库创建后,会有一个默认的名为Public的schema。
需要注意的是,在GaussDB中,每次创建新用户时,系统会在当前登录的数据库中默认为新用户创建一个同名Schema,此时在当前数据库中创建同名的schema会提示已存在。对于其他数据库,若需要同名Schema,则需要用户手动创建。
另外,如果未指定schema访问表时,系统会通过search_path(搜索路径)来判断该表是哪个schema下的表(其中pg_temp和pg_catalog默认会作为搜索路径顺序中的前两位)。search_path(搜索路径)是一个schema名列表,在其中找到的第一个表就是目标表,如果没有找到则报错。在搜索路径中的第一个schema叫做current schema(通过show current_schema可以查看),在没有声明schema名时,新创建的数据库对象会默认存放在该schema下。
用户、Database和schema之间关系如图所示,总结如下:
- 每个数据库中可以包含多个用户,用户在实例范围内是共享的;
- 每个数据库中可以定义多个schema,schema之间是互相隔离的,不同数据库之间可以定义相同的schema名;
- 每个schema包含多个数据库对象,但每个数据库对象只能属于一个Schema。
用户对不同的Database中不同schema的访问通过设置不同的权限进行管理控制。
1.3 不同对象之间权限管理
GaussDB数据库中的权限管理沿用了Oracle数据库的权限管理特性,权限层级分为多个级别,包括系统权限和对象权限:
- 系统权限:系统规定用户使用数据库的权限,如登录数据库(LOGIN)、创建数据库(CREATEDB)、创建用户/角色(CREATEROLE)等。
- 对象权限:指在数据库对象(如数据库、模式、表、视图、函数等)上执行特殊动作的权限,如查看(SELECT)、更新(UPDATE)、插入(INSERT)、删除(DELETE)等。
在对角色和用户授权时候,主要有以下场景:
- 将系统权限授予角色或用户:比如授予数据库管理员SYSADMIN、MONADMIN权限,监控用户MONADMIN权限;
- 将数据库对象授予角色或用户:将数据库对象的相关权限授予特定的角色或用户,比如对schema的所有权限、schema下表的所有权限。
- 将角色或用户授予其它用户或角色:将一个角色或用户的权限授予其它多个角色,比如创建了一个只读的角色,将该role授予其它用户。
- 将ANY权限授予角色或用户:ANY权限有很多种,比如CREATE ANY、SELECT ANY,当授予SELECT ANY TABLE权限给某个用户后,该用户在当前数据库下既有所有schema的查询权限,对于一些只读的查询用户还是很方便的。
GaussDB数据库中的权限管理颗粒度非常细,按照最小授权的原则管理上也相当复杂,因此在实际授权过程中按照schema和schema内的对象维度进行分别授权,全局的只读用户具备SELECT ANY的权限、业务读写用户具备对象级别的增删改查权限、系统视图如pg_catalog和sys等的查询权限。不过需要注意的是:
- DBE_PREF系统schema访问需要MONADMIN权限,单独授予SELECT权限不生效;
- Schema内的对象授权时,需要具备schema的usage权限才能正常访问其中的schema;
1.4 MySQL数据库中逻辑对象对比
在MySQL数据库中,数据库也是存储数据的容器,它包含了表、视图、存储过程、函数、触发器、事件等数据库对象。
- schema通常与数据库是同义词,指的是数据库结构的集合,创建一个新的数据库时,实际上已经创建了一个新的schema。
- 表也是数据库中最基本的存储单元,它以行和列的形式存储数据。
- 表空间在innodb存储引擎中分为系统表空间和数据表空间,系统表空间包含数据字典、事务信息和undo日志等信息,而打开innodb_file_per_table配置后会为每张表单独创建一个表空间文件,每个表空间文件中存放的是数据、索引和插入缓存等信息。
因此,在逻辑结构上MySQL系的数据库中的数据库实例与GaussDB数据库中的database相当,一个数据库中可以创建多个database或schema,每个database中又可以创建不同的表,不同database间共享系统表空间和资源。
1.5 总结
总结GaussDB数据库的逻辑对象之间的关系,如下图所示:
- 在逻辑层面,GaussDB数据库以不同的database进行逻辑上的区分,一个数据库实例中可以定义多个database,database内可以定义不同的schema、schema内又包含不同的数据库对象。
- 在物理存储层面,表空间对应的是实际的数据存储目录,同一个database可以使用不同的表空间、同一个表空间又可以被不同的database使用。不过在实际使用过程中建议使用默认的表空间。
- 在权限控制上,通过对不同用户或角色授予不同对象的访问权限进行细粒度的权限管控,达到最小化授权的目的。
参考资料:
- https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30
- https://blog.csdn.net/weixin_38623994/article/details/100047552
- https://bbs.huaweicloud.com/blogs/236381