之前学习Oracle数据库之后,对于表空间、用户、schema等概念一直有些模糊,也没有理清楚他们之间的关系,最近回过头重新看了这部分的知识后,将自己对这方面的知识点做一下小结,本篇文章并不是常规的技术文章,只作为个人的小结分享。

先说说什么是Oracle数据库

Oracle数据库是能满足我们存取数据需要的数据管理系统。完整的Oracle数据库通常由两部分组成:物理数据库和数据库实例。也就是说,Oracle数据库是物理存储和内存进程的集合。

  1. 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等);
  2. Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。

什么是数据库实例

当我们启动数据库服务时,就会在内存中创建一个数据库实例出来,由这个Oracle数据库实例来访问和控制磁盘中的数据文件,常见的数据库实例有ORCL这个过程可以想象成是JAVA中根据classnew出了一个对象出来,我们可以根据这个对象调用具体的数据库方法。一个数据库可以有多个实例,在作数据库服务集群的时候可以用到。
正如上面介绍的一样,数据库实例是Oracle数据库的组成部分,是在内存中运行,为用户提供访问和操作数据库的后台进程。

什么是表空间(Table Space)?

Oracle数据库是通过表空间来存储物理表的,一个数据库可以划分为多个表空间,每个表空间可以存储多张表。表空间是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。把数据库当做一个大仓库,为了管理方便,我们可以人工将这一片大的空间分为A、B、C等区间,这样的A/B/C区间就相当于是表空间。(也可以理解为是去餐厅吃饭,每张桌子上面都有一个桌号,方便服务员上菜)。

关于用户

有了表空间,下一步自然是建表。但是在建表之前还有一步,就是要先创建用户,只有用户才能建表。用户是独立于表空间的存在,我们可以从上面的介绍中知道表空间其实也是数据存储的容器,但用户可以理解为是数据的归属者。还是举仓库的例子,仓库提供的只是存放物料的空间,但物料的管理人还是具体的一个个的仓管,也就是用户。当然了,仓管应该有属于自己的管辖范围和权限,所以需要为仓管定义好货物具体存放的位置。所以对于用户来说,我们也需要为其指定好对应的表空间。

什么是Schema(方案)?

方案(schema)又叫模式,是比表空间小一级的逻辑概念,它也是一个逻辑容器。Schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字。schema里面包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, 和 database links
我们知道一共表空间可以被多个用户共用,那如何区分开每一个用户?那么在表空间中对每个用户都有一个对应的方案,用于保存单个用户的信息。举仓库的例子来说,我们现在把仓库的A区进一步分为N个房间,每个房间是属于特定的仓管的,这一个个的能够存储货物的房间就相当于是schema,一个房间由一个仓管负责。

关于数据文件(dbf、ora):

数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真 正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

关于表数据和用户的关系

表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。由于oracle的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!


schema共用表空间吗_schema共用表空间吗





2023-08补充

(一)缺省用户名和缺省表空间

从上面的文字描述中我们可以知道,表空间是数据存储的逻辑单位,但实际上一张表的归属不单单看表空间,还得看是属于表空间的哪个用户的。所以我们在oracle数据库中创建表,需要注意我们创建的表有没有放在正确的位置。

我们看看下面的标准建表语句:

CREATE TABLE user_name.table_name (
    column1 datatype [constraints],
    column2 datatype [constraints],
    column3 datatype [constraints],
    ...
    table_constraints
) TABLESPACE tablespace_name;
  • 当未显式指定user_name时,此时所创建的表会默认放在当前登录的用户上面
  • 当未显式指定tablespace_name时,此时所创建的表会默认放在指定用户的默认表空间中。若建表语句中也未指定user_name,则表会默认放在当前登录用户的默认表空间中

为什么这里会特别强调表空间的归属呢?
因为实际上一个用户可以有多个表空间,而且在一些复杂的项目中用户不同的表空间存储的数据类型、磁盘大小可能都是不同的。如果在建表的时候没有注意好表存放的表空间的话,那么表就会放在用户默认的表空间里面,占用了默认表空间的存储容量。

(二)关于oracle的版本

oracle版本

时间

Oracle 1

1979年

Oracle 2

1983年

Oracle 3

1984年

Oracle 4

1985年

Oracle 5

1986年

Oracle 6

1988年

Oracle 7

1992年

Oracle 8

1997年

Oracle 8i

1999年("i"代表Internet

Oracle 9i

2001年

Oracle 10g

2003年("g"代表grid网格计算)

Oracle 11g

2007年

Oracle 12c

2013年("c"代表cloud云计算)

Oracle 18c

2018年

Oracle 19c

2019年

Oracle 21c

2020年

oracle自1979年推出以来,有三个标志性的版本,分别是8i、10g、12c,代表着不同版本中oracle的战略性目标,oracle8i,引入了一些针对互联网应用的功能和改进,包括更好的分布式数据库支持、Java集成和Web应用程序开发工具;oracle10g这个版本引入了网格计算的概念,旨在提供更高的可伸缩性、可靠性和性能。它支持在多个服务器上分布和管理数据库资源,以实现更好的负载平衡和容错能力;oracle12c强调了Oracle数据库在云计算环境中的功能和优势。它引入了一些云相关的功能,如多租户架构、自动化管理和数据库即服务(Database as a Service)等。

需要注意的是,oracle并不是在oracle10g版本后才有分布式数据库的管理能力,之前就有了。只是10g版本推出的网格计算功能增强了分布式数据库的管理能力和资源分配能力,使得数据库能够更好地适应大规模数据处理和分析的需求。

oracle在12c版本中,提出了"多租户架构",允许在单个数据库实例中创建多个独立的容器数据库(CDB)和子数据库(PDB)。这种架构可以实现更高级别的资源隔离和共享,简化管理,并提供更好的多租户支持。这种特性让我们在数据库的管理上更加的灵活,在原先我们要想实现资源隔离类似的功能应该是只能通过创建多个数据库实例来实现,而现在只需要在一个数据库实例中创建多个容器数据库,或者在一个容器数据库创建多个子数据库就可以实现资源隔离(和共享)的效果。(在容器数据库级别上创建的用户、角色、表空间等对象可以被所有子数据库共享和使用)