数据库的基本原理都是相似的,但不同的数据库管理软件的实现方式有非常大的差异。不同的运行机制表现出不同的系统架构,用户体验也会有很大的不同。
数据库实例是数据库软件在内存中的运行内容,数据库则是指存放在磁盘上的数据库文件。以Oracle数据库为例:图2-1所示是一张经典的Oracle数据库体系架构图。上半部分是运行在内存中的数据库实例,由一组系统进程(线程)组成;下半部分为数据库,由一组存放在磁盘上的文件组成。
图2-1
图2-2所示是达梦数据库公司提供的技术手册上的数据库系统架构图。图的上部分是在内存中运行的达梦数据库实例,下部分是磁盘上的数据库文件,中间部分的逻辑结构是对物理结构的抽象表达。
图2-2
虽然数据库和数据库实例这两个概念含义不同,但在实际应用中,数据库实例经常被简称为数据库。因此,这两个概念在很多时候不做严格区分。
达梦数据库提供V$DATABASE和V$INSTANCE两个视图,可以查询数据库和实例的有关信息。
数据库用户(user)是指登录数据库的账号。只有通过数据库账号连接数据库实例,才能使用数据库资源。
模式(schema)是一个逻辑上的概念,指数据库对象的集合。常见的数据库对象有表、视图、索引、存储过程、函数、触发器、序列、同义词、数据库链接等。模式的作用是方便对以上这些对象进行分组管理。引用这些数据库对象的完整格式为[模式名].对象名。
达梦数据库在创建用户的同时也会创建一个同名模式,并作为这个用户的默认模式。用户操作自己的默认模式下的数据库对象时可以省略模式名。
达梦数据库也可以直接创建模式:
SQL> create schema 模式名;
达梦数据库的体系架构很简单:一个数据库实例对应一个数据库,数据库中的每个用户分别对应各自的模式。
下面简单介绍目前常用的关系型数据库的体系架构,通过对比有助于读者更好地理解达梦数据库。
Oracle数据库12C之前的版本的体系架构跟达梦数据库类似,唯一不同的是Oracle数据库把user和schema合二为一,但不能单独创建schema,只能通过创建user的方式创建schema。
Oracle数据库从12C开始推出了多租户概念,引入了CDB(container database,容器数据库)和PDB(pluggable database,可插拔数据库)。Oracle数据库的CDB可以看成是一个容器,用来存放数据库。在CDB中可以有多个PDB,其中存在一个root根容器(CDB$ROOT)、一个种子容器(PDB$SEED)和多个PDB。PDB$SEED与SQL Server的model数据库类似,用来创建PDB的模板库。所有的PDB共用联机日志文件、控制文件和参数文件,每个PDB下有各自的管理员和用户,可以单独进行启动、关闭。
虽然在达梦数据库服务器上也可以创建并运行多个数据库,但每个数据库都是独立的,各自使用各自的数据文件、日志文件、控制文件和参数文件。而且每个数据库只能运行在各自的数据库实例下(通过端口号区分)。而在Oracle的多租户数据库环境中,所有PDB都运行在同一个数据库实例下(通过数据库名区分)。这是达梦数据库和Oracle多租户数据库的最大区别。
Microsoft公司的SQL Server数据库的体系架构跟达梦数据库有所不同。SQL Server的schema称为架构。一个数据库实例下可以有多个数据库(每个数据库使用自己的数据文件和日志文件),每个数据库下可以创建多个架构。
SQL Server的用户机制较为复杂,由登录名和用户两部分组成。登录名负责登录到数据库实例,登录名可以设置默认数据库,但访问时还需要在数据库中创建相应的映射用户并赋予操作权限,每个用户的默认架构为dbo。
MySQL的体系架构比较简单,一个数据库实例下有多个数据库,一个数据库对应着数据库datadir路径下的一个目录(在8.0之前的版本甚至可以通过直接在该路径下创建目录的方式来创建数据库),每个数据库的目录下只存放各自的数据文件。参数文件(my.ini)、二进制日志文件、redo文件和undo文件以及其他文件都是所有数据库共用的。
MySQL没有scheam,即MySQL把database和schema合二为一了。MySQL的用户跟数据库没有直接关系,需要管理员授权才能访问数据库,也不存在默认数据库。