本篇博客将对Oracle的体系结构、存储结构、内存结构和进程结构进行初步介绍,从而从宏观上把握它的物理组成、文件组成和各种进程,对于进一步的了解可以起到很好地作用


一、Oralce体系结构

1、概述

    Oracle的体系结构是数据库的组成,工作过程,以及数据库中数据的组织与管理机制,要了解oracle数据库的体系结构,就必须要理解oracle的主要组件和重要的概念。Oracle体系结构包含一系列组件,包括实例、用户进程、服务进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。如下图所示:

杨书凡00.png


实例和数据库是oracle数据库体系结构的核心组成部分,也是最重要的两个概念,dba的主要工作就是维护实例和数据库。

1)实例

实例是后台进程和内存的集合,必须启动实例才能访问数据库中的数据。

杨书凡01.png 


Oracle启动时,将分配一个系统全局区(SGA),并启动一系列oracle后台进程

一个实例只能打开并使用一个数据库

Oracle分为单进程实例和多进程实例,现在普遍都是多进程实例,多进程就是多用户,不同用户使用不同进程来执行oracle的不同部分。

 

2)数据库

数据库是一个数据的集合,该集合被视为一个逻辑单元。

Oracle 数据库由操作系统文件组成,这些文件为数据库信息提供实际物理存储区

Oracle 数据库包括逻辑结构和物理结构。

物理结构:是指存储数据库信息的一组操作系统文件,每个数据库有一个逻辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件,主要由3种类型文件组成:数据文件,控制文件和重做日志文件。

逻辑结构:是指数据库数据的逻辑存储结构,包括:表空间,数据段,表,视图等。

 

二、oracle存储结构

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

杨书凡02.png

1、物理结构:

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

1)主要文件

数据文件:数据文件是物理存储数据库的文件,数据文件的特点:每个数据文件只与一个数据库相联系,一个表空间可以包含一个或多个数据文件,一个数据文件只能属于一个表空间。数据文件包含数据库的用户或应用程序数据,以及元数据和数据字典。

 

重做日志文件:它记录了对数据的所有更改信息,并提供一种数据恢复机制,如果数据库服务器发生崩溃,但未丢失任何数据文件,那么实例便可使用这些文件中的信息恢复数据库。

 

控制文件:当数据库读取时,要根据控制文件的信息查找数据文件。控制文件存储了数据文件和重做日志文件的名称和位置。一个数据库至少有两份控制文件,oracle11g默认包括3个控制文件,各个控制文件内容相同,可以避免因为一个控制文件的损坏导致无法启动数据库。控制文件记录了以下关键信息:数据文件的位置和大小、重做日志文件的位置及大小、数据库名称及创建时间、日志序列号。控制文件对数据库至关重要。没有这些文件,就无法打开数据文件以访问数据库中的数据。

 

 

2)其他文件

参数文件:用于定义实例启动时的配置

口令文件:允许sysdba、sysoper 和sysasm 远程连接到实例并执行管理任务

归档日志文件:使用这些文件和数据库备份,可以恢复丢失的数据文件。也就是说,归档日志能够恢复还原的数据文件

 

2、oracle逻辑结构

Oracle的逻辑组件包括表空间、段、区、块和模式等。


1)表空间

  表空间是数据库中最大的逻辑单位, SYSTEM 和SYSAUX 表空间是在创建数据库时创建的必须存在的表空间,还会有TEMP,USERS等。

  每个表空间是由一个或多个数据文件组成的,一个数据文件只能与一个表空间相关联。

  表空间的大小等于构成该表空间的所有数据文件大小之和。

  表空间和数据文件是相对应的,如果没有数据文件,表空间不可能独立存在,如果只有表空间没有数据文件也是不行的,就好比如果电脑没有硬盘,你不能再逻辑上看到C盘D盘,在这里硬盘就相当于是数据文件,而C盘就相当于是表空间。我们可以把多个数据文件组成一个表空间,然后在表空间里面存储数据,表空间和数据文件是对应的,一个表空间可以是由一个或多个数据文件组成的,但是一个数据文件只能在一个表空间当中。

 

表空间的作用:

  对于不同的用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和模式对象的管理。

  可以将不同数据文件创建到不同的磁盘中,有利于管理磁盘空间,提高i/o性能,备份和恢复数据等。

 

  SYSTEM表空间:用于存放oracle系统内部表和数据字典的数据,如表明、列名、用户名等。

  SYSAUX表空间:作为SYSTEM的辅助表空间,用于存放各种数据库工具(如企业管理器、StasPack、logMiner等)用到的数据。用于存放各种模式的对象数据,如智能代理用户DBSNMP、数据挖掘用户ODM等。

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

  TEMP表空间:存放临时数据的特殊表空间,例如:当需要进行排序时,系统就将排序的数据临时存放在该表空间,排序处理完成后,即可释放排序数据所占用的空间,称之为临时表空间。

 

 

 

以上表空间我们不能创建,系统安装好之后自动创建好了,我们也可以根据需要自己创建。

 

创建表空间的语法是:

CREATE TABLESPACE tablespacename

DATAFILE ‘filename’ [SIZE integer [K|M]]

[AUTOEXTEND [OFF|ON]];

 

 

案例一:创建一个自动增长的表空间tbs_work

如果不能创建,说明数据库没有启动,执行STARTUP命令之后再创建。

杨书凡03.png

 

如果空间不够用了,可以调整表空间大小。

方法一:更改数据文件大小,并指明数据文件的存放路径,使用RESIZE关键字执行调整后的表空间大小。

杨书凡04.png

 

方法二:向表空间内添加新的数据文件,当数据文件满了之后自动存储到新的数据文件。

杨书凡05.png

 

 

案例二:改变表空间的读写状态,ONLY表示只读,WRITE表示可读写。

杨书凡06.png

 

删除表空间

杨书凡07.png

 

 

案例三、想查看系统中有多少个数据文件

杨书凡08.png

 

杨书凡09.png

 

案例四、如何查看表空间

杨书凡10.png

 

案例五、查看表空间和数据文件之间的对应关系

杨书凡11.png

 

 

 

2)段

  段存在于表空间中,是一种指定类型的逻辑存储结构。

  段由一组区组成

  段分为4类:数据段、索引段、回退段、临时段。

杨书凡12.png 

3)区

  区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。

  区是由连续的数据块组成。

  段主要有一个或多个区构成,当创建段时,至少包含一个区。

  区不能跨数据文件存在,只能存在于一个数据文件中。

 

4)数据块

  是数据中最小的数据组织单位与管理单位

  Oracle数据中的数据存储于数据块中

  数据块是oracle服务器所能读取或写入的最小存储单元

  数据块的取值范围是2K-64KB,默认值与oracle版本有关

 

5)模式

  模式是数据库对象的集合。包括:表、视图、索引、同义词、序列、过程和程序包等。

  当创建一个用户时,oracle会自动创建一个与用户名相同的模式,因此,模式又称为用户模式。

  用户登录后,默认访问的是与自己的名称相同的模式中的数量库对象。

 

 


 

三、oracle的内存结构

内存是影响数据库性能的第一要素,oracle内存存储的主要内容如下:

  程序代码

  关于已经连接的会话信息,包括当前所有活动会话和非活动会话

  程序运行时必须的相关信息,如查询计划

  Oracle进程之间通信和共享的信息,如锁

 

按照内存的使用方法不同,oracle数据库的内存又可分为系统全局区(SGA)、程序全局区(PGA)、用户全局区(UGA)

杨书凡13.png

 

1、系统全局区 ( SGA )

数据库信息存储于系统全局区,由多个数据库进程共享,当数据库实例启动时SGA的内存本自动分配,SGA是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标,SGA按作用不同,分为以下几个部分。

杨书凡14.png

 

 


 

2、PGA

  PGA不是实例的一部分,包含单个服务器进程或者单个后台进程所需的数据和控制信息。

  PGA是在用户进程连接到数据库并创建一个会话时自动分配

  该区域内保留每个与oracle数据库连接的用户进程所需的内存

  当一个用户会话结束,PAG就会释放

 

 

3、UGA

  用户全局区(UGA)为用户进程存储会话状态

  UGA可以作为SGA或者PGA的一部分。具体位置取决于如何连接Oracle:

  如果通过一个共享服务器连接,UGA包含在SAG中

  如果通过一个专有服务器连接,UGA就包含在专有服务器的PGA中

 

 

案例一:验证内存结构工作的原理(select语句是如何被执行的?)

 

当用户执行语句select  *  from scott.emp的时候,工作原理分为四步,如下:

 

第一步:先做编译,编译包含了语法的检查和语义的检查。

 

第二步:如果编译没有问题会进入shared pool(共享池 )中,而shared pool 是由library cache和data dictionary cache(数据字典缓存)组成。Sql语句第一时间会进入library cache中,即library cache中会存放被编译过的正确的sql语句,仅仅是sql语句而已。library cache中没有缓存的sql语句需要进行硬解析(即需要耗费设备的I/0资源从硬盘读取)。假设library cache中有这个sql语句,就不需要做硬解析,接着会查 data dictionary cache。data dictionary cache中缓存了权限和对象数据及属性,所有data dictionary cache检查用户是否对scott.emp表是否具有访问权限,如果有权限继续往下执行,如果没有权限,直接给用户返回一个结果。如果一条语句从来都没有被执行过,这条语句首先被缓存在share pool中的library cache中,下一次被执行的时候直接从share pool中取sql语句。存放sql语句也需要占用空间,share pool的空间也是有限的,为了防止share pool空间不够用,采用先进先出的规则即后执行的sql语句会覆盖先执行的sql语句来释放空间,当然share pool的空间越大越好。

 

第三步:data buffer cache现在hr用户可以访问scott.emp表了,data buffer cache的作用就是从磁盘或存储中将数据块调入内存,缓存在buffer cache中。总结:buffer cache缓存数据本身,library cache缓存sql语句本身。

 

第四步:redo log buffer<重做日志缓冲区>当用户执行insert,update,delete,create,alter等操作后,数据发生了变化,这些变化了的数据写入数据缓冲区(buffer cache)之前,先写入重做日志缓冲区,同时变化之前的数据也放入重做日志缓存中,这样做,是为了保证在数据恢复时oracle就知道哪些事务需要提交,哪些事务需要撤回。

 

可以通过企业管理器来查看share pool的相关信息

如果控制台打不开,可以执行命令打开:

杨书凡15.png

 

杨书凡16.png

 

 杨书凡17.png


杨书凡18.png 

 

杨书凡19.png

 


可以从v$sgainfo中查看shared pool size

杨书凡20.png

 

测试语句执行时间:

SQL> set timing on

SQL> select * from scott.emp;第一次执行sql语句

 

已用时间:  00: 00: 00.05

 

SQL> /再次执行上一条命令所用的时间为00: 00: 00.00

 

已用时间:  00: 00: 00.00

 

通过上面的测试发现,缓存提高了查询的速度。

 

 

 

 

 

 

四、oracle进程结构

 

杨书凡21.png

 

Oracle有5个后台进程是必须启动的,否则数据库实例无法启动成功,分别是:进程监控(PMON)进程、系统监控(SMON)进程、数据写入(DBWR)进程、日志写入(LGWR)进程、检查点(CKPT)进程。

杨书凡22.png 


CKPT进程:确保数据缓冲区中所有修改过的数据块都被写入数据库文件的机制。保证数据库日志文件和数据文件的同步。

 

 

相关命令:

1、查看用户进程和数据库进程

Ps –elf | greporacleocl |grep–v grep

杨书凡23.png 



 

2、守护进程

Ps –elf |grep oha


 

3、查看日志进程LGWR

Ps –elf |grep ora_ | grep lgwr 

 

五、oracle用户管理

当创建一个新数据库时,oracle将常见一些默认的数据库用户,如SYS,SYSTEM和SCOTT等用户。SYS和SYSTEM用户都是oracle管理用户,而SCOTT用户是oracle数据库的一个示范用户,SCOTT数据库里面包含一些测试展示用的示例表(用于学习交流)

1、默认数据库用户

1)SYS

SYS用户是oracle中的一个超级用户,数据库中所有数据字典和视图都存在SYS模式中,数据字典存储了用来管理数据库对象的所有信息,是oracle数据库中非常重要的系统信息。SYS用户主要用来维护系统信息和管理实例。SYS用户只能以SYSOPER或SYSDBA角色登录系统。

 

2)SYSTEM

SYSTEM用户是oracle中默认的数据库管理员,它拥有DBA权限。该用户模式中存储了oracle管理工具使用的内部表和视图。通常通过SYSTEM用户管理数据库的用户、权限和存储等。不建议在SYSTEM模式中创建用户表。SYSTEM不能以SYSOPER和SYSDBA角色登录系统,只能以默认方式登录。

 

3)SCOTT

SCOTT用户是oracle数据库的一个示范用户,一般在数据库安装时创建。SCOTT用户模式包含4个示例表,其中一个是EMP表,使用USERS表空间存储模式对象。

通常出于安全考虑,对于不同用途的表需要不同的访问权限,此时,就需要创建不同的用户,oracle中的create user命令用于创建用户,每个用户都有一个默认表空间和一个临时表空间。如果没有指定,oracle就将USERS设为默认表空间,将TEMP设为临时表空间。

 

4)Sysdba和sysoper两个系统权限区别 

sysdba和sysoper属于system privilege,也称为administrative privilege,拥有例如数据库开启关闭之类一些系统管理级别的权限。sysdba和sysoper具体的权限如下: 

【SYSOPER】权限,即数据库操作员权限,权限包括:

  打开数据库服务器

  关闭数据库服务器

  备份数据库

  恢复数据库

  日志归档

  会话限制

【SYSDBA】权限,即数据库管理员权限,权限包括:

  打开数据库服务器

  关闭数据库服务器

  备份数据库 恢复数据库

  日志归档

  会话限制

  管理功能

  创建数据库 

 

【sysdba】拥有最高的系统权限,登陆后是sys。

【sysoper】主要用来启动、关闭数据库,sysoper 登陆后用户是public。

 

2、创建自定义用户

步骤:

  选择用户名和密码

  识别用户需用于存储对象的表空间

  决定每个表空间的限额

  分配缺省表空间和临时表空间

  创建用户

  向用户授予权限和角色

 

 

语法:

CREATE USER user

       IDENTIFIED BY password

       [DEFAULT  TABLESPACE tablespace]

       [TEMPORARY  TABLESPACE tablespace]

       [QUOTA {integer [K|M] | UNLIMITED}ON tablespace

       [QUOTA {integer [K|M] | UNLIMITED}ON tablespace ] ...]

       [PASSWORD EXPIRE ]

 

案例1:创建用户YDW

CREATE USER YDW                     --用户名为YDW

  IDENTIFIED BY pwd123                --密码为martinpwd

  DEFAULT TABLESPACE tbs_work         --默认表空间为tbs_work

  TEMPORARY TABLESPACE temp         --临时表空间为temp

  QUOTA UNLIMITED ON tbs_work        --对tbs_work表空间的使用没有限制

  PASSWORD EXPIRE;                   --第一次登录需要修改密码

杨书凡24.png 


 

3、修改YDW用户的密码为pwd123456

杨书凡25.png

 

 

4、删除用户YDW

杨书凡26.png

 

 

5、查询oracle的所有用户

杨书凡27.png

 

6、解锁用户

1)先查看hr用户的状态是锁定的

杨书凡29.png

 

 

六、oracle数据库权限管理

  权限指的是执行特定命令或访问数据库对象的权利

  权限有两种类型,系统权限和对象权限

  系统权限允许用户执行某些数据库操作,如创建表就是一个系统权限

  对象权限允许用户对数据库对象(如表、视图、序列等)执行特定操作

  角色是一组相关权限的组合,可以将权限授予角色,再把角色授予用户,以简化权限管理

 

1、使用系统权限

系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类对象执行某种操作的权利,例如:在数据库中创建表空间的权利,或者创建表的权利,都属于系统权限,具体如下图:

杨书凡30.png

 

 

常用的系统权限如下:

CREATE  SESSION:连接到数据库

CREATE TABLE:创建表

CREATE VIEW:创建视图

CREATE SEQUENCE:创建序列

 

2、对象权限

对象权限是指针对某个特定模式对象执行操作的权利,只能针对模式对象来设置管理对象权限,包括:表、视图、序列、存储过程等。

杨书凡31.png

 

3、授权

Oracle数据库用户有两种途径获得权限

1)直接向用户授予权限

2)将权限授予给角色,再将角色授予给一个或者多个用户

使用角色能更高效,方便地对权限进行管理,所以数据库管理员通常使用角色向用户授予权限,而不是直接向用户授予权限。

Oracle中常用系统预定义角色有以下种类:

1)CONNECT:拥有连接数据库权限

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

3)DBA:数据库管理员,拥有管理数据库最高权限

 

新用户必须授予一定的权限才能进行相关数据库操作,授权通过grant语句,取消授权通过revoke语句

 

授权的语法:

1)GRANT CONNECT  TO  MARTIN;

授予授予CONNET角色给MARTIN

 

2)GRANT CONNECT,RESOURCE TO MARTIN;

同时授予CONNET,RESOURCE这2个角色给MARTIN

 

3)GRANT SELECT ON SCOTT.emp TO MARTIN;

允许用户MARTIN查询 SCOTT.emp表的记录

 

4)GRANT UPDATE ON SCOTT.emp TO MARTIN;

允许用户MARTIN更新 SCOTT.emp表中的记录

 

5)GRANT ALL ON SCOTT.emp TO MARTIN;

允许用户MARTIN插入、删除、更新和查询SCOTT.emp表中的记录

 

 

4、撤销权限的语法:

使用REVOKE命令撤销用户分配的权限或角色

 

1)REVOKE CONNECT,RESOURCE FROM MARTIN;

撤销CONNET,RESOURCE这2个角色

 

2)REVOKE SELECT FROM SCOTT.emp TO MARTIN;

撤销MARTIN查询 SCOTT.emp表的记录的权限

 

 

 

 

案例1:为用户设置权限

1)首先建立用户YDW

杨书凡32.png

 

2)使用YDW用户登录

杨书凡33.png

提示第一次登录需要更改密码

 

3)使用新密码重新登录,提示没有任何权限。

杨书凡34.png

 

4)为用户授予session(连接到数据库)权限

杨书凡35.png

 

5)重新登录oracle

杨书凡36.png

 

6)测试YDW能否创建表,提示权限不足

杨书凡37.png

 

7)授予用户创建表的权限

杨书凡38.png

 

8)再次使用YDW登录,测试能够创建表

杨书凡39.png

创建成功了

 

9)测试插入数据,并查询

杨书凡40.png

 

10)查看用户拥有的权限

杨书凡41.png

 

11)撤销用户的权限

杨书凡42.png

 

12)测试用户YDW能够查询scott.emp

杨书凡43.png

提示没有权限

 

13)授予用户查询scott.emp的权限

杨书凡44.png

 

14)测试查询scott.emp

杨书凡45.png

查询成功了