图中描述了oracle的结构,oracle结构是比较复杂的,oracle设计这么复杂的体系结构的原因在于:首先oracle是一个关系型数据库管理系统,主要就是为了实现数据存储和管理的,为了让数据库的速度变得更快,尽可能的让90%以上的工作都在内存完成。所以数据库中最稀缺的资源就是内存,其次是磁盘I/O,所以我们要做好内存和I/O的管理,为了解决这个问题oracle这么复杂的一个结构。从图中可以看出来oracle体系结构包含了进程结构、内存结构、存储结构。进程结构包含了用户进程、服务器进程、后台进程。内存结构指的就是SGA和PGA。存储结构是指数据库部分,数据文件、控制文件、日志文件、密码参数文件、归档日志,告警日志文件。所以对于数据库来讲存储结构和内存结构是非常重要的
对于关系型数据库<RDBMS>来讲最重要的两个部分就是实例和数据库了,对于oracle服务器来讲实例是后台进程和内存结构的集合。而oracle数据库是一个数据的集合。
Oracle服务器除了维护实例和数据库文件以外,还会在用户和服务器建立连接时启动服务器进程并分配PGA。PGA是在用户进程连接到oracle数据库并创建一个会话时由oracle自动分配。会话结束,PGA被释放。
如果用户进程里包含了一个select语句,服务器进程就会向实例传递select语句。对于数据库来讲首先必须启动实例才能访问数据库的数据。Oracle实例启动时,将分配一个系统全局区域(SGA)并启动一系列的oracle后台进程。对于oracle来讲,一个实例只能打开并使用一个数据库。
物理结构是指构成数据库的一组操作操作系统文件,主要由3种类型的文件组成:数据文件、控制文件和重做日志文件。
数据库的逻辑结构是指数据库数据的逻辑存储结构,例如例如表空间、段、模式对象、表、视图等。
Oracle的存储结构分为物理结构和逻辑结构,这两种存储结构既相互独立又相互联系。
物理结构是指oracle数据库创建后使用的操作系统物理文件。Oracle数据库的物理文件分为以下两种:主要文件和其他文件。
数据文件是物理存储oracle数据库数据的文件。
其他文件:参数文件、归档日志文件、密码文件等。
物理结构是oracle数据库创建后使用的操作系统物理文件。Oracle数据库的物理文件分为以下两种
1.主要文件
数据文件的特点: 是物理存储oracle数据库数据的文件
每个数据文件只与一个数据库相联系
一个表空间可包含一个或多个数据文件
一个数据文件只能属于一个表空间
重做日志文件:Redo log的扩展名.log ,记录了对数据的所有更改信息,并提供了一个数据恢复机制,确保在系统崩溃后恢复数据库
在oracle中,Redo log是成组使用的,每个重做日志文件组可以有一个或多个重做日志文件。在工作过程中看,多个重做日志文件组之间循环使用,当一个重做日志文件组写满后,会转向下一个日志文件组。
控制文件:扩展名是.ctl,是一个二进制文件。控制文件中存储信息很多,其中包括数据文件和重做日志文件的名称和位置。控制文件是数据库启动及运行所必须的文件。当oracle读写数据时,要根据控制文件的信息查找数据文件。由于控制文件的重要性,一个数据库至少要有两个控制文件,oracle 11g默认包含3个控制文件。每个控制文件内容相同,可以避免因为一个控制文件丢失或损坏而导致无法启动数据库。
控制文件记录了以下关键信息:
数据文件的位置及大小
重做日志文件的位置及大小
数据库名称及创建时间
日志序列号
2.其他文件:参数文件、归档日志文件、密码文件等。
参数文件:用于定义实例启动时的配置
口令文件:允许sysdba、sysoper 和sysasm 远程连接到实例并执行管理任务
归档日志文件:使用这些文件和数据库备份,可以恢复丢失的数据文件。也就是说,归档日志能够恢复还原的数据文件
数据库的逻辑组件是从逻辑的角度分析数据库的组成。Oracle数据库的逻辑组件包括表空间、段、区、块和模式等。
表空间
每个oracle数据库都是由若干个表空间构成的,用户在数据库中建立的所有内容都被存储到表空间中。一个表空间可以有多个数据文件,但一个数据文件只能属于一个表空间。表空间属于数据库的逻辑结构。
在每个数据库中,都有一个名为system的表空间,即系统表空间,还会有sysaux、temp、undo、users等表空间。这些都是在创建数据库时自动创建的,管理员可以创建自定义的表空间并分配给指定用户,也可以为表空间增加和删除数据文件。
表空间有以下三类
永久性表空间:
用来保存表、视图、存储过程和索引的数据。System、sysaux、users、example表空间都是默认安装的
临时表空间:
用于保存系统中短期活动的数据,如排序数据等。
撤销表空间:
用来帮助回退未提交事物的数据,已经提交的事物数据是不可以被恢复的。
使用表空间的目的:
(1)对不同的用户分配不同的表空间,对不同的模式对象分配不同的表空间,方便对用户操作和对模式对象的管理。
(2)可以将不同的数据文件存放到不同的磁盘中,有利于管理磁盘空间、提高I/O性能、备份和恢复数据等。
System表空间:用于存放oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不建议用户将创建的表和视图存放在system表空间中。
Sysaux:是system的辅助表空间,用于存放各种数据库工具,用于存放各种模式的对象数据。
Users:表空间是通常作为用户使用的表空间,可以在这个表空间上创建各种对象,如创建表索引等。
TEMP:表空间是oracle系统用于存放临时数据的特殊表空间。例如排序数据存放在该表空间中。
除了oracle系统默认创建的表空间外,用户可根据应用系统的规模及其所要存储的对象类型创建多个表空间,用来区分用户数据和系统数据。
语法如下
CREATE TABLESPACE tablespacename
DATAFILE ‘filename’ [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
在语法中:
Tablespacename是表空间名称
Datafile指定组成表空间的一个或多个数据文件,当有多个数据文件时使用逗号分隔。
Filename:是表空间中数据文件的路径和名称
SIZE:指定文件的大小,用K指定千字节大小,用M指定兆字节大小
AUTOEXTEND:子句用来启用或禁用数据文件的自动扩展。设置AUTOEXTEND参数为ON,空间使用完毕会自动扩展。当设置AUTOEXTEND参数为OFF时很容易出现表空间剩余容量为0,造成数据不能存储到数据库中。
举例:
创建一个表空间,名字为sales_work,该表空间为自动增长;
CREATE TABLESPACE sales_work
DATAFILE ‘/opt/oracle/oradata/orcl/SALES01.DBF’
SIZE 10M AUTOEXTEND ON;
创建完表空间后,可以对表空间进行相应的管理,主要包括以下几种操作。
当遇到数据插入失败,表空间已满的情况,可以通过ALTER语句来调整表空间的大小,可以通过两种方式调整表空间的大小。
方法一:更改数据文件的大小,并指明数据文件的存放路径,可以使用RESIZE关键字来指定调整后的表空间大小。
ALTER DATABASE DATAFILE
‘/opt/oracle/oradata/orcl/SALES01.DBF’
RESIZE 80M;
方法二:向表空间内添加数据文件,为表空间添加一个新的数据文件。
ALTER TABLESPACE SALES01_WORK
ADD DATAFILE
‘/opt/oracle/oradata/orcl/SALE02.DBF’ SIZE 20M
AUTOEXTEND ON;
当数据成为历史数据,只允许查询,不希望被修改,此时可以将表空间设为只读状态。
ONLY表示该表空间为只读,WRITE表示该表空间可读写。
ALTER TABLESPACE 表空间名 READ WRITE; --使表空间可读写
ALTER TABLESPACE 表空间名 READ ONLY; --使表空间只读
可以通过DROP语句来删除表空间,在加上表空间的名字即可。
DROP TABLESPACE 表空间 [INCLUDING CONTENTS];
其中INCLUDING CONTENTS是可选项。如果删除仍包含数据的表空间,需要加上该选项。
段(segment)存在于表空间中,是一种指定类型的逻辑存储结构,段由一组区组成。按照段中所存储数据的特征,以及优化系统性能的需要,将段分成4类,即数据段、索引段、回退段、临时段。例如,对于每一个非聚集表有一个数据段,表的所有数据存储在该段;而对于每个索引有一个索引段。
区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区由连续的数据块组成。段主要由一个或多个区构成。当段创建时,它至少包含一个区。当段中的所有空间已完全使用时,系统自动为该段分配一个新区。区不能跨数据文件存在,只能存在于一个数据文件中。
数据块(data block)是数据库中最小的数据组织单位与管理单位。Oracle数据库中数据存储于数据块中。数据块是oracle服务器所能读取或写入的最小存储单元。Oracle服务器以数据块为单位管理数据文件的存储空间。数据块的取值范围为2-64KB,其默认大小与oracle版本有关。
模式(schema)是数据库对象(又成模式对象)的集合。模式对象包括表、视图、索引、同义词、序列、过程和程序包等。每当创建一个用户时,oracle会自动创建一个与用户名相同的模式,因此,模式又称用户模式。用户登录后,默认访问的是与自己的名称相同的模式中的数据库对象。
Oracle中90%的工作都是在内存中完成的,内存结构是oracle数据库体系中最为重要的一部分,也是最复杂的。
Oracle内存存储的主要内容如下:
程序代码
已经连接的会话信息,包括当前的所有活动会话和非活动会话
程序运行时必须的相关信息,如查询计划
Oracle进程之间通信和共享的信息,如锁
按照内存的使用方法不同,oracle数据库的内存又可以分为系统全局区<SGA>,程序全局区<PGA>和用户全局区<UGA>.
SGA: 所有用户都可以访问实例的共享内存区域。数据块、事物处理日志、数据字典信息都存储在SGA中。
PGA: 是一个非共享的内存,专用于特定的服务器进程,并且只能够由这个进程访问。
UGA: 为用户进程存储会话状态的内存区域。
UGA可以作为SGA或者PGA的一部分。具体位置取决于如何连接Oracle:
如果通过一个共享服务器连接,UGA包含在SAG中
如果通过一个专有服务器连接,UGA就包含在专有服务器的PGA中
系统全局区(SGA)由一组内存结构组成,是所有用户进程共享的一块内存区域。其中可以包含一个数据库实例的数据或控制信息。在一个数据库实例中,可以有多个用户进程这些用户进程共享系统全局区中的数据,因此系统全局区也称之为共享全局区。
系统全局区(SGA)的总内存大小有参数sga_max_size决定。
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1520M
sga_target big integer 0
SQL> show parameter sga_max_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 1520M
SQL>
SGA按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和java池等
共享池:
共享池是对SQL、PL/SQL程序进行语法分析,编译、执行时用到的内存区域,共享池由库缓存和数据字典缓存组成。
库缓存含有最近执行的SQL,PL/SQL语句的分析码和执行计划。
数据字典缓存含有从数据字典中得到的表、索引、列定义、权限信息和其他一些数据库对象的定义。如果oracle缓存了这些信息,无疑缩短了查询的响应时间。
Shared pool:
用于存储:
由两个与性能相关的部分组成
由参数SHARED_POOL_SIZE决定大小
库缓存
数据字典缓存
SQL> show parameter shared_pool_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size big integer 0
数据缓冲区:
数据缓冲区用于存储从磁盘数据文件中读入的数据,所有用户共享。数据被修改时,首先要从数据文件中取出,存储于数据缓冲中。修改的数据、插入的数据被存储于数据缓冲区,修改完成和其他条件满足时,数据被写入数据文件。
Oracle服务器进程在处理一个查询时,首先查找内存中是否存在所需的数据块。如果在数据缓冲区中没有找到需要的数据块,服务器进程则从数据文件中读取此数据块,并保存在缓冲区中。当后续的请求需要读取这些块时,可以在内存中找到,因此这些请求不需要从磁盘读取,提高了读取速度。数据缓冲区的大小对数据库的读取速度有直接的影响。
初始化参数DB_BLOCK_SIZE决定了数据块的大小,这也是数据库I/O的最小单位
数据缓存区由多个独立的子缓存池构成,可以独立的设置大小:
---default 池 DB_CACHE_SIZE
---keep 池 DB_KEEP_CACHE_SIZE
---recycle 池 DB_RECYCLE_CACHE_SIZE
SQL> show parameter db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
重做日志缓冲区:
当用户执行了如INSERT、UPDATE、DELETE、CREATE、ALTER或DROP等操作后,数据发生了变化,这些变化了的数据在写入数据缓存之前先写入重做日志缓冲区,同时变化之前数据也放入重做日志缓存,这样在数据恢复时oracle就知道哪些资源需要提交,哪些资源需要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较少。
重做日志缓冲区的大小由参数LOG_BUFFER决定,这个内存区不能动态调整大小
SQL> show parameter log_buf
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 7106560
大池:
在SGA中,大池是一个可选的缓冲区,管理员可以根据需要对其进行配置。在大规模输入输出及备份过程中也需要大池作为缓存空间。例如,大数据操作,数据库备份与恢复之类操作。
大池主要在下面几种情况下使用:
SQL> show parameter large_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
large_pool_size big integer 0
修改大池的大小
SQL> alter system set large_pool_size=10m;
System altered.
查看修改后的大池的大小
SQL> show parameter large_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
large_pool_size big integer 16M
Java池:
在SGA中,java池也是一个可选的缓冲区,但是在安装JAVA或者使用JAVA程序时则必须设置JAVA池,用于编译JAVA语言编写的指令。
JAVA池主要用于:
SQL> show parameter java_pool_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
java_pool_size big integer 0
PGA是oracle用户进程使用的一个内存区域
一个用户进程对应一个PGA,与SGA不同的是PGA是非共享的。
主要用于用户在运行程序时的使用的变量空间。
如果使用共享服务器设置,那么PGA的会话信息可能被存在SGA中。
共享服务器结构允许用户进程使用同一个服务器进程,提高内存利用率。
PGA是用户进程连接到oracle数据库并创建一个会话时,有oracle自动分配,当一个用户会话结束后,PGA释放。
SGA存放了SQL,PL/SQL的分析信息,当用户要依据执行select、update语句的值不能被共享,这些不能共享的就在PGA中。
程序全局区的大小由pga_aggregate_target决定,通过show parameter pga_aggregate_target
SQL> show parameter pga_aggregate_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 0
进程用于执行特定的任务,不同的进程完成的任务不同。
Oracle的进程分为三大类:
--用户进程:客户端用于连接数据库的程序
--服务进程:服务器端响应用户操作请求的程序
--后台进程:维护数据库服务器正常运行以及一些特定功能所需要的进程,随着实例启动而启动。
Oracle的用户进程就是客户端连接数据库的程序
当客户端程序发出连接请求,用户进程启动。当断开连接,用户进程释放。
服务器进程就是服务器端响应用户操作请求的程序(进程),同用户进程一样,连接开始,服务进程分配,连接断开,服务进程释放。
后台进程用于执行数据库服务器中特定的任务,根据进程的功能,后台进程被分为必要的和可选的两种。
必要的后台进程是系统运行必须的,主要由下面5种:
DBWN、PMON、CKPT、LGWR、SMON
可选的后台进程更多一些,主要被用于实现或者增强某方面的特殊功能。
PMON进程
PMON进程在用户连接意外中断后执行资源清理工作<清初失败的进程>包括下列任务:
SQL> ho ps -ef |grep ora_|grep pmon
oracle 9276 1212 1 15:00 pts/2 00:00:00 /bin/bash -c ps -ef |grep ora_|grep pmon
oracle 28236 1 0 Apr27 ? 00:00:20 ora_pmon_orcl
SMON进程
SMON进程执行以下任务:
DBWR进程
DBWR进程执行下列任务:
LGWR进程
LGWR进程负责将日志缓冲区中的日志数据写入日志文件组。数据库在运行时,如果对数据进行修改,则产生日志信息,日志信息首先产生于日志缓冲区中。此缓冲区按照“先进先出”的原则进行操作,当日志信息满足一定条件时,由LGWR进程将日志写入日志文件。系统通常有多个日志文件,日志写入进程以循环的方式将数据写入文件。
CKPT进程
检查点(checkpoint,CKPT)是确保数据缓冲区中所有修改过的数据块都被写入数据库文件的机制。当检查点完成后,CKPT进程负责更新数据文件头和控制文件,保存检查点信息,以保证数据库日志文件和数据文件的同步。其原理是,在数据库恢复时只需要找到CKPT保存的最后一次检查点,就可以根据它确定在日志文件中恢复数据的开始位置,重新执行其之后的日志记录即可。
当创建一个新数据库时,oracle将创建一些默认的数据库用户,如SYS、SYSTEM和SCOTT用户。SYS和SYSTEM用户都是oracle的管理用户,而SCOTT用户是oracle数据库的一个示范用户,里面包含一些测试展示用的示例表:
下面简单介绍一下SYS、SYSTEM、SCOTT用户
SYS
SYS用户是oracle中的一个超级用户。数据库中所有数据字典和视图都存储在sys模式中。数据字典存储了用来管理数据库对象的所有信息,是oracle数据库中非常重要的系统信息。SYS用户主要用来维护系统信息和管理实例。SYS用户只能以SYSOPER或SYSDBA角色登录系统。
SYSTEM
SYSTEM用户是oracle中默认的数据库管理员,它拥有DBA权限。该用户模式中存储了oracle管理工具使用的内部表和视图。通常通过SYSTEM用户管理oracle数据库的用户、权限和存储等。不建议在SYSTEM模式中创建用户表。SYSTEM用户不能以SYSOPER或SYSDBA角色登录系统,只能以默认的方式(数据库身份验证的方式)登录。
SCOTT
SCOTT用户是oracle数据库的一个示范用户,一般在数据库安装时创建。SCOTT用户模式包含4个示例表,其中一个是EMP表,使用USERS表空间存储模式对象。
通常情况下,处于安全考虑,对于不同用途的数据表需要不同的访问权限,此时,就需要创建不同的用户。Oracle中的CREATE USER命令用于创建新用户。每个用户都有一个默认的表空间一个临时表空间。如果没有指定,oracle就将users设为默认表空间,将TEMP设为临时表空间。
创建用户的语法如下
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 ]
在语法中:
举例
例如,数据库管理员会使用初始密码创建用户,当用户第一次登录时必须修改密码,以确保密码的安全。
以SYSTEM用户的身份登录orcl数据库,创建名称为martin的用户。
CREATE USER martin --用户名为martin
IDENTIFIED BY martinpwd --密码为martinpwd
DEFAULT TABLESPACE tbs_work --默认表空间为tbs_work
TEMPORARY TABLESPACE temp --临时表空间为temp
QUOTA UNLIMITED ON tbs_work --对tbs_work表空间的使用没有限制
PASSWORD EXPIRE; --第一次登录需要修改密码
修改martin的口令为mpwd。
ALTER USER martin IDENTIFIED BY mpwd;
Oracle 中的DROP USER命令可用于删除用户,当用户拥有模式对象时则无法删除用户,而必须使用CASCADE选项来删除用户及用户模式对象。以下语句演示了如何删除用户martin.
DROP USER martin CASCADE;
从以上内容可以看出,在创建新用户前,必须做些准备工作,下面提供创建用户的核对清单
选择用户名和密码
识别用户需用于存储对象的表空间
决定每个表空间的限额
分配默认表空间和临时表空间
创建用户
向用户授予权限和角色
权限是执行某种类型的SQL语句或者存取其他用户数据库对象的权利。在oracle中,将权限分为系统权限与对象权限两类:
系统权限
系统权限是指在数据库中执行某种系统级别的操作,或者针对某一类的对象执行某种操作的权利。例如,在数据库中创建表空间的权力,或者在数据库中创建表的权利,都属于系统权限。
常见的系统权限如下:
CREATE SESSION:连接到数据库
CREATE TABLE:创建表
CREATE VIEW: 创建视图
CREATE SEQUENCE:创建序列
一个新用户创建后,首先要授予其CREATE SESSIOJN权限,使其可以访问数据库。
对象权限
对象权限是指针对某个特定的模式对象执行操作的权利。只能针对模式对象来设置和管理对象权限,包括数据库中的表、视图、序列、存储过程等。
oracle数据库用户有两种途径获得权限:
使用角色能够更加方便和高效的对权限进行管理,所以数据库管理员通常使用角色向用户授予权限,而不是直接向用户授予权限。在oracle数据库系统中预定义了很多角色,其中最常用的主要由CONNECT角色、RESOURCE角色、DBA角色等。DBA角色具有所有的系统权限,并且可以给其他用户、角色授权。
类别 |
包括的权限 |
说明 |
CONNECT |
CREATE SESSION ……… |
需要连接上数据库的用户,特别是那些不需要创建表的用户,通常赋予该角色。 |
RESOURCE |
CREATE TABLE、 CREATE VIEW、 CREATE PROCEDURE、 CREATE SEQUENCE、 CREATE TRIGGER、 CREATE TYPE、 …… |
更为可靠和正式的数据库用户可以授予该角色,可以创建表、触发器、过程等。 |
DBA |
具有大多数系统权限;其它若干个角色。 |
数据库管理员角色,拥有管理数据库的最高权限。请不要将其授予给非管理员。 |
新创建的用户必须授予一定的权限才能进行相关的数据库操作。授权通过GRANT语句,取消授权通过REVOKE语句。
授予权限的语法格式如下:
GRANT 权限|角色 TO 用户名;
撤销权限的语法格式如下
REVOKE 权限|角色 FROM 用户名;
举例
如何授予和取消martin用户CONNECT和RESOURCE两个角色
为用户martin授予CONNECT和RESOURCE两个角色
GRANT connect,resource TO martin;
撤销用户martin用户的CONNECT和RESOURCE两个角色
REVOKE connect,resource FROM martin;
允许martin用户查看EMP表中的记录
GRANT SELECT ON SCOTT.emp TO martin;
允许martin用户更新EMP表中的记录
GRANT UPDATE ON SCOTT.emp TO martin;
数据库用户安全设计原则如下:
需要注意的是:一般程序开发人员只要授予CONNECT和RESOURCE两个角色即可。特别注意,授予这两个角色就包含了授予用户无限制使用默认表空间的权限。