缓冲区:临时存储数据的内存区。
Oracle数据库管理系统的体系结构
Oracle服务器=实例(instance)+数据库(database)
Oracle的安装(连接)方式
基于主机方式:用户直接在安装了数据库的计算机上登录oracle。
客户端-服务器(两层模型)方式:数据库和客户终端分别安装在不同的计算机上。
客户端-应用服务器-服务器(三层模型)方式:用户首先从自己的计算机登录应用服务器,再通过应用服务器访问真正的数据库。
Oracle实例
Oracle数据库也称为物理(外存)结构。它由以下3类操作系统文件组成;
控制文件:包含了维护和校验数据库一致性所需的信息;
重做日志文件:包含了当系统崩溃后进行恢复所需记录的变化信息;
数据文件:包含了数据库中真正的数据。
Oracle其他的关键文件
初始化参数文件:定义了实例的特性;如系统全局区中一些内存结构的大小,DBWR的个数等;
密码文件:包含了数据库管理员或操作员用户在启动和关闭实例时所需的密码;
归档重做日志文件:重做日志文件的脱机备份。
服务器进程
当Oracle创建一个服务器进程的同时,也要为该服务器进程分配一个内存区,该内存区称为程序全局区(PGA),与SGA不同,PGA是一个私有的内存区,不能共享,且只属于一个服务器进程。它随着服务器进程的创建而被分配,随着服务器进程的终止而被回收。程序全局区主要包括:
排序区:
Cursor状态区:用于指示会话当前所使用的sql语句的处理状态。
会话信息区:包括了会话的用户权限和优化统计信息。
堆栈区:包括了其他的会话变量。
Oracle执行sql查询语句的步骤
查询语句的处理主要包括:
编译;
服务器将sql正文放入共享池的库高速缓存,
在共享池中搜索是否有相同的sql正文,
检查sql语句语法是否正确,
通过查看数据字典来检查表和列的定义,
对所操作的对象加编译锁,以便在编译语句期间这些对象的定义不能被更改,
检查所引用对象的用户权限,
生成执行该sql语句所需要的优化的执行计划,
将sql语句和执行计划装入共享的sql区。
执行;
Oracle服务器进程开始执行sql语句是因为它已获得了执行sql语句所需要的全部资源和信息。
提取数据;
Oracle服务器进程选择所需的数据行,并在需要时将其排序,最后将结果返回给用户。
共享池
SGA中的共享池是由库高速缓存和数据字典高速缓存组成。服务器进程将sql语句的正文和变异后的代码以及执行计划都放在共享池的库高速缓存中。在进行编译时,而是直接使用已存在的编译后的代码和执行计划。
要想共享SQL语句:
库高速缓存足够大;
Sql语句要是能共享的通用代码,因为oracle是通过比较sql语句的正文来决定两个语句是否相同的,只要当两个正文完全相同时,oracle才重用已存在编译后的代码和执行计划。
Select * from emp where sal>=1500;
Select * from emp where sal>=1501;
Select * from emp where sal>=:g_sal;
数据字典高速缓存:
当oracle在执行sql语句时,服务器进程将把数据文件,表,索引,列,用户和其他的数据对象的定义和权限的信息放入数据字典高速缓存。为了能达到共享信息的目的,数据字典高速缓存应该尽可能设置的大一些。
ALTER SYSTEM SET SHARED_POOL_SIZE=250M;
该参数受限于SGA_MAX_SIZE参数。
数据库高速缓存区
服务器进程将首先在数据库高速缓冲区中搜寻所需的数据,如果找到了就直接使用而不进行磁盘操作,如果没找到就进行磁盘操作,把数据文件中的数据读入到数据库高速缓冲区中,oracle也是使用LRU的队列(list)或算法(algorithm)来实现对数据库高速缓冲区的管理。
DB_BLOCK_SIZE:oracle数据块(内存缓冲区)的大小,在oracle数据库中,内存和外存的数据块大小是相同的。如果要更改DB_BLOCK_SIZE的值,需要重建数据库。
DB_BLOCK_BUFFERS:内存缓冲区的个数,更改后需重启oracle数据库。
DB_CACHE_SIZE:可以在数据库运行时动态更改该参数。
内存缓冲区顾问
V$db_cache_advice
Select id,name,block_size,advice_status from
v$db_cache_advice;
Alter system set db_cache_advice=off;
重做日志缓冲区
重做日志缓冲区的主要目的就是数据的恢复。Oracle在使用任何DML或DDL操作改变数据之前都将恢复所需的信息,即在写数据高速缓冲区之前,先写入重做日志缓冲区。
与执行查询语句有所不同,oracle在执行DML语句时,只有编译和执行两个阶段;
如果数据和回滚数据不在数据库高速缓冲区中,则oracle服务器进程将把他们从数据文件中读到数据库高速缓冲区中。
Oracle服务器进程在要修改的数据行上加锁(行一级的锁,而且是在内存的数据行上加锁)。
Oracle服务器进程将数据变化信息和回滚所需的信息都记录在重做日志缓冲区中。
Oracle服务器进程将回滚所需的原始值和对数据所作的修改都写入数据高速缓冲区,之后在数据库高速缓冲区中,所有的这些数据块都将被标为脏缓冲区,因为因此内外存的数据是不同的。
大池,java池和streams池
引入大池的主要目的是提高效率,与shared
pool不同的是它没有LRU队列,在多线程MTS或共享服务器连接时,oracle服务器进程的PGA的大部分区域(也称UGA)将放入大池(stack
space除外)。另外,在大规模I/O及备份和恢复操作时可能是用该区。可以通过参数LARGE_POOL_SIZE的值来配置大池,该参数也是一个动态参数。
Java池,主要用来编译java语言的命令。
Streams池是由oracle streams使用的,以存储捕获和应用所需的信息。
内存缓冲区大小的设定
Oracle利用所谓的区组(granule)来管理SGA内存,区组就是一片连续的虚拟内存区,是oracle分配和回收内存区的基本单位。
区组的大小取决于所估计的SGA大小,如果SGA的尺寸小于1G,则区组的大小即为4M;如果SGA的尺寸大于或等于1G,则区组的大小就为16M。oracle数据库一旦启动,SGA中的每个内存缓冲区就会获得所需的区组。SGA中至少包括3个区组,一个是SGA固定区(包含重做日志缓冲区);一个是数据库高速缓冲区;一个是共享池。
Oracle数据库管理员可通过alter system set命令来分配和回收区组。但总的内存大小不能超过参数SGA_MAX_SIZE所设置的值。
动态分配和回收内存的最大优点是在调整内存缓冲区大小时,不需要重新启动数据库。
内存缓冲区信息的获取
Show parameter SGA_MAX_SIZE;
Show sga;
Select name,type,value from v$parameter where
name=’sga_max_size’;
重做日志写进程及快速提交
重做日志写进程(LGWR)负责将重做日志缓冲区的记录顺序地写到重做日志文件中。为了更好地理解LOG
writer的操作原理,介绍oracle提交语句是如何工作的。
Oracle服务器是使用了一种称为快速提交(fast commit)的技术,该技术既能保证oracle系统的效率,又能保证在系统崩溃的情况下所有提交的数据可以得到恢复。为此oracle系统引入了系统变化数(SCN)。无论任何时候只要某个事物被提交,oracle服务器都会产生一个SCN并将其赋予该事务的所有数据行。在同一个数据库中,SCN是单调递增的并且是唯一的。为了避免在进行一致性检验时操作系统始终可能引发的问题,oracle服务器将SCN作为oracle的内部时间戳来保证数据文件中的数据的同步和数据的读一致性。
当sql*plus发出commit之后:
服务器进程将把提交的记录连同所产生的SCN一起写入重做日志缓冲区中;
重做日志写进程将把重做日志缓冲区中一直到所提交的记录的所有记录连续地写到重做日志文件中。在此后,oracle服务器就可以保证即使在系统崩溃的情况下所有提交的数据也可以得到恢复;
Oracle通知用户提交已完成;
服务器进程将修改数据库高速缓冲区中的相关的状态并释放资源和打开锁等;
此时这些数据缓冲区被标为脏缓冲区,数据库高速缓冲区中的数据由DBWR写到数据文件中。
重做日志写进程(LGWR)要在下列情况下将重做日志缓冲区的记录(内存)顺序地写到重做日志文件(外存)中:
当某个事物被提交;
当重做日志缓冲区中所存的记录已经超过缓冲区容量的1/3;
在DBWR将数据库告诉缓冲区中修改过的数据块写到数据文件之前(如果需要);
每3秒钟。
数据库写进程
默认是每8个CPU对应一个数据库写入器。
为了提高oracle系统的效率,一要减少I/O量,这可能是oracle引入LGWR的原因之一;二要减少I/O次数,这可能是oracle引入数据库写进程(DBWR/DBWN)的主要原因。
Oracle12c最多启动100个数据库写进程,DBW0-DBW9,DBWa-DBWz,DBW36-DBW99,如果实例启动时没有说明数据库写进程的个数,oracle将根据CPU的个数来决定参数DB_WRITER_PROCESSES的设置。
数据库写进程负责将数据库高速缓冲区中的脏缓冲区中的数据写到数据文件上。为了提高效率,数据库写进程并不是数据库高速缓冲区中的数据一有变化就写数据文件,而是积累了足够多的数据一次写一大批内存数据块到数据文件上。
数据库写进程将在下列事件之一发生时把数据库高速缓冲区中的数据写到数据文件上:
当脏缓冲区的数量超过了所设定的限额;
当所设定的时间间隔已到;
当有进程需要数据库高速缓冲区却找不到空闲的缓冲区;
当校验(检查)点发生时;
当某个表被删除或被截断时;
当某个表空间被设置为只读状态时;
当使用类似于alter
tablespace user begin backup的命令对某个表空间进行联机备份时;
当某个表空间被设置为脱机状态(offline)或重新设置为正常状态时。
系统监督进程
如果有些已经提交的数据还没有真正的被写到数据文件中时,当数据库重新开启后,系统监督进程(SMON)将自动地执行oracle实例的恢复工作。
执行前滚(roll
forward),将已经写到重做日志文件中但还没有写到数据文件中的提交数据写到数据文件中(oracle是用SCN号码来识别提交记录的)。
在前滚完成后立即打开数据库,此时用户就可以登录并使用数据库了,这时在数据文件中可能还有一些没有提交的数据。之所以这样安排,主要是为了提高系统的效率。
回滚没有提交的事务,除了SMON进程外,服务器进程也可能进行回滚没有提交的事务,但该进程只回滚它所用到的加锁的数据行。
除此之外,SMON进程还要执行如下的磁盘空间维护工作:
回收或合并数据文件中相连的空闲区;
释放临时段(在执行sql语句时用作排序的磁盘区),将它们还给临时文件以作为空闲区使用。
进程监督进程
PMON;当某个进程崩溃时,进程监督进程将负责如下清理工作:
回滚用户当前事务;
释放用户添加的表级和行级锁;
释放用户所有的其它资源。
校验(检查)点和校验点进程(CKPT)
Oracle系统为了提高系统的效率和数据库的一致性,引入了称为校验点的事件。该事件是在当DBWR进程把在SGA中所有已经改变了数据库高速缓冲区中的数据(包括提交和没提交的数据)写到数据文件上时产生的。从理论上,校验点和校验点进程可以完全不需要,因为oracle系统利用重做日志数据和SCN号是能够保证数据库的完全恢复的。引入校验点可能是为了提高系统的效率。因为所有到校验点为止的变化的数据都已经写到数据文件中了,在实例恢复时校验点之前的重做日志记录已经不需要了,这样实例恢复速度就加快了。
在校验点事件发生时,oracle要将校验点号码(oracle系统自动产生)写入所有相关的数据文件的文件头中。
数据库管理员要在实例恢复的速度和联机操作之间进行折衷,一般的生产或商业数据库的校验点间隔是20分钟或以上。
归档日志进程(ARCH/ARCN)
可选进程(ARCH/ARCN),进程是可选后台进程里最重要的,因为如果oracle数据库的数据文件丢失或损坏,一般数据库要进行完全恢复,oracle数据库应运行在归档方式。
在oracle中,重做日志文件被划分为若干个组,当一组重做日志的文件被写满后,oracle就开始写下一组重做日志,被称为日志切换。切换是以循环的方式进行的。因此如果只有重做日志文件(Oracle在非归档方式下),当遇到数据文件丢失或损坏,oracle很难保证完全恢复数据库中的数据。在归档方式下,ARCN进程将把切换后的重做日志文件复制到归档日志文件,可以把归档日志文件看成是重做日志文件的备份,当归档日志文件是脱机的,即除了在进行(复制)时,oracle数据库在正常运行时是不会关注归档日志文件的。Oracle系统确保在一组重做日志的归档操作完成之前不会重新使用该组重做日志。Oracle数据库中的归档操作时自动执行的,利用这些归档日志文件,oracle系统就能确保在遇到数据文件丢失或损坏后可以完全恢复数据库中的数据。
查看oracle后台进程
Select pid,username,program from v$process where
background=’1’ order by program;
系统管理员看到数据库的物理结构,其内部有最终用户可理解的逻辑结构。Oracle体系结构确保将逻辑结构从物理结构中抽象出来:编程人员不需要知道任何数据的物理位置,只负责处理逻辑结构;系统管理员不可能了解任何物理结构中的数据,只能看到操作系统文件,而不见其中的内容。只有数据库管理员才有权(且有必要)同时了解物理结构和数据结构。
从物理存储抽象出逻辑存储,是关系数据库管理(RDBMS)标准的一部分。如果程序员可以确定行的物理位置,则代码的成功执行就完全依赖于编写它的环境。数据库管理员可以通过一些工具来确定表(或表中的某一行)的物理位置。
RDMS的标准要求是:数据库不得丢失数据,这意味着,必须备份数据。另外,备份之间对数据所做的任何变更必须以一定的方式进行捕获,以便可以将它们应用于已还原的备份中。
控制文件存储数据库物理结构的详细信息,并且是链接到逻辑结构的起点。当某个实例打开数据库时,它首先要读取控制文件,通过使用控制文件中的信息,实例可以连接到数据库的其余部分及其中的数据字典。
MMON
MMON是数据库的很多自我检视和自我调整功能的支持进程。每次MMON收集一组统计数据(称为快照)时,它还启动ADDM,使用由多名DBA历经多年开发的专家系统来分析数据库活动,它观察两个快照(默认是当前快照和先前的快照),并得出有关性能的观察结果和建议。除了收集快照外,MMON还持续监视数据库的实例,来确定是否应该发出任何警报。
默认方式下,MMON每小时收集一次快照并启动ADDM。
MMNL
MMNL是MMON的辅助进程,有时,MMON的预定活动显得不足。例如,MMON根据调度安排将SGA中收集的统计信息转存到数据库中:默认方式是每1小时一次。如果在MMON预定执行转存前,用于收集此信息的内存缓冲区变满,那么,MMNL将担当起转存数据的职责。
NMAN
MMAN进程支持内存分配的自动管理,DBA仅需为内存使用情况确定一个总体目标,MMAN将观察PGA内存和SGA内存的需要,并根据需要将内存分配给会话和SGA结构,同时将内存分配总量保持在DBA设定的限值范围内。
LREG
数据库实例尝试用数据库侦听器注册它自己。这就允许用户通过侦听器链接数据库。在高级环境中,例如带有几个实例的群集数据库(提供了许多服务),LREG也会用工作负载和性能信息更新侦听器。这样侦听器就可以智能地与合适的实例进行会话。
RECO
分布式事务涉及两个或多个数据库的更新。分布式事务由编程人员设计,并通过数据库链接来实现。
分布式系统体系结构
分布环境下,有多种组合实例与数据库的方式
实时应用集群(RAC),多个实例打开一个数据库
流域(Golden
Gate),多个oracle服务器互相之间传播事务
数据保护,主数据库更新备用数据库,或者是它们同步
逻辑和物理存储结构之间的关系
物理数据库结构
Oracle数据库包括三类文件,以及其它几种数据库之外的文件,必须的文件是控制文件control file,联机重做日志文件(online
redo log file)和数据文件(datafile)。通常所说的外部文件是初始化参数文件,口令文件,归档重做日志文件以及日志和跟踪文件。
控制文件
控制文件虽小,但作用重大。它包含指向数据库其余部分的指针:联机重做日志文件和数据文件的位置,以及更新的归档日志文件的位置。它还存储着维护数据库完整性所需的信息:例如各种重要的序列号和时间戳。例如:如果将恢复管理器工具用于备份,则控制文件也将存储这些备份的详细信息。控制文件的大小通常不过数MB,却起着至关重要的作用。
每个数据库都有一个控制文件,但优秀的DBA总是创建控制文件的多个副本,这样,如果一个副本受损,数据库自身却不受影响。如果丢失了控制文件的所有副本,或许仍可以勉强恢复,但如果安排得当,便不会遇到那种情况。不必考虑使控制文件的多路复用副本保持同步,oracle将做好这一切。维护工作将自动完成,只需要控制要制作多少副本,以及要将副本放于何处。
如果创建数据库时设置的副本数量或位置有误,就可以在后期添加或删除副本,或移动它们,但要注意,执行任何此类工作都需要停机。因此,最好还是一开始就设置好。在确定副本数量时,不存在判断对错的标准。最小数量是1,最大数量是8。
如果任何控制文件副本受损,数据库实例将立即停止。
联机重做日志文件
重做日志(redo
log)按时间顺序存储应用于数据库的一连串的变量向量。其中仅包括重建(或重做)所有已完成工作的最少限度的信息。如果数据文件(或整个数据库)受损,则可以将这些变更向量应用于数据文件备份来重做工作,将它们恢复到发生故障的那一刻前的状态。重做日志包含两类文件:联机重做日志文件(必须的)和归档日志文件(可选的)。
数据文件
在数据库创建阶段,至少必须创建两个数据文件,一个用于SYSTEM表空间(存储数据字典),一个用于SYSAUX表空间(存储数据字典的辅助数据),一个用于UNDO表空间(存储保护事务所需的撤销段)。不过,实际使用的数据库具有更多的数据文件,我们通常在最开始时会创建多个数据文件。
数据文件是数据的存储仓库,较大的数据库可以具有数千个数据文件,其大小只受主操作系统和硬件功能的限制
其他数据库文件
实例参数文件
口令文件
归档重做日志文件
警报日志和跟踪文件
逻辑数据库结构
必须在创建数据库时创建SYSAUX表空间,如果未予指定,将创建默认的SYSAUX表空间。
数据字典
数据字典包含从逻辑上和物理上描述数据库及其内容的元数据。用户定义,安全信息,完整性约束和性能监视信息都是数据字典的一部分。元数据作为一组段存储在SYSTEM和SYSAUX表空间中。
数据字典只能通过数据定义语言命令对其进行维护。
CDB_:还会包括多租户数据库中的PL/SQL包。
DBA_:将显示每个对象的行。
ALL_:将显示您有权访问的对象的行。
USER_:任何带有前缀USER_的视图将描述查询视图的用户拥有的对象。