购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 逻辑结构

openGauss数据库的逻辑结构如图2-1所示。

2.2.1 数据库

数据库(database)是存储在一起的相关数据的集合,这些数据可以被访问、管理及更新。

数据库用于管理各类数据对象,并与其他数据库隔离。创建数据对象时可以指定存放的表空间,如果不指定表空间,相关的对象会默认保存在PG_DEFAULT表空间中。数据库管理的对象可以分布在多个表空间上。

图2-1 openGauss数据库的逻辑结构

2.2.2 模式

模式(schema)是数据库对象的集合,例如表、视图、序列、存储过程、同义名、索引及数据库链接。

数据库与模式都是数据对象的集合,它们的区别在于:一个数据库可以包含多个模式,而一个模式只能属于一个数据库。因此,模式更像是数据库中数据对象的分组,可以方便管理和授权。

2.2.3 表空间

简单来说,表空间(tablespace)就是数据库中用于存放数据的存储空间。不同类型的数据库对表空间的定义有所不同。

Oracle数据库的表空间是一组数据文件的逻辑分组,普通的表空间(smallfile tablespace)包括的数据文件数量不得大于1024,大文件表空间(bigfile tablespace)则只能有一个数据文件。

SQL Server数据库只有文件组(多个数据文件的组合),没有表空间的概念,每个数据库的数据都存放在各自的文件组中。

MySQL的InnoDB存储引擎会默认创建一个共享的系统表空间,把InnoDB的数据字典等系统数据存放到一个名为ibdata1的文件中,另外,也可以存储用户自建表的数据。当开启innodb_file_per_table配置选项时,InnoDB存储引擎会为每个表创建一个独立的表空间,即每个表都有一个单独的.ibd文件,用于存储其数据和索引,这样可以更好地实现数据隔离和管理。

openGauss数据库的表空间只是文件系统中的一个目录,它可以为所有的数据库对象分配存储空间,是在物理数据和逻辑数据之间提供的抽象层。表空间存放的是它所包含的数据库的物理文件,作用是物理隔离,其管理功能依赖于文件系统。

表空间可以有多个。创建数据库对象时可以指定该对象所属的表空间(该表空间必须事先创建完成)。

2.2.4 表

表(table)是由行与列组合而成的逻辑实体,也是数据库中用来存储数据的数据库对象,是整个数据库系统的基础。每张表只能属于一个数据库,也只能对应到一个表空间。

2.2.5 数据文件

openGauss数据库的数据文件(datafile)跟其他数据库的数据文件有很大的不同,通常每张表只对应一个数据文件。如果表的数据大于1GB,则会自动分成多个数据文件进行存储。数据文件的命名跟数据库目录一样,也是采用数字命名。当数据文件大于1GB时,新增加的数据文件名加后缀编号,如filename.1、filename.2等。例如,数据文件1000,数据增加大于1GB后,新增加的数据文件为1000.1。

如果想要确定某张表对应文件目录中的哪个文件,就需要根据表的属性进行查询。例如,用户test在数据库test下创建了表t1。如果想要查询表t1对应的数据文件,首先要确定数据库test的OID:

test=# select oid,datname from pg_database where datname='test';
  oid  | datname
-------+--------------
 16397 |    test
(1 row)

然后,查找用户test的OID:

test=# select oid,rolname from pg_authid where rolname='test';
  oid  | rolname
-------+--------------
 16398 |    test
(1 row)

因为不同的schema下有可能存在相同的表名,所以还要查找test用户的schema的OID(用户的默认schema与用户名相同):

test=# select oid,nspname from pg_namespace where nspname='test';
  oid  | nspname
-------+--------------
 16400 |    test
(1 row)

最后查找数据文件名:

test=# select relname,relowner,relnamespace,relfilenode from pg_class where relname='t1' and relowner=16398 and relnamespace=16400;
 relname | relowner | relnamespace | relfilenode
---------+----------+--------------+-------------------
      t1 |    16398 |        16400 |      24597
(1 row)

在数据库test的目录16398可以找到文件24597,这就是test用户创建的表t1的数据文件。

也可以写一个复杂的查询,用于查询所有的表的文件信息:

select relname,rolname,nspname,relfilenode from pg_class c,pg_authid a,pg_namespace n where c.relowner=a.oid and c.relnamespace=n.oid;

注意,pg_class中“映射”表的relfilenode为0。例如,数据库目录下的pg_filenode.map文件用于将当前目录下系统表的OID与具体文件名进行硬编码映射。relfilenode为0的数据文件就是通过pg_filenode.map将OID与文件硬编码映射的。

在系统表中查询数据文件名的方法很麻烦。好在openGauss数据库提供了系统函数pg_relation_filenode,普通用户可以直接使用这些系统函数查询到表的数据文件名:

test=> select pg_relation_filenode('t1');
 pg_relation_filenode
------------------------------------
                24597
(1 row)

使用系统函数pg_relation_filepath可以查询数据文件的完整路径:

test=> select pg_relation_filepath('t1');
 pg_relation_filepath
------------------------------------
 base/16397/24597
(1 row)

在查询SQL中可以直接调用这些系统函数。例如,查询test模式下所有表的数据文件路径:

test=> select tablename,pg_relation_filepath(tablename::varchar) from pg_tables where schemaname='test';
 tablename | pg_relation_filepath
-----------+------------------------------
        t1 | base/16397/24597
(1 row)

2.2.6 数据块

数据块(block)是openGauss数据库管理的基本数据存储单位,默认大小为8KB。 lEdT9c+sSQtc3dV0qLwi96r1j0HlUCk4SBEXNZU8RhdYqy4rd+IgkGcCTjVMrg6w

点击中间区域
呼出菜单
上一章
目录
下一章
×