Oracle 数据库、实例、表空间、用户

Oracle 介绍

Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。Oracle 可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的适应高吞吐量的数据库解决方案。

完整的 Oracle 通常由两部分组成:Oracle 数据库和 Oracle 实例(instance)(MySQL 没有实例的概念)。

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

在启动 Oracle 时,实际上是在服务器的内存中创建一个 Oracle 实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个 Oracle 数据库实例来访问和控制磁盘中的数据文件。

数据库

Oracle 数据库 的概念和其它数据库不一样。Oracle 数据库 是指 存储在磁盘上的一系列物理文件(包括数据文件 ORA 或者 DBF、控制文件、联机日志文件、参数文件等),它们记录了数据库的数据和元数据。

我们在安装 Oracle 数据库时,会让我们创建 全局数据库 如下图:


全局数据库,是数据库系统的入口,它会内置一些高级权限的用户如 SYS,SYSTEM 等。我们用这些高级权限账号登陆就可以在数据库实例中创建表空间,用户,表了。

数据库的名称是由全局数据库名(Global Database Name)决定的,它是数据库的唯一标识,一般不会修改。

全局数据库名由数据库名(DB_NAME)和域名(DB_DOMAIN)组成,例如:orcl.example.com。全局数据库名在安装 Oracle 数据库时就要指定,它会写入控制文件和数据字典中,也会影响到数据库的连接和访问。

如果一台机器上装了多个数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数 DB_NAME 被写入参数文件之中。格式如下:DB_NAME=myorcl

查询当前数据库名:

1
select name from v$database;

数据库实例

用 Oracle 官方描述:实例是访问 Oracle 数据库所需的 一部分计算机内存辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合。

Oracle 实例 由操作系统的多个后台进程和一个共享的内存池所组成,共享的内存可以被所有进程访问。Oracle 用它们来管理数据库访问。

用户如果要存取数据库(也就是硬盘上的文件)里的数据,必须通过 Oracle 实例能实现,不能直接读取硬盘上的文件。实际上,Oracle 实例就是平常所说的数据库服务(service)。在任何时刻,一个实例只能与一个数据库关联,访问一个数据库;而同一个数据库可由多个实例访问(RAC)

简单来说:实例就是 用来访问和使用数据库的进程,它只存在于内存中。就像 Java 中 new 出来的实例对象一样。

我们访问 Oracle 都是访问一个实例,这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。

SID(System Identifier)

SID 是 Oracle 数据库实例的唯一标识符。它是一个字符串,并且在数据库安装时由 DBA 手动设置。使用 SID 登录时,连接字符串通常为:hostname:port:SID。例如:localhost:1521:ORCL

数据库实例名(Service Name)

SERVICE_NAME 是 oracle 8i 新引进的,8i 之前,一个数据库只能由一个实例对应,但是随着高性能的需求,并行技术的使用,一个数据库可以由多个实例对应了,比较典型的应用如 RAC。为了充分利用所有实例,并且令客户端连接配置简单,ORACLE 提出了SERVICE_NAME的概念。该参数直接对应数据库,而不是某个实例。

SERVICE_NAME 有许多其它的好处。该参数 的 缺省值为 Db_name.Db_domain,即等于 Global_name。 一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。Sid是数据库实例的名字,每个实例各不相同。

在一般情况下,数据库名和实例名是一对一的关系,但如果在 oracle 并行服务器架构(即 oracle 实时应用集群)中,数据库名和实例名是一对多的关系。

查询当前数据库实例名:   

1
2
3
select instance_name from v$instance; 
-- 或者
show parameter instance

连接数据库,可以用数据库实例名:jdbc:oracle:thin:@localhost:1521/orcl(orcl就为数据库实例名)

数据库和实例的关系

数据库和实例是 Oracle 数据库的两个重要组成部分,它们之间有着密切的关系。

  • 一般来说,一个数据库只能被一个实例访问,这种模式叫做单实例数据库(Single Instance Database)。

  • 在某些情况下,一个数据库可以被多个实例访问,这种模式叫做多实例数据库(Multi Instance Database),也叫做 Oracle Real Application Clusters(RAC)。
    RAC 是 Oracle 数据库的一种高可用性和高性能的解决方案,它可以实现数据库的负载均衡和故障转移。

表空间

表空间是数据库的逻辑划分,它是一组数据文件的集合,用于存储数据库对象,如表、索引、视图等。

表空间是数据库的组织和管理的单位,它可以根据不同的用途和需求进行划分,例如:系统表空间(SYSTEM)用于存储系统对象,用户表空间(USERS)用于存储用户对象,临时表空间(TEMP)用于存储临时数据等。

表空间的名称是由表空间名(Tablespace Name)决定的,它是表空间的唯一标识,可以由用户自定义。

Oracle 数据库是通过表空间来存储物理表的,一个数据库实例可以有 N 个表空间,一个表空间下可以有 N 张表。

创建表空间语法:

1
2
3
4
Create TableSpace 表空间名称 
DataFile 表空间数据文件路径
Size 表空间初始大小
Autoextend on

示例:

1
2
3
4
create tablespace db_test 
datafile 'D:\\oracle\\product\\10.2.0\\userdata\\db\_test.dbf'
size 50m
autoextend on;

查看已经创建好的表空间:

1
select default_tablespace, temporary_tablespace, d.username from dba_users d

用户

Oracle 数据库建好后,要想在数据库里建表,必须先为数据库建立用户,并为用户指定表空间。

除了默认表空间外,还可以为用户分配额外的表空间权限。

用户是在实例下建立的。不同实例可以建相同名字的用户。它跟表空间是多对多的关系的,但我们在创建用户时一般都指定默认表空间的,若不指定用户默认表空间的话,则用户每次创建数据库对象的时候,都要指定表空间,太麻烦

上面我们建好了数据库和表空间,接下来建用户:

1
2
3
4
CREATE USER 用户名 
IDENTIFIED BY 密码
DEFAULT TABLESPACE 表空间(默认USERS)
TEMPORARY TABLESPACE 临时表空间(默认TEMP)

示例:

1
2
3
4
CREATE USER utest 
IDENTIFIED BY utestpwd
DEFAULT TABLESPACE db_test
TEMPORARY TABLESPACE temp;(这里临时表空间不能使用我们创建的db_test,不知为何?)

有了用户,要想使用用户账号管理自己的表空间,还得给它分权限:

1
2
3
GRANT CONNECT TO utest; 
GRANT RESOURCE TO utest;
GRANT dba TO utest; --dba 为最高级权限,可以创建数据库,表等。

查看数据库用户:

1
select * from dba_users;

数据文件(dbf、ora)

数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。

一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

有了数据库,表空间和用户,就可以用自定义的用户在自己的表空间创建表了。

一个表只能属于一个表空间。可以在创建表时,指定存储在哪个表空间中。

表的数据,是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。

由于 oracle 的数据库不是普通的概念,oracle 是由用户和表空间对数据进行管理和存放的。但是表不是由表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里的区分就是用户了

如查询他人的表,需要使用全限定表名(包括用户名和表名)

1
SELECT * FROM userB.table_name;

总结


实例和数据库的关系

  • 实例用于管理和控制数据库;而数据库为实例提供数据。
  • 一个数据库可以被多个实例装载和打开;一个实例在其生存期内只能装载和打开一个数据库。

用户和实例的关系

  • 一个用户只能属于一个实例,不同实例可以有相同的用户名字

用户和表空间的关系

  • 用户和表空间是多对多的,一个用户可以多个表空间,但是默认的表空间只有一个,当创建表、视图、索引等不指定表空间时,都会存放在默认表空间中,一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。
  • 用户和表空间没有隶属关系,表空间是一个用来管理数据存储逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。

表空间和表的关系

  • 一个表空间可以有多个表,一个表只能属于一个表空间。

表空间和表和用户的关系

  • 在同一个表空间中,不同用户创建的表可以同名。
  • 用户可以创建多个表(每个表随机存储在一个或多个数据库文件中)

Oracle 数据库、实例、表空间、用户
https://flepeng.github.io/042-Oracle-31-核心概念-Oracle-数据库、实例、表空间、用户/
作者
Lepeng
发布于
2025年4月1日
许可协议