共计 13093 个字符,预计需要花费 33 分钟才能阅读完成。
一、Oracle 体系结构
数据库的体系结构是指数据库的组成、工作过程、以及数据库中数据的组织与管理机制,要了解 Oracle 数据库的体系结构,必须理解 Oracle 系统的主要组件和重要概念。
1、Oracle 体系结构概述
Oracle 体系结构包含一系列组件,如下图所示,图中显示了 Oracle 体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。从图中可以看出,实例和数据库是 Oracle 数据库体系结构的核心组成部分,也是最重要的两个概念;DBA 一个很重要的工作就是维护实例和数据库本身的正常工作。
1)实例
Oracle 实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle 实例启动时,将分配一个系统全局区(SGA)并启动一系列 Oracle 后台进程。Oracle 实例有两种类型:单进程实例和多进程实例,单进程 Oracle 实例使用一个进程执行 Oracle 的全部操作,在单进程环境下的 Oracle 实例仅允许一个用户可存取;多进程 Oracle 实例(又称多用户 Oracle)使用多个进程来执行 Oracle 的不同部分,对于每个连接的用户都有一个进程。
2)数据库
数据库是数据的集合,物理上指存储数据库信息的一组操作系统文件,每个数据库有一个逻辑结构和物理结构。物理结构是指构成数据库的一组操作系统文件,主要由三种类型文件组成:数据文件、控制文件和重做日志文件。数据库的逻辑结构是指数据库数据的逻辑存储结构(如表空间、段)和模式对象(如表、视图等)。
3)可插拔数据库
从 Oracle 12c 版本开始,Oracle 引入了可插拔数据库的概念,可插拔是为云计算而生。可插拔的结构由一个容器数据库(CDB)和若干个可组装数据库(PDB)组成,每个 PDB 对外可充当一个独立的数据库工应用程序使用,它可以包含自己的数据文件,但是所有的 PDB 共享 CDB 的控制文件以及日志文件。所谓的可插拔,意味着 PDB 可以像 USB 一样随时插入 CDB 中,不用了也可以随时拔下来。一个 CDB 中最多可以插入 250 个 PDB,在 PDB 中,seedPDB 为模板 PDB,它为新创建的 PDB 提供模板,其他的 PDB 可以根据需要创建、删除。可插拔功能可以加速数据库的部署,给一个 CDB 打补丁就可以经所有的更新同步到其上的所有 PDB 中。
在 Oracle 12c 之前的版本中,实例和数据库只能是一对一或多对一(RAC,Real Application Clusters, 实时应用集群)的关系,即只能是一个实例对应一个数据库,或者多个实例对应一个数据库。但在 Oracle 12c 版本中,通过引入 CDB 和 PDB,一个实例可以对应多个可插拔数据库。
可插拔数据库的使用场景:
- 企业中有多个应用均需要使用 Oracle 数据库,他们仅使用非常少量的硬件资源,但是又不得不为他们创建多个实例;
- 一些不是特别重要的数据库,打包需要 DBA 花费大量的精力去维护;
- 为了更好的利用硬件资源以及减少管理开销,有必要将大量的部门级应用整合到少数几个 Oracle 关系型数据库中,以便部署和管理;
通过在一个集中化的平台部署多个数据库,同时又共享一个数据库实例,可以大大降低成本,即更少的实例损耗和耕地的存储技术。
如果在生产环境中只需要一个数据库,并不想使用可插拔数据库,可以在安装过程中取消勾选“创建为容器数据库”复选框,从而将安装一个普通数据库。
2、Oracle 服务器
Oracle 服务器它主要由实力和数据库文件组成,也就是常说的数据库管理系统(Database Management System,DBMS)。Oracle 服务器的组成如下图:
Oracle 服务器除了维护实例和数据库文件外,还在用户建立与服务器的连接时启动服务器进程并分配 PGA.(Program Area, 程序全全局区)。
3、Oracle 存储结构
Oracle 的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系。如下图所示:
- 物理结构主要描述 Oracle 数据库的外部存储结构,即在操作系统中如何组织、管理数据。
- 逻辑结构主要描述 Oracle 数据库的内部存储结构,即从逻辑概念上描述在 Oracle 数据库中如何组织、管理数据。
1)Oracle 物理结构
物理结构是 Oracle 数据库创建后使用的操作系统物理文件,Oracle 数据库的物理文件分为以下两类:
(1)主要文件
①数据文件: 数据文件(Data File)的扩展名通常是.dbf,是物理存储 Oracle 数据库数据的文件。
数据文件的特点:
- 每个数据文件只与一个数据库相联系;
- 一个表空间可包含一个或多个数据文件;
- 一个数据文件只能属于一个表空间;
②重做日志文件: 重做日志文件(Redo Log File)的扩展名是.log,它记录了对数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库。
在 Oracle 数据库中,重做日志文件是成组使用的,每个重做日志文件组可以有一个或多个重做日志文件。在工作过程中,多个重做日志文件组之间循环使用,当一个重做日志文件组写满后,会转向下一个日志文件组。重做日志文件用于记录数据库变化,是用户的事务处理日志。
③控制文件: 控制文件(Control File)的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息很多,其中包括数据文件和重做日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当 Oracle 读写数据时,要根据控制文件 的信息查找数据文件。
由于控制文件的重要性,一个数据库至少要有两份控制文件。Oracle 12c 默认包含两个控制文件,各个控制文件内容相同,从而可以避免因为一个控制文件的损坏而导致无法启动数据库的情况出现。
控制文件中记录了以下关键信息:
- 数据文件的位置及大小;
- 重做日志文件的位置及大小;
- 数据库名称及创建时间;
- 日志序列号;
(2)其他文件
其他文件有参数文件、归档日志文件、口令文件等。
2)Oracle 逻辑结构
数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle 数据库的逻辑结构包括表空间、段、区、块和模式等。如图:
(1)表空间
每个 Oracle 数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以由多个数据文件,但一个数据文件只能属于一个表空间。与数据文件这种物理结构不同,表空间属于数据库的逻辑结构。
在每个数据库中,都有一个名为“SYSTEM”的表空间,即系统表空间,还会有 SYSAUX、UNDO、USERS 等表空间,这些都是在创建数据库时自动创建的。管理员可以创建自定义的表空间并分配给指定用户,也可以为表空间增加和删除数据文件。
表空间基本有以下三类:
- ①永久性表空间:一般保持基表、试图、过程和索引等的数据。SYSTEM、SYSAUX、USERS 表空间是默认安装的;
- ②临时性表空间:只用于保存系统中短期活动的数据,如排序数据等;
- ③撤销表空间:用来帮助回退未提交的事务数据,已提交的数据在这里是不可以恢复的;
一般不需要创建临时性表空间和撤销表空间,除非要把他们转移到其他磁盘中以提高性能。
表空间的目的如下:
- ①对不同用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和对模式对象的管理;
- ②可以将不同数据文件创建不同的磁盘中,有利于管理磁盘空间、提高 I / O 性能、备份和恢复数据等;
一般在完成 Oracle 系统的安装并创建 Oracle 实例后,Oracle 系统自动建立 SYSTEM、SYSAUX、USRS 等多个表空间。
下面详细介绍一下 SYSTEM 表空间、SYSAUX 表空间、TEMP 表空间和 TEMP 表空间:
- SYSTEM 表空间:用于存放 Oracle 系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表,索引等对象存放到 SYSTEM 表空间中。
- SYSAUX 表空间:作为 SYSTEM 的辅助表空间,用于存放各种数据库工具用户的数据;还用于存放各种模式的对象数据,如智能代理用户 DBSNMP 等,这些模式在数据库安装完成后就建立了相应的对象并都存放在 SYSAUX 表空间中。
- USERS 表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表、索引等。
- TEMP 表空间:Oracle 系统用于存放临时数据的特殊表空间。比如:当操作中需要进行排序时,Oracle 系统就将排序的数据临时存放在该表空间内。排序处理完成后即可释放排序数据所占用的空间,因此成为临时表空间。
除了 Oracle 系统默认创建的表空间外,用户可根据应用系统的模式及其所要存储的对象类型创建多个表空间,以区分用户数据和系统数据。
创建表空间数据数据定义语言,语法如下:
SQL> create tablespace benet datafile'/u01/app/oracle/oradata/benet.DBF' size 10M
autoextend on;
在语法中:
- tablespacename 是表空间名称。
- DATAFILE 指定组成表空间的一个或多个数据文件,当有多个数据文件时使用逗号进行分隔。
- filename 是表空间中数据文件的路径和名称。
- SIZE 指定文件的大小,用 K 指定千字节大小,用 M 指定兆字节大小。
- AUTOEXTEND 子句用来启动或禁用数据文件的自动扩展。若设置 AUTOEXTEND��数为 ON,则空间用尽会自动扩展;当设置 AUTOEXTEND 参数为 OFF 时很容易出现表空间剩余容量为 0,造成数据不能存储到数据库中的情况出现。
创建完表空间之后,可以对表空间进行相应的管理,主要包括以下几种操作。
调整表空间大小,当遇到数据插入失败,表空间已满的情况,可以通过 ALTER 语句来调整表空间的大小,此时有两种调整表空间大小的方式。
方法一:更改数据文件的大小,并指明数据文件的存放路径,其中还使用了 RESIZE 关键字,用于指定调整后的数据文件的大小,代码如下:
SQL> alter database datafile'/u01/app/oracle/oradata/benet.DBF' resize 50M;
Database altered.
方法二:向表空间内添加数据文件。为表空间添加一个新的数据文件的代码如下:
SQL> alter tablespace benet add datafile '/u01/app/oracle/oradata/benet01.DBF' size 20M autoextend no;
Tablespace altered.
改变表空间的读写状态。当数据是历史数据,只允许查询,不希望被修改使,可以将表空间设置为只读状态。READ ONLY 表示该表空间为只读状态,READ WRITE 表示该表空间为可读写状态。具体语法格式如下:
SQL> alter tablespace benet read only; <!-- 修改表空间为只读 -->
Tablespace altered.
SQL> alter tablespace benet read write; <!-- 修改表空间为可读写文件 -->
Tablespace altered.
删除表空间。可以通过 DROP 语句来删除表空间,只需要再加上表空间的名称即可。具体语法格式如下:
SQL> drop tablespace benet including contents;
Tablespace dropped.
(2)段
段(Segment)存在于表空间中,是一种指定类型的逻辑存储结构,段由一组区组成。段可分成四类:数据段、索引段、回退段、临时段。例如,对于每个非聚集表有一个数据段,表的所有数据存储再该段;而对于每个索引都有一个索引段。
(3)区
区(Extent)是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区由连续的数据块组成。段主要由一个或者多个区构成,当段创建后,它至少包含一个区。当段中的所有空间都完全使用时,系统将自动为该段分配一个新区。区不能跨数据文件存在,只能存在于一个数据文件中。
(4)数据块
数据块(Data Block)是数据库中最小的数据组织单位于管理单位。Oracle 数据库中的数据存储于数据块中。数据块是 Oracle 服务器所能读取或写入的最小存储单元。Oracle 服务器以数据块为单位管理数据文件的存储空间。数据块的取值范围为 2~64KB,其默认大小与 Oracle 版本有关。
(5)模式
模式(Schema)是数据库对象(又称模式对象)的集合。模式对象包括表、视图、索引、同义词、序列、过程和程序包等。每创建一个用户,Oracle 会自动创建一个与用户名相同的模式,因此,模式又称用户模式。用户登录后,默认访问的是与自己的名称相同的模式中的数据库对象。
4、Oracle 内存结构
内存结构是 Oracle 数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要素。
Oacle 内存存储的主要内容:
- 程序代码;
- 已经连接的会话的相关信息,包括当前所有活动会话和非活动会话;
- 程序运行时必需的相关信息,如查询计划;
- Oracle 进程之间通信和共享的信息,如锁;
按照内存使用方式不同,Oracle 数据库的内存也可以分为 SGA、PGA、和 UGA(User Global Area, 用户全局区)。
- SGA:所有用户都可以访问的实例的共享内存区域。数据块、事务处理日志、数据字典信息等都存储在 SGA 中。
- PGA:一类非共享的内存,专用于特定的服务器进程,并且只能够由这个进程访问。
UGA:为用户进程存储会话状态的内存区域。根据用户数据库时配置为专用服务器模式,还是配置为共享服务器模式,UGA 可以作为 SGA 或 PGA 的一部分。它为用户会话存储数据。接下来重点介绍一下 SGA 和 PGA:
1)SGA
Oracle 实例的 SGA 同来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时,SGA 的内存被自动分配。SAG 是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。SGA 按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和 Java 池等。
①共享池
共享池是对 SQL、PL/SQL 程序进行语法分析、编译、执行时用到的内存区域。共享池由库缓存和数据字典缓存组成。
- 库缓存含有最近执行的 SQL、PL/SQL 语句的分析码和执行计划。
- 数据字典缓存含有从数据字典中得到的表、索引、列定义、权限信息和其他一些数据库对象的定义,如果 Oracle 缓存了这些信息,那么无疑是缩短了查询的响应时间。
②数据缓冲区
数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改数据时,首先要从数据文件中取出数据,存储于数据缓冲区中。修改的数据,插入的数据都被存储于数据缓冲区中,修改完成和其他条件满足时,数据才被写入数据文件中。
Oracle 服务器进程在处理一个查询时,首先查找内存中是否存在所需的数据块。如果在数据缓冲区中没有找到需要的块,服务器进程就从数据文件中读取此块,并保存在缓冲区中。当后续的请求需要读取这些块时,便可以在内存中找到,因此这些请求不需要从磁盘中读取,从而提高了读取速度。数据缓冲区的大小对数据库的读取速度有直接的影响。
③重做日志缓冲区
当用户执行了如 INSERT、UPDATE、DELETE、CREATE、ALTER、DROP 等操作时,数据发生了变化,这些变化了的数据在写入数据缓存之前先要写入重做日志缓冲区,同时变化之前的数据也放入重做日志缓存,这样在数据恢复时 Oracle 就知道哪些资源需要提交,哪些资源需要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较小。
④大池
在 SGA 中,大池是一个可选的缓冲区,管理员可以根据需要对其今进行配置。在大规模输入、输出及备份过程中也需要大池作为缓冲空间,如大数据操作、数据库备份与恢复之类的操作。
⑤Java 池
在 SGA 中,Java 池也是一个可选的缓冲区,但是在安装 Java 或者使用 Java 程序时必须设置 Java 池,用于编译 Java 语言编写的指令。
2)PGA
PGA 不是实例的一部分,它包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA 是在用户进程连接到数据库并创建一个会话时自动分配的,该分区保留了每个与 Oracle 数据库连接的用户进程所需的内存。在一个用户结束会话后,PGA 将被释放。
5、Oracle 进程结构
Oracle 中有几种不同类型的进程:用户进程、服务器进程和后台进程。
用户进程:在数据库用户请求连接 Oracle 服务器时启动;
服务器进程:在用户建立会话并连接 Oracle 实例时启动;
- 后台进程:在 Oracle 实例启动时启动;
-
用户进程是一个需要与 Oracle 服务器进程交互的程序。当数据库用户运行一个应用程序准备向数据库服务器发送请求时,即创建了用户进程。例如:用户启动数据库工具 Sqlplus 时,系统将自动建立一个用户进程。
- 服务器进程用于处理连接到实例的用户进程的请求。当用户建立与数据库的连接时,即产生服务器进程。服务器进程和用户进程通信并为所连接的用户请求服务。服务器进程直接与 Oracle 数据库交互,实现调用和返回结果的目的。服务器进程及可以处理一个用户进程的请求,也可以处理多个用户进程的请求。
在 Oracle 数据库中,为了使系统性能更好地协调多个用户,实例系统中使用的一些附加进程,称为后台进程。这些后台进程存在于操作系统中,在实例启动时自动启动。其中有五个进程是必须要启动的,否则数据库实例无法启动。这五个重要且必需的后台进程为进程监控(Process Monitor,PMON)进程、系统监控(System Monitor,SMON)进程、数据写入(Database Writer,DBWR)进程、日志写入(Log Writer,LGWR)进程、检查点(Check Point,CKPT)进程。
1)PMON 进程
PMON 进程在用户连接意外中断后执行资源清理工作,包括以下任务:
- 释放所有当前挂起的锁;
- 回滚用户当前事务处理;
- 释放用户当前使用的资源;
- 监控服务器进程和其他后台进程,出现故障时重启它们;
2)SMON 进程
SMON 进程执行以下任务:
- 在实例启动时执行实例恢复。实例恢复包括三个步骤:
①前滚以恢复未写入的数据文件但已记入联机日志文件的数据;
②打开数据库,以便用户能登录并访问数据;
③回滚为提交的事务处理;
- 整理数据文件的自由空间;
- 释放不再使用的临时段;
3)DBWR 进程
DBWR 进程执行以下任务:
- 管理数据缓冲区,以便能找到空闲的缓冲区读入数据文件的数据;
- 将所有修改后的缓冲区数据写入数据文件;
- 使用 LRU 算法经最近使用过的块保留在内存中;
- 通过延迟写入优化磁盘 I / O 读写;
4)LGWR 进程
LGWR 进程负责将重做日志缓冲区中的日志数据写入日志文件组。数据库在运行时,如果对数据进行修改,则产生日志信息,日志信息首先产生于重做日志缓冲区中。此缓冲器按照“先进先出”的原则进行操作,当日志信息满足一定条件是,由 LGWR 进程将日志数据写入日志文件。系统通常有多个日志文件,日志写入进程以循环的方式将数据写入文件。
5)CKPT 进程
CKPT 进程是确保数据缓冲区中所有修改过的数据块都写入数据文件的机制。当检查点完成后,CKPT 进程负责更新数据文件头和控制文件、保存检查点信息,以保证数据库日志文件和数据文件同步。在数据库恢复时只需要找到 CKPT 保存的最后一次检查点,就可以根据它确定日志文件中恢复数据的开始位置,然后重新执行其之后的日志记录即可。
6)ARCn 进程
ARCn 进程即归档日志进程,是一个可选进程,只有在打开日志归档时才有该进程。该进程的主要作用是发生日志切换时将写满的联机日志文件复制到归档目录。
二、CDB 与 PDB 的基本操作
和之前版本的 Oracle 不同,Oracle 12c 可以作为单个数据库使用(通过再安装时取消勾选“创建为容器数据库”复选框),也可根据企业需要,提供若干个可插拔 PDB 数据库。每个 PDB 可以由不同的 DBA 维护。下面介绍 CDB 和 PDB 的基本维护。
[oracle@oracle ~]$ source .bash_profile
[oracle@oracle ~]$ sqlplus / as sysdba <!-- 以 sys 用户登录数据库 -->
SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 7 14:58:04 2020
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> startup; <!-- 启动数据库 -->
ORACLE instance started.
Total System Global Area 1660944384 bytes
Fixed Size 8793448 bytes
Variable Size 1056965272 bytes
Database Buffers 587202560 bytes
Redo Buffers 7983104 bytes
Database mounted.
Database opened.
SQL>
SQL> show con_name; <!-- 查看当前所在的容器 -->
CON_NAME
------------------------------
CDB$ROOT <!--CDB$ROOT 代表当前在 CDB 下面 -->
SQL>
SQL> show pdbs; <!-- 查看数据库的所有容器 -->
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB MOUNTED <!-- 状态为 mounted(并没有 open)-->
SQL>
SQL> alter pluggable database orclpdb open;
<!--CDB 下修改可插拔数据库 orclpdb 为打开状态 -->
Pluggable database altered.
SQL>
SQL> alter session set container=orclpdb;
<!--CDB 下切换会话到 PDB(orclpdb)中 -->
Session altered.
SQL>
SQL> show con_name; <!-- 再次查看当前位置已经位于 orclpdb 中 -->
CON_NAME
------------------------------
ORCLPDB
SQL>
从 CDB 切换到 PDB 以及相关的操作如下:
SQL> show con_name; <!-- 查看当前位置 -->
CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL> alter session set container=orclpdb; <!-- 切换会话到 PDB 中 -->
Session altered.
SQL>
SQL> show con_name; <!-- 查询当前容器 -->
CON_NAME
------------------------------
ORCLPDB
SQL>
SQL> shutdown immediate; <!-- 在 PDB 中关闭可插拔数据库 -->
Pluggable Database closed.
SQL>
SQL> startup; <!-- 在 PDB 中打开可插拔数据库 -->
Pluggable Database opened.
SQL>
SQL> alter session set container=cdb$root; <!-- 切换会话到 CDB 中 -->
Session altered.
SQL>
SQL> show con_name; <!-- 再次查看当前的位置 -->
CON_NAME
------------------------------
CDB$ROOT
SQL>
通过上面的操作可以发现,可以在 CDB 中管理 PDB,如 CDB 中通过命令“alter pluggable database orclpdb open”可以将 PDB 数据设置为打开状态。当然也可以在 PDB 中维护,如执行“shutdown immediate”命令和“startup”命令分别关闭和打开 PDB 数据库。在 CDB 和 PDB 中切换也是非常方便的,只需执行“alter session set container=xxx”命令即可。
连接到可插拔数据 PDB 有两种方法,一种是执行命令“sqlplus / as sysdba”进入 CDB,然后通过“alter session set container=xxx”命令切换到 PDB; 另一种方法是执行“sqlplus sys/oracle@orclpdb sa sysdba”命令直接进入 PDB 数据库,其中 orclpdb 是 pdb 容器的名称,而且还要在 /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora 文件中增加以下内容:
[oracle@oracle ~]$ vim /u01/app/oracle/product/12.2.0/dbhome_1/
network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
ORCL =
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
----------------------------------------------------
<!-- 分界线,以上不需要进行 -->
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Oracle)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb)
)
)
三、用户管理
在创建一个新数据库时,Oracle 将创建一些默认数据库用户,比如:SYS、SYSTEM 等用户。SYS 和 SYSTEM 用户都是 Oracle 的管理用户。如果在安装过程中选择安装示例数据库,则会自动创建 HR 用户,HR 用户是 Oracle 数据库的一个示范用户,也可以根据需求导入其他示例数据库。示例数据库里面包含一些测试展示用的示例表。下面简单介绍一下 SYS、SYSTEM 和自定义用户。
1、SYS
SYS 用户是 Oracle 中的一个超级用户,主要用来维护系统信息和管理实例。数据库中所有数据字典和视图都存储在 SYS 模式中。数据字典存储了用来管理数据库对象的所有信息,是 Oracle 数据库中非常重要的系统信息。SYS 用户只能以 SYSOPER 或 SYSDBA 角色登录数据库系统。
2、SYSTEM
SYSTEM 用户是 Oracle 中默认的数据库管理员,它拥有 DBA 权限。该用户模式中存储了 Oracle 管理工具使用的内部表和视图。通常通过 SYSTEM 用户管理 Oracle 数据库的用户、权限和存储等,不建议在 SYSTEM 模式中创建用户表。SYSTEM 用户不能以 SYSOPER 或 SYSDBA 角色登录系统,只能使用以默认方式(数据库身份验证的方式)登录。
3、自定义用户
Oracle 12c 支持创建自定义用户,由于 PDB 的引入,自定义用户范畴和之前版本有所不同。在 CDB 模式下,用户分为两种:公用用户和本地用户。公用用户可以在 CDB 和 PDB 中使用,而本地用户只能在 PDB 中使用。在 CDB 环境中,不允许创建本地用户。Oracle 规定,在 CDB 中创建公用用户时,用户名必须以 c## 开头。
通常情况下,出于安全考虑,对于不同用户的数据表需要不同的访问权限,因此,就需要创建不同的用户。Oracle 中的 CREATE USER 命令用于创建新用户。每个用户都有一个默认空间和一个临时表空间。如果没有指定,Oracle 就将 USERS 设为默认表空间,将 TEMP 设为临时表空间。创建用户的语法如下:
1)以 system 用户的身份登录 orcl 数据库的 CDB,创建用户 tom,密码为 123,默认表空间是 users,临时表空间是 temp,开启表空间限额,下次登录修改密码
SQL> create user c##tom identified by 123 default tablespace users temporary tablespace temp quota unlimited on users password expire;
User created.
2)修改 tom 用户密码为 123456
SQL> alter user c##tom identified by 123456;
User altered.
3)删除不用的账户 tom
SQL> drop user c##tom cascade;
User dropped.
四、数据库权限管理
权限是执行某种类型的 SQL 语句挥着存取其他用户数据库对象的权力。在 Oracle 中,权限分为系统权限和对象权限两类。
1、系统权限
系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权限。例如,在数据库中创建表空间的权力,或者在数据库中创建表的权力,都属于系统权限。系统权限示例如下图:
常见的系统权限如下:
- CREATE SESSION:连接到数据库;
- CREATE TABLE:创建表;
- CREATE VIEW:创建视图;
- CREATE SEQUENCE:创建序列;
一个新用户创建后,首选要授予其 CREATE SESSION 权限,使其可以登录到数据库。
2、对象权限
对象权限是指针对某个特定的模式对象执行操作的权力。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等。如下图所示:
Oracle 数据库用户有两种获取权限的途径:①直接向用户授予权限;②将权限授予角色,再将角色授予一个或多个用户。使用角色能够更加方便和高效地对权限进行管理。所以数据库管理员通过使用角色向用户授予权限,而不是直接向用户授予权限。在 Oracle 数据库系统中预定义了很多角色,其中最常用的主要有 CONNECT 角色、RESOURCE 角色、DBA 角色等。
Oracle 中常用的系统预定义角色如下:
CONNECT:拥有连接数据库的权限;
RESOURCE:拥有创建表、触发器、过程等权限;
- DBA:数据库管理员角色,拥有管理数据库的最高权限;一个具有 DBA 角色的用户可以授权任何其他用户甚至其他 DBA 权限,这是很危险的,因此不要轻易授予该角色;
新创建的用户必须授予一定的权限才能进行相关数据库的操作。授权通过 CRANT 语句,取消授权则通过 REVOKE 语句。
1)创建 bob 账户,授权和撤销授权基本操作语法示例
SQL> alter session set container=orclpdb; <!-- 切换到 orclpdb 数据库 -->
Session altered.
SQL> create user bob identified by 123456; <!-- 创建账户 bob-->
User created.
SQL> grant connect,resource to bob;
<!-- 授权 bob 用户拥有连接数据库和创建表、触发器、过程等权限 -->
Grant succeeded.
SQL> revoke connect,resource from bob; <!-- 撤销授权 -->
Revoke succeeded.
数据库用户安全设计原则如下:
- 数据库用户去哪先按照最小分配原则;
- 数据库用户可分为管理、应用、维护、备份四类用户;
- 不允许使用 sys 和 system 用户建立数据库应用对象;
- 禁止对普通用户授予 dba 权限;
- 对查询用户只能开放查询权限;
- 对新建用户初次登录数据库时强制修改密码;
一般程序开发人员只要授予 CONNECT 和 RESOURCE 两个角色即可。特别注意,授予这两个角色就包含了授予用户无限制使用默认表空间的权限。
: