Oracle 数据库、实例、表空间、用户
Oracle 介绍
Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系数据库管理系统。Oracle 可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的适应高吞吐量的数据库解决方案。
完整的 Oracle 通常由两部分组成:Oracle 数据库和 Oracle 实例(instance)(MySQL 没有实例的概念)。
- Oracle 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)。
- 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 |
|
数据库实例
用 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 |
|
连接数据库,可以用数据库实例名: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 |
|
示例:
1 |
|
查看已经创建好的表空间:
1 |
|
用户
Oracle 数据库建好后,要想在数据库里建表,必须先为数据库建立用户,并为用户指定表空间。
除了默认表空间外,还可以为用户分配额外的表空间权限。
用户是在实例下建立的。不同实例可以建相同名字的用户。它跟表空间是多对多的关系的,但我们在创建用户时一般都指定默认表空间的,若不指定用户默认表空间的话,则用户每次创建数据库对象的时候,都要指定表空间,太麻烦
上面我们建好了数据库和表空间,接下来建用户:
1 |
|
示例:
1 |
|
有了用户,要想使用用户账号管理自己的表空间,还得给它分权限:
1 |
|
查看数据库用户:
1 |
|
数据文件(dbf、ora)
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。
一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。
表
有了数据库,表空间和用户,就可以用自定义的用户在自己的表空间创建表了。
一个表只能属于一个表空间。可以在创建表时,指定存储在哪个表空间中。
表的数据,是由用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。
由于 oracle 的数据库不是普通的概念,oracle 是由用户和表空间对数据进行管理和存放的。但是表不是由表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里的区分就是用户了
如查询他人的表,需要使用全限定表名(包括用户名和表名)
1 |
|
总结
实例和数据库的关系
- 实例用于管理和控制数据库;而数据库为实例提供数据。
- 一个数据库可以被多个实例装载和打开;一个实例在其生存期内只能装载和打开一个数据库。
用户和实例的关系
- 一个用户只能属于一个实例,不同实例可以有相同的用户名字
用户和表空间的关系
- 用户和表空间是多对多的,一个用户可以多个表空间,但是默认的表空间只有一个,当创建表、视图、索引等不指定表空间时,都会存放在默认表空间中,一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。
- 用户和表空间没有隶属关系,表空间是一个用来管理数据存储逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。
表空间和表的关系
- 一个表空间可以有多个表,一个表只能属于一个表空间。
表空间和表和用户的关系
- 在同一个表空间中,不同用户创建的表可以同名。
- 用户可以创建多个表(每个表随机存储在一个或多个数据库文件中)