通过博文部署Oracle 12c企业版数据库已经可以部署Oracle数据库了,本篇博文主要介绍Oracle的体系结构,包括存储结构、内存结构和进程结构进行初步了解。对进一步学习Oracle数据库有很大的帮助。

博文大纲:
一、Oracle体系结构
1.Oracle体系结构概述
2.Oracle服务器
3.Oracle存储结构
4.Oracle内存结构
5.Oracle进程结构
二、CDB与PDB的基本操作
三、用户管理
四、数据库权限管理
五、导入测试数据

一、Oracle体系结构

数据库的体系结构是指数据库的组成、工作过程、以及数据库中数据的组织与管理机制,要了解Oracle数据库的体系结构,必须理解Oracle系统的主要组件和重要概念。

1.Oracle体系结构概述

Oracle体系结构包含一系列组件,如图:
Oracle体系结构和用户管理
图中显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。

从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的两个概念。

作为一个DBA管理者,维护实例和数据库本身的正常运行是最基本的技能。

(1)实例

Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle实例启动时,将分配一个系统全局区(SGA)并启动一系列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之前的版本中,实例和数据库只能是一对一或多对一的关系,即只能是一个实例对应一个数据库,或者多个实例对应一个数据库。单子啊Oracle 12c版本中,通过引入CDB和PDB,一个实例可以对应多个可插拔数据库。

可插拔数据库的使用场景:
(1)企业中有多个应用均需要使用Oracle数据库,他们仅使用非常少量的硬件资源,但是又不得不为他们创建多个实例;
(2)一些不是特别重要的数据库,打包需要DBA花费大量的精力去维护;
(3)为了更好的利用硬件资源以及减少管理开销,有必要将大量的部门级应用整合到少数几个Oracle关系型数据库中,以便部署和管理;

通过一个集中化的平台部署多个数据库,同时又共享一个数据库实例,可以大大降低成本,即更少的实例损耗和耕地的存储技术。

如果在生产环境中只需要一个数据库,并不想使用可插拔数据库,可以在安装过程中取消勾选“创建为容器数据库”复选框,从而将安装一个普通数据库。

2.Oracle服务器

Oracle服务器也是非常重要的概念,它主要由实力和数据库文件组成,也就是常说的数据库管理系统(DBMS)。
Oracle服务器的组成如图:
Oracle体系结构和用户管理
Oracle服务器除了维护实例和数据库文件外,还在用户建立与服务器的连接时启动服务器进程并分配PGA。

3.Oracle存储结构

Oracle的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系。如图:
Oracle体系结构和用户管理

  • 物理结构主要描述Oracle数据库的外部存储结构,即在操作系统中如何组织、管理数据;
  • 逻辑结构主要描述Oracle数据库的内部存储结构,即从逻辑概念上描述在Oracle数据库中如何组织、管理数据;

(1)Oracle物理结构

物理结构是Oracle数据库创建后使用的操作系统物理文件,Oracle数据库的物理文件分为以下两类:

1)主要文件

(1)数据文件:数据文件的扩展名通常是.dbf,是物理存储Oracle数据库数据的文件。

数据文件的特点:

  • 每个数据文件只与一个数据库相联系;
  • 一个表空间可包含一个或多个数据文件;
  • 一个数据文件只能属于一个表空间;

(2)重做日志文件:重做日志文件的扩展名是.log,它记录了对数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库。

在Oracle数据库中,重做日志文件是成组使用的,每个重做日志文件组可以有一个多多个重做日志文件。在工作过程中,多个重做日志文件组之间循环使用,当一个重做日志文件组写满后,会转向下一个日志文件组。重做日志文件用于记录数据库变化,是用户的事务处理日志。

(3)控制文件:控制文件的扩展名是.ctl,是一个二进制文件。控制文件中存储的信息很多,其中包括数据文件和重做日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当Oracle读写数据时,要根据控制文件 的信息查找数据文件。

由于控制文件的重要性,一个数据库至少要有两份控制文件。Oracle 12c默认包含两个控制文件,各个控制文件内容相同,从而可以避免因为一个控制文件的损坏而导致无法启动数据库的情况发生。

控制文件中记录了以下信息:

  • 数据文件的位置及大小;
  • 重做日志文件的位置及大小;
  • 数据库名称及创建时间;
  • 日志序列号;

2)其他文件

其他文件有参数文件、归档日志文件、口令文件等。

(2)逻辑结构

数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle数据库的逻辑结构包括表空间、段、区、块和模式等。如图:
Oracle体系结构和用户管理

1)表空间

每个Oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以由多个数据文件,但一个数据文件只能属于一个表空间。与数据文件这种物理结构不同,表空间属于数据库的逻辑结构。

在每个数据库中,都有一个名为“SYSTEM”的表空间,即系统表空间,还会有SYSAUX、UNDO、USERS等表空间,这些都是在创建数据库时自动创建的。管理员可以创建自定义的表空间并分配给指定用户,也可以为表空间增加和删除数据文件。

表空间基本有以下三类:
(1)永久性表空间:一般保持基表、试图、过程和索引等的数据。SYSTEM、SYSAUX、USERS表空间是默认安装的;
(2)临时性表空间:只用于保存系统中短期活动的数据,如排序数据等;
(3)撤销表空间:用来帮助回退未提交的事务数据,已提交的数据在这里是不可以恢复的;

一般不需要创建临时性表空间和撤销表空间,除非要把他们转移到其他磁盘中以提高性能。

表空间的目的如下:

  • 对不同用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和对模式对象的管理;
  • 可以将不同数据文件创建不同的磁盘中,有利于管理磁盘空间、提高I/O性能、备份和恢复数据等;

一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统自动啊尽力SYSTEM、SYSAUX、USRS等多个表空间。

下面详细介绍一下这几种表空间:

  • SYSTEM表空间:用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表,索引等对象存放到SYSTEM表空间中;
  • SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具用户的数据;还用于存放各种模式的对象数据,如智能代理用户DBSNMP等,这些模式在数据库安装完成后就建立了相应的对象并都存放在SYSAUX表空间中;
  • USERS表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表、索引等;
  • TEMP表空间:Oracle系统用于存放临时数据的特殊表空间。比如:当操作中需要进行排序时,Oracle系统就将排序的数据临时存放在该表空间内。排序处理完成后即可释放排序数据所占用的空间,因此成为临时表空间;

除了Oracle系统默认创建的表空间外,用户可根据应用系统的模式及其所要存储的对象类型创建多个表空间,以区分用户数据和系统数据。

创建表空间数据数据定义语言,语法如下:
Oracle体系结构和用户管理
语法中:

  • tablespacename:表空间名称;
  • DATAFILE:指定组成表空间的一个或多个数据文件,当有多个数据文件时使用逗号进行分隔;
  • filename:表空间中数据文件的路径和名称;
  • SIZE:指定文件的大小,单位可以是K,也可以是M;
  • AUTOEXTEND:用来启动或禁用数据文件的自动扩展。若设置为ON时,则表示空间用尽会自动扩展;若设置为OFF时,很容易出现表空间剩余容量为0,造成数据不能存储到数据库中的情况出现。

4.Oracle内存结构

内存结构是Oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要素。

Oacle内存存储的主要内容:

  • 程序代码;
  • 已经连接的会话的相关信息,包括当前所有活动会话和非活动会话;
  • 程序运行时必需的相关信息,如查询计划;
  • Oracle进程之间通信和共享的信息,如锁;

照内存使用方式不同,Oracle数据库的内存也可以分为以下几种:

  • SGA:所有用户都可以访问的实例的共享内存区域。数据块、事务处理日志、数据字典信息等都存储在SGA中;
  • PGA:一类非共享的内存,专用于特定的服务器进程,并且只能够由这个进程访问;
  • UGA:为用户进程存储会话状态的内存区域。根据用户数据库时配置为专用服务器模式,还是配置为共享服务器模式,UGA可以作为SGA或PGA的一部分。它为用户会话存储数据。

重点介绍一下SGA和PGA:

(1)SGA

Oracle实例的SGA同来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时,SGA的内存被自动分配。SAG是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。

SGA按其作用不同,可以分为以下几个部分:

1)共享池

共享池是对SQL、PL/SQL程序进行语法分析、编译、执行时用到的内存区域。

共享池由库缓存和数据字典缓存组成:

  • 库缓存含有最近执行的SQL、PL/SQL语句的分析码和执行计划;
  • 数据字典缓存含有从数据字典中得到的表、索引、列定义、权限信息和其他一些数据库对象的定义,如果Oracle缓存了这些信息,那么无疑是缩短了查询的响应时间;

2)数据缓冲区

数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改数据时,首先要从数据文件中取出数据,存储于数据缓冲区中。修改的数据,插入的数据都被存储于数据缓冲区中,修改完成和其他条件满足时,数据才被写入数据文件中。

Oracle服务器进程在处理一个查询时,首先查找内存中是否存在所需的数据块。如果在数据缓冲区中没有找到需要的块,服务器进程就从数据文件中读取此块,并保存在缓冲区中。当后续的请求需要读取这些块时,便可以在内存中找到,因此这些请求不需要从磁盘中读取,从而提高了读取速度。数据缓冲区的大小对数据库的读取速度有直接的影响。

3)重做日志缓冲区

当用户执行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操作时,数据发生了变化,这些变化了的数据在写入数据缓存之前先要写入重做日志缓冲区,同时变化之前的数据也放入重做日志缓存,这样在数据恢复时Oracle就知道哪些资源需要提交,哪些资源需要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较小。

4)大池

在SGA中,大池是一个可选的缓冲区,管理员可以根据需要对其今进行配置。在大规模输入、输出及备份过程中也需要大池作为缓冲空间,如大数据操作、数据库备份与恢复之类的操作。

5)Java池

在SGA中,Java池也是一个可选的缓冲区,但是在安装Java或者使用Java程序时必须设置Java池,用于编译Java语言编写的指令。

(2)PGA

PGA不是实例的一部分,它包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA是在用户进程连接到数据库并创建一个会话时自动分配的,该分区保留了每个与Oracle数据库连接的用户进程所需的内存。在一个用户结束会话后,PGA将被释放。

5.Oracle进程结构

Oracle中有几种不同类型的进程:

  • 用户进程:在数据库用户请求连接Oracle服务器时启动;
  • 服务器进程:在用户建立会话并连接Oracle实例时启动;
  • 后台进程:在Oracle实例启动时启动;

用户进程是一个需要与Oracle服务器进程交互的程序。当数据库用户运行一个应用程序准备向数据库服务器发送请求时,即创建了用户进程。例如:用户启动数据库工具Sqlplus时,系统将自动建立一个用户进程。

服务器进程用于处理连接到实例的用户进程的请求。当用户建立与数据库的连接时,即产生服务器进程。服务器进程和用户进程通信并为所连接的用户请求服务。服务器进程直接与Oracle数据库交互,实现调用和返回结果的目的。服务器进程及可以处理一个用户进程的请求,也可以处理多个用户进程的请求。

在Oracle数据库中,为了使系统性能更好地协调多个用户,实例系统中使用的一些附加进程,称为后台进程。这些后台进程存在于操作系统中,在实例启动时自动启动。其中有五个进程是必须要启动的,否则数据库实例无法启动。这五个进程分别是:

(1)PMON(进程监控)进程

PMON进程在用户连接意外中断后执行资源清理工作,包括以下任务:

  • 释放所有当前挂起的锁;
  • 回滚用户当前事务处理;
  • 释放用户当前使用的资源;
  • 监控服务器进程和其他后台进程,出现故障时重启它们;

(2)SMON(系统监控)进程

SMON进程执行以下任务:

  • 在实例启动时执行实例恢复。实例恢复包括三个步骤:
    (1)前滚以恢复未写入的数据文件但已记入联机日志文件的数据;
    (2)打开数据库,以便用户能登录并访问数据;
    (3)回滚为提交的事务处理;
  • 整理数据文件的自由空间;
  • 释放不再使用的临时段;

(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 ~]$ sqlplus sys as sysdba                          //以sys用户登录数据库

SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:26:41 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

输入口令: ******
已连接到空闲例程。

SQL> startup;                                    //启动数据库
ORACLE 例程已经启动。

Total System Global Area 2466250752 bytes
Fixed Size          8795760 bytes
Variable Size         671091088 bytes
Database Buffers     1778384896 bytes
Redo Buffers            7979008 bytes
数据库装载完毕。
数据库已经打开。
SQL> show  con_name;                   //查询当前所在的容器

CON_NAME
------------------------------
CDB$ROOT                                      //表示当前在CDB下
SQL> show pdbs;                             //查询数据库中的所有容器  

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED           READ ONLY  NO                  //创建PDB数据库模板                
     3 ORCLPDB            MOUNTED                           //状态为mounted(并没有open)
SQL> alter pluggable database orclpdb open;             //CDB下将可插拔数据库orclpdb打开
//如果没有将PDB打开就已经切换到PDB中,可以使用“shutdown immediate”关闭PDB数据库、“startup”启动PDB数据库
插接式数据库已变更。

SQL> alter session set container=orclpdb;         //CDB下切换会话到PDB中

会话已更改。

SQL> show con_name;                             //再次查看当前位置已经位于orclpdb中

CON_NAME
------------------------------
ORCLPDB
SQL> alter session set container=cdb$root;                        //回到CDB数据库

会话已更改。

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

以上是从CDB切换到PDB中,反之,一样。

连接到可插拔数据库PDB有两种方法:

  • 第一种方法就是首选登录到CDB数据库,再切换到PDB数据库;
  • 第二种方法就是登录时直接登录到PDB数据库;

第二种是实现方法如下:

[oracle@oracle ~]$ vim /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/tnsnames.ora 
LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
----------------------------------------------------                  //分界线,以上不需要进行修改
lzj =                                                                          //根据上面的模板,进行编写,这个名字可以自定义
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb)                                       //这里需要指定PDB数据库名称
    )
  )
[oracle@oracle ~]$ sqlplus sys@lzj as sysdba                       //登录数据库时需指定刚才定义的名称

SQL*Plus: Release 12.2.0.1.0 Production on 星期六 11月 30 15:48:50 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

输入口令: ******

连接到: 
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> show con_name;                                    //查看进行验证

CON_NAME
------------------------------
ORCLPDB

三、用户管理

在创建一个新数据库时,Oracle将创建一些默认数据库用户,比如:SYS、SYSTEM等用户。

简单介绍一下Oracle数据库的用户:

(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设为临时表空间。

创建用户的语法如下:
Oracle体系结构和用户管理
在语法中:
Oracle体系结构和用户管理

SQL> create user c##lzj
  2  identified by 123456;                            //创建用户

用户已创建。

SQL> alter user c##lzj identified by 654321;     //修改用户密码

用户已更改。

SQL> drop user c##lzj cascade;                 //删除用户

用户已删除。
//删除用户时,不带 cascade则表示只删除用户,带上 cascade则表示删除用户即用户模式对象

四、数据库权限管理

权限是执行某种类型的SQL语句挥着存取其他用户数据库对象的权利。在Oracle中,权限分为系统权限和对象权限两类。

1.系统权限

系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权限。如图:
Oracle体系结构和用户管理
常见的系统权限如下:

  • CREATE SESSION:连接到数据库;
  • CREATE TABLE:创建表;
  • CREATE VIEW:创建视图;
  • CREATE SEQUENCE:创建序列;

一个新用户创建完成后,首选要授予其CREATE SESSION权限,使其可以登录到数据库。

2.对象权限

对象权限是指针对某个特定的模式对象执行操作的权力。如图:
Oracle体系结构和用户管理
Oracle数据库用户有两种获取权限的途径:①直接向用户授予权限;②将权限授予角色,再将角色授予一个或多个用户。使用角色能够更加方便和高效地对权限进行管理。所以数据库管理员通过使用角色向用户授予权限,而不是直接向用户授予权限。在Oracle数据库系统中预定义了很多角色,其中最常用的主要有CONNECT角色、RESOURCE角色、DBA角色等。

Oracle中常用的系统预定义角色如下:

  • CONNECT:拥有连接数据库的权限;
  • RESOURCE:拥有创建表、触发器、过程等权限;
  • DBA:数据库管理员角色,拥有管理数据库的最高权限;

新创建的用户必须授予一定的权限才可对数据库进行相关的操作。

SQL> grant connect,resource to c##lzj;

授权成功。

SQL> revoke connect,resource from c##lzj;

撤销成功。

数据库用户安全设计原则如下:

  • 数据库用户去哪先按照最小分配原则;
  • 数据库用户可分为管理、应用、维护、备份四类用户;
  • 不允许使用sys和system用户建立数据库应用对象;
  • 禁止对普通用户授予dba权限;
  • 对查询用户只能开放查询权限;
  • 对新建用户初次登录数据库时强制修改密码;

一般程序开发人员只要授予 connect和resource两个角色即可。注意:授予这两个角色就包含了授予用户无限制使用默认表空间的权限。

在PDB模式下创建用户lzj,并对其授权,具体操作