Oracle的三个竞争力
a.可扩充性:Oracle系统有能力承担增长的工作负荷,并且相应的扩充它的系 统资源利用情况。
b.可靠性:无论出现操作系统崩溃、电源断电还是系统故障,都可以对Oracle 进行配置,以保证在检索用户数据和进行事务处理的时候不受任何影响。
c.可管理性:数据库管理员可以微调Oracle使用内存的方式、Oracle向磁盘写 入数据的频率、以及数据库为连接到数据库的用户分配操作系统进程的方式。
概述
Oracle的体系结构由许多可移动的部分组成,它提供了高度的、可配置的解决方案。Oracle可以在不同的硬件平台和软件平台上以一种相似的方式运行。
连接
Oracle体系结构中有三个协同工作的区域:用户进程、Oracle监听器、Oracle网络客户,它们可以为我们提供连接数据库实例的能力。
用户进程(user process)
是一些试图连接Oracle数据库的软件(例如客户工具)。用户进程使用Oracle Net Services(Oracle的网络服务)与数据库进行通信(网络服务是一组通过网络协议提供网络连接的组件)。可以使用Oracle Net Configuration Assitant(Oracle的网络配置助手)来设置Oracle的网络服务。
推荐大家使用该工具进行配置,从而避免与特定的操作系统文件打交道。
Oracle监听器(listener)
监听器是一个通常运行在Oracle数据库服务器上的进程。它负责“监听”来自客户应用的连接请求。客户负责在初始化连接请求中向监听器发送服务名称(service name),这个服务名称是一个标识符,它可以唯一标识客户试图连接的数据库实例。
监听器接受请求,判断其合法性,并将连接路由到适当的服务处理器。
在Oracle9i中,可以动态配置监听器,标准监听器包括有:网络协议(TCP/IP)、主机名称(运行监听器的主机)、端口(默认为1521)。
可以手工配置监听器-listener.ora文件(位于%ORACLE_HOME%\network\admin)
Oracle网络客户
可以通过SQL*Plus、Oracle Enterprise Manager Console(Oracle企业管理器)或Oracle Net Manager(Oracle网络管理器)等工具,通过使用Oracle网络服务,客户适配器就会知道如何与Oracle数据库进行交互。
需要进行配置,Oracle工具才能与网络上某处的数据库进行交互。
(位于%ORACLE_HOME%\network\admin\tnsnames.ora),其中tns是透明网络协议的缩写。
服务器进程
负责在用户进程和Oracle实例之间调度请求和响应(例如处理查询请求)。
在Oracle中有两种不同的体系结构:专用服务器和共享服务器。
专用服务器:在该模式中, 会向每个要与数据库进行连接的用户进程赋予它自己的专用服务器进程。(开销比较大,适合于连接数目较小的情况)
共享服务器:每个服务器进程都要为多个用户进程提供服务。(通过调度程序来协调用户的请求-将其发送到请求队列)
*对于用户进程而言,使用哪种模式并无本质的区别,只不过进程使用内存区域的方式不同罢了。(注意:对于Oracle数据库中的EJB容器,用户必须要使用Internet-Inter-Orb协议(IIOP)来连接运行于这个容器中的Bean,必须使用共享模式)
文件
a.参数文件(parameter files)
用于在启动实例的时候配置数据库。当建立数据库的时候,用户就可以运行初始化文件(一种形式的参数文件,通常指Pfile或init.ora文件),规定数据库中所使用的各种设置值。这些设置包括了数据库实例名称(SID)、数据库主要文件的位置、以及实例所使用的主要内存区域的大小等内容。在这个初始文件中还会规定其他许多参数,文件名称通常为init<SID>.ora(注意:安装/创建数据库的时候可以指定各项参数,并将设置文件保存到指定的位置)
在数据库创建之后,就会在实例启动期间使用初始化文件;在实例启动时,它就会读取文件,根据文件中的位置进行配置(几乎所有的参数都有默认值,可以更改这些默认值来配置数据库以满足特定的需要)。
(注意:请务必确认你已经了解了要进行修改的参数,同时应该清楚该参数修改之后会给数据库带来什么样的影响,强烈建议在修改之前对原始文件进行备份!)
静态初始化参数-只能通过关闭数据库进行更新的参数;
动态初始化参数-可以在当前数据库实例中进行更新的参数。
1、alter system-会影响当前数据库上运行的所有会话;
2、alter session-该命令将会修改当前会话运行期间的参数。
示例
show parameter open_cursors;
alter system set open_cursors=500;
可以使用数据字典中的3个视图来分析用户数据库的参数,它们分别是v_$parameter,v_$system_parameter,v_$spparameter;查询这些视图将返回下列与用户会话、系统和服务器参数文件相关联的数据库参数特性。
v_$parameter:用于用户当前会话的数据库参数;
v_$system_parameter:用户整个系统的数据库参数,新的会话将从该视图中获取它们的参数值;
v_$spparameter:这个视图包含了已存储参数文件的内容。
控制文件(control files)
控制文件是Oracle服务器在启动期间用来标识物理文件和数据库结构的二进制文件。它们提供了建立新实例所需的必要文件目录。
(当用户建立控制文件的时候,建议用户建立多个副本,如果采用了这种方法,则当设备崩溃的时候,用户就可以有完好的控制文件来启动和恢复数据库,否则恢复工作将异常复杂)
数据文件(data files)
数据文件是用来存放用户数据的地方。
下面我们通过讨论Oracle中的逻辑存储结构,以及展示如何将逻辑存储结构映射到物理结构,来理解怎样在数据库中存放数据。
a.表空间(tablespace)
是用户可以在Oracle中使用的最大逻辑存储结构,用户在数据库中建立的所有内容都会存储在表空间中。
ALTER USER teach DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
ALTER USER teach TEMPORARY TABLESPACE temp;
SYSTEM表空间:用来存储数据字典及系统管理信息;
USERS表空间:用来存储用户和应用的数据;
DEFAULT表空间:在默认情况下存储用户对象的表空间(如果在建表时没有指 定表空间的话,Oracle会自动将表数据存放在此处)
TEMP表空间:写入临时数据的地方。
b.段(segment)
是用户建立的数据库对象的存储表示。用户建立的每一个表都会有一个在表空间中存储的逻辑段。有3种类型的段
(1)数据段-是存储表、索引、簇以及表分区这样的常规应用数据的地方。
(2)临时段-是临时表空间中的段,可以用来存储临时表、引起内存页交换的SQL操作这样的内容。
(3)回滚段-用于管理数据库中的UNDO数据,并且为事务处理提供数据库的读取一致性视图。(回滚是Oracle的撤销机制,即最后使用commit语句的地方)
c.盘区(extent)
段是由一个或多个盘区构成,盘区是用来为段存储数据的逻辑上连续的数据库块的集合。
d.数据块(data blocks)
代表了数据库中最细微的逻辑数据存储层次。
数据块->(构成)盘区->(构成)段->(构成)表空间
(注意:在Oracle9i中,可以指定数据块的大小)
重做日志文件
用户的数据文件会在表、索引以及其他的数据库结构中存储当前数据的表示,而用户的重做日志文件则会存储所有数据库中发生的修改。它们是用户的事务处理日志。(通常是用在故障恢复)
内存区域
Oracle的服务器进程和许多后台进程要负责在内存区域中写入、更新、读取和删除数据。
Oracle实例中有三个主要的内存区域
a.系统全局区域(SGA)
System Global Area,这是所有用户都可以访问的实例的共享内存区域;数据块、事务处理日志、数据字典等都放在这里。
b.程序全局区域(PGA)
Program Global Area,这是一类没有共享的内存,它专用于特定的服务器进程,只能够由这个进程访问。
c.用户全局区域(UGA)
User Global Area,这个内存区域会为用户进程存储会话状态,根据用户数据库是配置为专用服务器模式或共享服务器模式,UGA可以作为SGA或PGA的一部分,它为用户会话存储数据。
系统全局区域
它是数据库操作的中枢。
包括有:
缓存数据块-在内存中存储,可以被用户的会话使用。
SQL语句-在数据库上执行,包括SQL语句的执行方案。
用户执行的过程、函数和触发器等程序单元。
我们有时候把系统全局区域称为共享全局区域(Shared Global Area)。
SGA会在启动实例的时候从操作系统的内存中预先分配。
SGA包含有若干个区域,用来存储一些可以在用户之间共享的数据,可以根据应用的需求,将数据分散到不同的区域,对区域设定大小并进行配置,进而调整我们的数据库。
数据库缓冲区(database buffer cache)
也称为数据块缓存(block buffer cache),是用来存储读入内存的数据块副本。这些数据块是由正在执行的服务器进程放入缓存的,可以使SQL查询或用户进程指令对数据块进行的更新。
Oracle会自动寻找命中率最低的数据块,并将它们从缓存中清除。
重做日志缓存(redo log buffer)
可以为联机重做日志文件存储数据,这些文件是我们的事务处理日志,可以记录数据库中出现的所有已提交的事务处理,以用于实例恢复的目的。
共享池(shared pool)
可用于内存中存储要被其他会话使用的信息,这些信息包括SQL语句、PL/SQL代码、控制结构、数据字典等信息。
库缓存-存储SQL执行方案以及已缓存的PL/SQL代码;
字典缓存-存储数据字典信息。
大型池(large pool)
是数据库管理员能够配置的可选内存空间,可以用于不同类型的内存存储。
(它采用了超过4k的字节块来存储所缓存的数据,而4k是共享池中字节块的大小)
后台进程
无论用户是否连接着数据库,以下的进程都会作为数据库的一部分运行,每个进程都有自己的职责领域,如果进程崩溃,那么数据库也会崩溃。
进程监控器(Process Monitor,PMON)
-监控服务器进程,以确保能够销毁发生损坏或出现故障的进程,释放它们的资源;
-在主机操作系统上使用Oracle监听器,注册数据库服务(全局数据库名称、SID、以及其他数据库支持的服务都要使用监听器注册)。
系统监控器(System Monitor,SMON)
-在出现故障实例的情况下,SMON负责重新启动系统,执行崩溃恢复。这包括了回滚尚未提交的事务处理,完成实例崩溃时候还没有写入数据库上应用重做日志表项(来自于归档的重做日志文件)的任务;
-SMON将会清除已经分配但是还没有释放的临时段;
-SMON也会字典管理表空间中执行盘区结合。
数据库写入器(Database Writer,DBWn)
将缓存中的数据块写回到磁盘。
日志写入器(Log Writer,LGWR)
负责向联机重做日志文件中记录所有数据库的已提交事务出路。这个进程会将所有数据从重做日志缓存中写入到现行的联机重做日志文件中。
检查点(Check Point,CKPT)
进程负责使用最新的检查点信息来更新所有的控制文件和数据文件标题,这种操作我们称之为检查点。