博文结构
Oracle数据库体系结构
Oracle物理结构
Oracle逻辑结构
Oracle内存结构
Oracle进程结构
创建用户并授权

一.oracle体系结构概述

  • Orcale体系结构

Oracle体系结构包含一系列组件。 如图显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件 和归档日志文件等.
从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的
两个概念, DBA -个很重要的工作就是维护实例和数据库本身的正常工作。

Oracle体系结构和用户管理_第1张图片

  • 1.实例
    Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle 实
    例启动时,将分配- -个系统全局区(SGA) 并启动一系列Oracle后台进程。Oracle 实例有两种类型:
    单进程实例和多进程实例。单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下
    的Oracle实例仅允许- -个用户可存取。多进程Oracle实例(又称多用户Oracle)使用多个进程来执行
    Oracle的不同部分,对于每个连接的用户都有一个进程。

  • 2.数据库

数据库是数据的集合,物理上是指存储数据库信息的一组操作系统文件,每个数据库有-个逻
辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件.主要由三种类型文件组成:
数据文件、控制文件和重做日志文件。数据库的逻辑结构是指数据库数据的逻辑存储结构(如表空
间、段等)和模式对象(如表、 视图等)。

  • 3.可插拔数据库

从Oracle 12c 版本开始. Oracle 引入了可插拔数据库的概念,可插拔是为云计算而生。可插拔的结构由-个容器数据库(Container Database, CDB) 和若干个可组装数据库(Pluggable Database,
PDB) 组成,每个PDB对外可充当一个独立的数据库供应用程序使用,它可以包含自己的数据文件,但是所有的PDB共享CDB的控制文件以及日志文件。所谓的可插拔.意味着PDB可以像USB一样随
时插入CDB中,不用了也可以随时拔下来

  • Oracle服务器
    Oracle服务器也是非常重要的概念,它主要由实例和数据库文件组成,也就是我们常说的数据库管理系统(Database Management System ,DBMS)。Oracle 服务器的组成如图。

Oracle体系结构和用户管理_第2张图片

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

Oracle体系结构和用户管理_第3张图片

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

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

主要文件

数据文件
日志文件
控制文件
  • 2.逻辑结构
    数据库的逻辑结构是从逻辑的角度分析数据库的组成的。Oracle 数据库的逻辑结构包括表空间、段.区.块和模式等,
    如图所示。

Oracle体系结构和用户管理_第4张图片

(1)表空间

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

分为三类:
1.永久性表空间
2.临时性表空间
3.撤销表空间

  • 分别介绍SYSTEM表空间、SYSAUX表空间、USERS表空间和TEMP表空间。
(1) SYSTEM表空间:用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议将用户创建的表、索引等对象存放到SYSTEM表空间中。

(2) SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具(如企业管理器.StatsPack. LogMiner 等)用到的数据:还用于存放各模式的对象数据.如智能代理用户DBSNMP等,这些模式在数据库安装完成后就建立了相应的对象并都存放在SYSAUX表空间中。

(3) USERS 表空间:通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如表,索引等。

(4) TEVP表空间: Oracle 系统用于存放临时数据的特殊表空间。例如.当操作中需要进行排序时,Oracle 系统就将排序的数据临时存放在该表空间内。排序处理完成后即可释放排序数据所占用
的空间,因此称之为临时表空间。
  • Oracle内存结构
    内存结构是Oracle数据库体系中最为重要的一部分,内存也是影响数据库性能的第一要 素Oracle内存存储的主要内容如下:

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

按照内存使用方法的不同, Oracle数据库的内存又可以分为SGA. PGA和UGA (User Global Area,
用户全局区)。

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

  • 1.SGA
    Oracle实例的SGA用来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时, SGA的内存被自动分配。SGA 是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。SGA按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和Java池等。
  • (1)共享池

共享池是对SQL. PL/SQL 程序进行语法分析.编译、执行时用到的内存区域。共享池由库缓存和数据字典缓存组成。

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

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

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

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

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

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

  • Oracle进程结构
    Oracle中有几种不同类型的进程:用户进程、服务器进程、后台进程。
用户进程:在数据库用户请求连接Oracle 服务器时启动,
服务器进程:在用户建立会话并连接Oracle 实例时启动,
后台进程:在Oracle实例启动时启动。
  • 1.PMON进程

PMON进程在用户连接意外中断后执行资源清理工作,包括下列任务:
➢释放所有当前挂起的锁。
➢回滚用户当前事务处理。
➢释放用户当前使用的资源。
➢监控服务器进程和其他后台进程,出现故障时重启它们。

  • 2.SMON进程

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

整理数据文件的自由空间。
释放不再使用的临时段。

  • 3.DBWR
    管理数据缓冲区,以便能找到空闲的缓冲区读入数据文件的数据。
    将所有修改后的缓冲区数据写入数据文件。
    使用LRU (Least Recently Used,最近最少使用)算法将最近使用过的块保留在内存中。通过延迟写来优化磁盘l/0读写。

  • 4.LGWR
    LGWR进程负责将重做日志缓冲区中的日志数据写入日志文件组。数据库在运行时,如果对数据进行修改,则产生日志信息,日志信息首先产生于重做日志缓冲区中。此缓冲区按照“先进 先出”的原则进行操作,当日志信息满足一定条件时,由LGWR进程将日志数据写入日志文件。系统通常有多个日志文件,日志写入进程以循环的方式将数据写入文件。

  • 5.CKPT
    CKPT进程是确保数据缓冲区中所有修改过的数据块都写入数据文件的机制。当检查点完成后,CKPT进程负责更新数据文件头和控制文件,保存检查点信息,以保证数据库日志文件和数据文件同步。在数据库恢复时只需要找到CKPT保存的最后一次检查点, 就可以根据它确定在日志文件中恢复数据的开始位置,然后重新执行其之后的日志记录即可。

  • 6.ARCn
    ARCn进程即归档日志进程,是一个可选进程,只有在打开日志归档时才有该进程。该进程的主要作用是发生日志切换时将写满的联机日志文件复制到归档目录。

二.用户管理

在创建一个新数据库时,Oracle 将创建一些默认数据库用户, 如SYS. SYSTEM 等用户。SYS和SYSTEM用户都是Oracle的管理用户。如果在安装过程中选择安装示例数据库,则会自动创建HR用.
户, HR用户是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模式下,用户分为两种.分别是公用用户(Common User) 和本地用户(Local User) ,公用用户
    可以在CDB及PDB中使用,而本地用户只能存在于PDB中。在CDB环境中,不允许创建本地用户。Oracle规定,在CDB中创建公用用户时,用户名必须以c##开头

  • 数据库权限管理
    权限是执行某种类型的SQL语句或者存取其他用户数据库对象的权力。在Oracle中,权限分为系统权限对象权限两类。

  • 1.系统权限
    系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权力。
    Oracle体系结构和用户管理_第5张图片

  • 常见的系统权限如下。

➢CREATE SESSION:连接到数据库。
➢CREATE TABLE: 创建表.
➢CREATE VIEW:创建视图。
➢CREATE SEQUENCE: 创建序列。

  • 2.对象权限
    对象权限是指针对某个特定的模式对象执行操作的权力。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等,

Oracle体系结构和用户管理_第6张图片

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

CONNECT: 拥有连接数据库的权限,

RESOURCE: 拥有创建表、触发器、过程等权限。

DBA. 数据库管理员角色,拥有管理数据库的最高权限。-个具有DBA角色的用户可以授权任何其他用户甚至其他DBA权限,这是很危险的,因此不要轻易授予该角色。新创建的用户必须授予- -定的权限才能进行相关数据库操作。授权通过GRANT语句,取消授权则通过REVOKE语句

三.案例

1.解决sqlplus方向键问题(可以上下左右按键)

[root@oracle /]# yum -y install ncurses* readline*
[root@oracle /]# cd /media/
[root@oracle media]# ls
rlwrap-0.30.tar.gz  sqlplus方向键问题.txt
[root@oracle media]# tar zxf rlwrap-0.30.tar.gz -C /usr/src/
[root@oracle media]# cd /usr/src/
[root@oracle src]# ls
debug  kernels  rlwrap-0.30
[root@oracle src]# cd rlwrap-0.30/
[root@oracle rlwrap-0.30]# ./configure && make && make install
[root@oracle rlwrap-0.30]# vim /home/oracle/.bash_profile
alias sqlplus='rlwrap sqlplus'
  • 创建一个自动增长表空间qq
[oracle@oracle ~]$ su - oracle
[oracle@oracle ~]$ sqlplus / as sysdba
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 1593835520 bytes
Fixed Size          8793256 bytes
Variable Size        1023411032 bytes
Database Buffers      553648128 bytes
Redo Buffers            7983104 bytes
数据库装载完毕。
数据库已经打开。
SQL> create tablespace qq
  2  datafile '/u01/app/oracle/oradata/qq01.dbf'
  3  size 10M autoextend on;

表空间已创建。
  • 更改数据文件大小
SQL> alter database datafile
  2  '/u01/app/oracle/oradata/qq01.dbf'
  3  resize 80M;

数据库已更改。
  • 向表空间添加数据文件
SQL> alter tablespace qq
  2  add datafile '/u01/app/oracle/oradata/orcl/qq02.dbf'
  3  size 20M autoextend on;

表空间已更改。
  • 删除表空间
SQL> drop tablespace qq including contents;

表空间已删除。
  • 查看系统中有杜鳌少个数据文件
SQL> select FILE_NAME from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
  • 查看表空间
SQL> select name from v$tablespace;

NAME
--------------------------------------------------------------------------------
SYSAUX
SYSTEM
UNDOTBS1
USERS
TEMP
  • 二.CDB与PDB的基本操作

1.先启动数据库

2.查询数据库的所有容器

SQL> show con_name

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

3.查询当前所在的容器

SQL> show pdbs;

    CON_ID CON_NAME           OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
     2 PDB$SEED           READ ONLY  NO
     3 ORCLPDB            MOUNTED

4.CDB下修改可插拔库orclpdb为打开状态

SQL> alter pluggable database orclpdb open;

插接式数据库已变更。

5.在CDB下切换会话到PDB中

SQL> alter session set container=orclpdb;

会话已更改。

SQL> show con_name

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

6.在PDB中关闭与开启可插拔数据库

SQL> shutdown immediate
插接式数据库已关闭。
SQL> startup
插接式数据库已打开。

7.切换会话到CDB中

SQL> alter session set container=cdb$root;

会话已更改。

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
  • 三.用户管理

1.先创建表空间

SQL> create tablespace yy
  2  datafile '/u01/app/oracle/oradata/orcl/yy01.dbf'
  3  size 10M autoextend on;

表空间已创建。

2.在数据库的CDB模式下,创建C##zhangsan的用户

SQL> create user c##zhangsan    \\用户名
  2  identified by pwd123                 \\密码
  3  default tablespace yy                 \\默认表空间
  4  temporary tablespace temp     
  5  quota unlimited on yy
  6  password expire;       \\第一次登陆需要修改密码

用户已创建。
  • 授予c##zhangsan用户的connect和resource俩角色
SQL> grant connect,resource to c##zhangsan;

授权成功。
  • 验证权限
SQL> conn c##zhangsan/pwd123
ERROR:
ORA-28001: 口令已经失效

更改 c##zhangsan 的口令
新口令:******
重新键入新口令:******
口令已更改
已连接。
SQL> create table benet(id int,name varchar(10))
  2  ;

表已创建。
SQL> insert into benet values (1,'tom');

已创建 1 行。

SQL> select * from benet;

    ID NAME
---------- ------------------------------
     1 tom
  • 用sys用户登陆,撤销c##zhangsan的权限

SQL> revoke connect,resource from c##zhangsan

  • 删除c##zhangsan用户

SQL> drop user c##zhangsan cascade;

  • 导入测试数据
    在Oracle 12c以前的版本中,安装完成之后默认会scott用户,该用户模式下存放了用于测试的表,而Oracle 12c安装完成之后默认没有scott用户。为了以后测试方便,下面介绍如何在Oracle 12c中导入测试数据的方法。

下载test.sql脚本,然后执行以下操作:

[oracle@oracle ~]$ ll                       //准备脚本测试文件
总用量 8
-rw-r--r-- 1 oracle oinstall 7658 6月  15 2017 test.sql
[oracle@oracle ~]$ sqlplus / as sysdba                       

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

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

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

SQL> create user c##scott identified by scott default tablespace users temporary tablespace temp quota unlimited on users;
//创建用户c##scott

用户已创建。

SQL> grant connect,resource to c##scott;                  //用户授权

授权成功。

SQL> @test.sql                      //导入脚本文件,不带路径表示当前目录下
…………………………             //创建过程省略
SQL> conn c##scott/scott;                         //切换用户c##scott
已连接。 
SQL> show user;                               //查看当前用户
USER 为 "C##SCOTT"
SQL> col tname for a10;              //格式化输出,让一行中显示所有的列,调整tname列的宽度为10
SQL> select * from tab;                     //查询当前用户下的所有的表

TNAME      TABTYPE        CLUSTERID
---------- --------------------- ----------
BONUS      TABLE
DEPT       TABLE
EMP    TABLE
SALGRADE   TABLE
SQL> desc emp;                            //查询emp表的结构
 名称                                    是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 EMPNO                     NOT NULL NUMBER(4)
 ENAME                          VARCHAR2(10)
 JOB                            VARCHAR2(9)
 MGR                            NUMBER(4)
 HIREDATE                       DATE
 SAL                            NUMBER(7,2)
 COMM                           NUMBER(7,2)
 DEPTNO                         NUMBER(2)
SQL> col empno for 9999;              //格式化输出,empno列为数字,9999代表宽度为4
 SQL> select * from emp;                        //根据实际情况,自行修改,怎么好看怎么来

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7369 SMITH CLERK       7902 17-12月-80        800                    20
 7499 ALLEN SALES       7698 20-2月 -81       1600        300         30
        MAN

 7521 WARD  SALES       7698 22-2月 -81       1250        500         30
        MAN

 7566 JONES MANAG       7839 02-4月 -81       2975                    20
        ER

 7654 MARTI SALES       7698 28-9月 -81       1250       1400         30

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
      N     MAN

 7698 BLAKE MANAG       7839 01-5月 -81       2850                    30
        ER

 7782 CLARK MANAG       7839 09-6月 -81       2450                    10
        ER

 7788 SCOTT ANALY       7566 19-4月 -87       3000                    20
        ST

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7839 KING  PRESI            17-11月-81       5000                    10
        DENT

 7844 TURNE SALES       7698 08-9月 -81       1500          0         30
      R     MAN

 7876 ADAMS CLERK       7788 23-5月 -87       1100                    20
 7900 JAMES CLERK       7698 03-12月-81        950                    30
 7902 FORD  ANALY       7566 03-12月-81       3000                    20
        ST

EMPNO ENAME JOB      MGR HIREDATE          SAL   COMM     DEPTNO
----- ----- ----- ---------- ---------- ---------- ---------- ----------
 7934 MILLE CLERK       7782 23-1月 -82       1300                    10
      R

已选择 14 行。
SQL> select * from c##scott.emp;                   //如果使用的是非c##scott用户,需要指定用户.表名