racle数据库系统是一个复杂的软件系统如果不了解其内部的结构原理及关系就不可能设计和编写出高质量的应用软件系统也不可能管理好一个复杂的应用系统为了给以后章节的打好基础本章简要给出 ORACLE /ORACLEi数据库系统结构的描述
§ 术语
数据库块(BLOCK)
ORACLE 数据库中的最小存储和处理单位包含块本身的头信息数据或PL/SQL代码
ORACLE 块的大小是可以在安装时选择自定义安装来指定也可以在CREATE DATABASE创建数据库实例时指定其最小为K最大可达为K
瓶颈(Bottleneck)
指限制系统性能的部件
面向对象的关系数据库
具有关系数据库的全部功能同时又支持面向对象的数据库称作面向对象关系数据库系统Oracle是一种功能完备的关系数据库系统oracle是一种面向对象的关系数据库系统
客户/服务器结构(Client/Server)
有客户机服务器网络三要素的结构客户机(PC机)通过网络与服务器相连和工作
一般的Client/Server结构中的客户机均为胖客户机因为这些客户机需要配置较高的设备如内存硬盘主频CD_ROM等
瘦客户机(Thin Client)
也称作NC(网络计算机)是一种内存配置小(过去指一般只有M现无法定义)无硬盘只有处理心片的处理机
数据在线分析处理(OLAP)
是一种能以快速交互方便的方式洞察数据情况的技术如Oracle ExpressCognos(加拿大)的Power Play Business Objects公司的Business Object 等
多线程(MTS)
一个用户可以同时运行多个程序对数据库进行访问比如Visual C/C++可以提供同时启动多个进程而Visual Basic则不能
数据仓库(Data Warehouse)
支持大量数据信息存储的叫做支持数据仓储或数据仓库当把几个小型数据库集成为一个大型数据库并为一个较广泛的组织服务时如果该数据库存储历史数据提供决策支持提供数据汇总提供只读数据并且实质上充当所有向它提供数据的相关成品数据库的数据接收器那么它通常被叫做数据仓库
实例(Instance)
是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程
对象(Objects)
是实现世界实体的软件表示如表索引视图同义词过程等
数据库文件(Datafile)
Oracle系统中用于存放数据(应用系统数据)的文件(<>中的例子不准确容易误导读者)
控制文件(Control File)
Oracle中存放系统用的一些数据的文件如数据文件的路径及文件名初始化文件路径及 文件名等都存放在控制文件中
日志文件(Logs File)
也叫事务记录文件该文件记录有事物对数据库进行的一切修改操作或事务
DBA(Database administrator数据库管理员)
是管理数据库系统的技术工具或人员在完备的数据库系统中都提供DBA功能
灰数据块(Dirty data block)
存放在内存中的原始数据已被修改而修改后的数据还未写入数据库中
热数据块(Hot data block)
存放着那些经常被修改数据叫热数据块
LRU(Least Recently Used最近最少用)
Oracle系统使用的一种算法对于在内存中但最近又不用的数据块(内存块)叫做LRUOracle会根据那些数据属于LRU而将其移出内存而腾出空间来加载另外的数据
表(Table)
存放专门数据而建立和分配的空间
表空间(Tablespace)
是一个或多个数据文件的集合所有的数据对象都存放在指定的表空间中但主要存放的是表 所以称作表空间
回滚(Rollback)
将用户(或者说事务)改变的数据恢复到上一次所处的状态
恢复信息(Undo Information)
记录用于恢复的信息称作恢复信息回滚就是根据恢复信息内容进行恢复的
§ Oracle数据库结构Oracle数据库结构是Oracle数据库系统的主要部分它是一些可以看得见的软件包括
Oracle 数据字典l 表空间与数据文件l Oracle实例(Instance)
§ Oracle 数据字典Oracle数据库的重要部分是数据字典它存放有Oracle数据库所用的有关信息对用户来说是一组只读的表数据字典内容包括
数据库中所有模式对象的信息如表视图簇及索引等
分配多少空间当前使用了多少空间等
列的缺省值
约束信息的完整性
Oracle用户的名字
用户及角色被授予的权限
用户访问或使用的审计信息
其它产生的数据库信息
数据库数据字典是一组表和视图结构它们存放在SYSTEM表空间中
数据库数据字典不仅是每个数据库的中心而且对每个用户也是非常重要的信息用户可以用SQL语句访问数据库数据字典
§ 表空间与数据文件简单说表空间就是一个或多个数据文件(物理文件)的集合(逻辑文件)一般有下面的表空间
)系统表空间(System tablespace)
是各种不同版本的Oracle必备的部分存放Oracle系统的一些信息一般只有一个SYSTEM表空间
)临时表空间(Temporary tablespace )
由于Oracle工作时经常需要一些临时的磁盘空间这些空间主要用作查询时带有排序(Group byOrder by等)等算法所用当用完后就立即释放对记录在磁盘区的信息不再使用因此叫临时表空间一般安装之后只有一个TEMP临时表空间
)工具表空间(Tools tablespace)
用于保存Oracle数据库工具所需的数据库对象这些工具表空间存放在工作时所用的专用表旧的Oracle版本无此表空间安装之后的工具表空间是Tools
)用户表空间(Users tablespace)
用于存放一些实验例子用的空间当然也可以用于存放应用系统的数据旧版本无Users表空间现在的用户表空间为 USERS
)数据及索引表空间存放数据及索引的表空间Oracle以后都提倡在应用系统中特别是具有大量数据的系统要把数据和索引分开存放在不同的分区中以便提高查询速度在安装后索引表空间可能是INDX数据表空间就是USERS
)回滚段表空间(Rollback Segment)
Oracle数据库系统在运行InsertUpdateDelete时都需要一个磁盘空间来存放恢复信息(Undo Information)以便在进行恢复时能将原来信息读出来安装后的回滚段表空间是RBS表空间数据库管理员也可根据应用的需要建立另外的回滚段表空间
Oracle 以表空间来存储逻辑数据并 以物理数据相连如图
Tablespace Tablespace
数据库被分成一个或多个逻辑部件称作表空间而表空间又被分成称作段(segment)的逻辑部件这些段再细分就叫扩展(extents)
§ Oracle实例Oracle实例(Instance)是由一组后台进程和内存结构组成每个运行的数据库系统都与实例有关所以有时称Oracle实例为数据库操作系统下面是Oracle实例的解释
Oracle 进程Oracle有两种类型的进程 服务器进程和后台进程(server processes and background processes)
服务器进程Oracle 服务器进程是处理用户与实例连接的事务任务是
分析和执行应用所发出的SQL语句
从数据文件读必要的数据到SGA区的共享数据区
返回必要信息给应用
后台进程Oracle系统使用一些附加的进程来处理系统的必须的工作这些进程叫后台进程
数据库写 (DBW 或DBWn)
日志写 (LGWR)
检测点 (CKPT)
系统监视 (SMON)
进程监视 (PMON)
归档 (ARCn)
恢复 (RECO)
锁(LCK)
工作队列 (SNPn)
队列监视 (QMNn)
发布(Dispatcher) (Dnnn)
服务器 (Snnn)
Oracle 的内存结构(SGA)
SGA 结构为
数据高速缓沖区l 重做日志缓沖区l 共享池l 大的共享池(可选)
数据字典缓沖区l 其它数据缓沖区
§ Oracle数据库文件ORACLE 数据库是一个复杂的数据库操作系统由一系列部件组成主要有)初始化参数文件)数据文件)控制文件)日志文件等
§ 初始化参数文件初始化参数文件(initialization parameter file) INITsidORA是 ORALE RDBMS 主要的配置点它是配置参数和数值的集合每一个参数值都控制或修改数据库和实例的某个方面 早期的版本把参数都写在 initsidora 文件中但在ORACLE 之后多数参数已不在该文件中出现需修改这些参数时只能在SQL>下用 SET SESSION 或 SET SYSTEM 来进行 查看系统参数可用例如
SQL>select * from v$parameter
来列出
Oracle初始化参数文件是一个可以编辑的文本文件它是在数据库实例启动时被访问从而得到数据文件日志文件控制文件等的路径此外初始化参数文件还提供实例所用的参数等
初始化参数文件 INITsidORA 参见 附录
§ 数据文件用于存放所有数据库的数据文件Oracle安装过程中自动建立多个必要的数据文件这些数据文件用于存放Oracle系统的基本数据在应用系统开发过程中我们可根据需要另建立一些数据文件
如果数据文件按它们存放的数据类型来分的话可以分为l 用户数据
存放应用系统的数据为用户数据
系统数据
管理用户数据和数据库系统本身的数据如数据字典用户建立的表的名字类型等都记录在系统数据中
§ 控制文件控制文件是由Oracle数据库实例在启动时被访问的内部二进制文件它们所存放的路径由参数文件的control_files=参数来确定
Oracle一般有两个或更多的控制文件每个控制文件记录有相同的信息在数据库运行中如果某个控制文件出错时Oracle会自动使用另外一个控制文件当所有的控制文件都损坏时系统将不能工作
Oracle数据库至少有一个控制文件l 一般数据库系统安装完成后自动创建两个以上控制文件
为了安全一般建议创建多个控制文件l 控制文件可用下面命令查到
select namevalue from v$parameter where name like control_files
§ 重做日志文件重做日志文件是Oracle系统中一个很重要的文件特点是
重做日志是Oracle的日记帐负责记录所有用户对象或系统变更的信息
安装完成后有多个重做日志文件它们是几个分为一组组内的重做日志文件大小要一样
为了使系统性能更好可以在创建多重做日志文件组
重做日志文件可以名下面命令查到
select * from v$logfile
§ 其它支持文件除了上面的三类文件外还有l Sqlnetora文件l Tnsnamesora文件l Listenerora文件等
§ 重做日志和重做日志工作模式重做日志日志文件及重做日工作模式是Oracle系统中很重要的概念管理员要完全理解它们的原理和使用方法下面只给简单的概念有关的管理在另外章节给出
§ 重做日志Oracle所作的一切操作都记录在日志文件中Oracle系统在工作当中并不是每作一条记录的修改就立即存盘(写入数据文件)而是只作修改记录联机重做日志就保存所有这些改变的信息当所有的修改最后写入数据文件时所有的修改仍记录在联机重做日志中这将有利于对这些事务记录进行恢复操作但如果不是联机重做日志则只能恢复部分近期的操作
§ 重做日志工作模式Oracle可以在两种模式之一来工作)ARCHIVELOG模式(可恢复)
Oracle 一般至少有两个日志文件它们轮流交替地被写入所作的一切修改信息当系统设置为可恢复模式Oracle自动将每次即将被覆盖(沖掉)的日志信息先作备份然后再其上记录所修改的信息这样的方式就可以利用备份与恢复工作进行某时期的数据恢复
)NOARCHIVELOG模式(有限的恢复)
缺省情况下为NOARCHIVELOGOracle不保留旧的重做日志信息(可以在原来基础覆盖写入)因此一般情况下不可恢复的
§ 数据块区间和段§ 数据块(data block)
Oracle的数据块也叫Oracle块l Oracle系统在创建表空间时将数据文件格式化成若干个Oracle块
每个Oracle块是Oracle系统处理的最小单位
块的大小在安装系统时确定可以选择自定义安装来设置大小
块的大小一旦确定下来就不能改动
块的大小可以从k至k不等l 块的大小可以用下面命令查到
select namevalue from v$parameter where name like db_block_size
§ 区间(extent)
分配给对象(如表)的任何连续块叫区间l 区间也叫扩展因为当它用完已经分配的区间后再有新的记录插入就必须在分配新的区间(即扩展一些块)l 区间的大小由next 决定l 一旦区间分配给某个对象(表索引及簇)则该区间就不能再分配给其它的对象l 一个对象所用去多少区间可用下命令查到
select segment_nametablespace_namecount(*) from dba_extents having count(*)> group by segment_nametablespace_name
§ 段(segment)
段是指占用数据文件空间的通称或数据库对象使用的空间的集合l 段可以有表段索引段回滚段临时段和高速缓存段等l 段使用同表空间中的若干Oracle块(可以位于不同数据文件中)
例CREATE TABLE abc ( empno number()ename varchar()sal number())
TABLESPACE user_data storage(initial k next k pctincrease )
1) 段被分配=初始区间=k2) 当开始的k用完后就再分配k 此时段=k+k3) 如果所分配的区间又用完后就再分配k …
段(segment)区间(extent)及块的关系(seg_ext_block)
§ Oracle数据库进程一般情况当数据库启动完成后(Instance 启动成功)就至少有六个后台进程在活动这些进程根据数据库的需要而分工不同他们分别是
)数据库写入器(DBWR)
数据库写入器(Database Writer)的任务是将修改后的(在内存)数据块写回数据库文件中在某些操作系统中Oracle可以有两个BDWR进程
)校验点(CKPT)
是一个可选进程在系统运行中当出现查找数据请求时系统从数据库中找出这些数据并存入内存区这样用户就可以对这些内存区数据进行修改等当需要对被修改的数据写回数据文件时就产生重做日志的交替写(Switch)这时就出现校验点系统要把内存中灰数据(修改过)块中的信息写回磁盘的数据文件中此外系统还将重做日志通知控制文件DBA可以改变参数文件中CHECKPOINT_PROCESS TRUE来使能( 使有效或无效)该进程
)日志写入器(LGWR)
用于将SGA区中的日志信息写入日志文件的进程一般是用户所作的修改值先记入日志文件等到一定时才真正将修改结果写回数据文件
)系统监控器(SMON)
系统监控器(System monitor)是在数据库系统启动时执行恢复工作的强制性进程比如在并行服务器模式下(两台服务器共用一磁盘组)SMON可以恢复另一台处于失败的数据库使系统切换到另一台正常的服务器上
)进程监控器(PMON)
进程监控器(Process Monitor)用于终止那些失败的用户释放该用户所占用的资源等
)归档器(ARCH)
可选进程当数据库系统处于归档(ARCHIVELOG)模式时使用
)锁(LCKn)
可选进程当在并行服务器模式可出现多个锁定进程以利于数据库通信
恢复器(RDCO)
分布式数据库(不同地点有不同机器和不同的Oracle系统)模式下使用的可选进程用于数据不一致时作的恢复工作在RECO解决恢复前所作的修改数据的标志均标为可疑
)调度(Dnnn)
可选进程在多线程下使用即对每个在用(D……Dnnn)的通信协议至少创建一个调度进程每个调度进程负责从所联接的用户进程到可用服务器进程的路由请求把响应返回给合适的用户进程
)快照进程(SNPn)
快照进程处理数据库快照的自动刷新并通过 DBMS_JOB 包运行预定的数据库过程 INITsidORA 参数 JOB_QUEUE_PROCESS 设置快照进程数 参数 JOB_QUEUE_INTERVAL 决定快照进程在被唤醒以处理挂起的作业或事务之前休眠的秒数
)并行查询进程(Pnnn)
可根据数据库的活动并行查询选项的设置ORACLE服务器起动或停止查询进程这些进程涉及并行索引的创建表的创建及查询 启动的数量与参数 PARALLEL_MIN_SERVERS指定的数量相同不能超出该参数指定的值
§ Oracle内存结构前面提到过Oracle的数据库实例是一组后台进程和内存结构组成而内存结构是包括
系统全局区(System Global Area)
程序全局区(Program Global Area)
§ 系统全局区Oracle 系统用于存放系统信息的一块存储区域用户进程和Oracle后台进程都可以使用SGA在SGA中含有许多组件(不同的部分)
数据高速缓沖区(Data Buffer Cache)
在数据高速缓沖区中存放着Oracle系统最近使用过的数据块(即用户的高速缓沖区)当把数据写入数据库时它以数据块为单位进行读写当数据高速缓沖区填满时则系统自动去掉一些不常被用访问的数据如果用户要查的数据不在数据高速缓沖区时Oracle自动从磁盘中去读取数据高速缓沖区包括三个类型的区
) 髒的区(Dirty Buffers)包含有已经改变过并需要写回数据文件的数据块
) 自由区(Free Buffers)没有包含任何数据并可以再写入的区Oracle可以从数据文件读数据块该区
) 保留区(Pinned Buffers)此区包含有正在处理的或者明确保留用作将来用的区
Oraclei以后将缓沖池分为三个区(使用多个缓沖池特性时)) KEEP 缓沖池(KEEP buffer pool)在内存中保留数据块它们不会被从内存中挤掉) RECYCLE缓沖池从不需要的内存将数据移掉) DEFAULT缓沖池包含有被分配的块
重做日志缓沖区(Rado Log Buffer)
任何事务(Transaction)在记录到重做日志(恢复工作需要使用联机重做日志)之前都必须首先放到重做日志缓沖区(Redo Log Buffer)中然后由日志写入进程(LGWR)定期将此缓沖区的内容写入重做日志中
共享池(Shared Pool)
共享池是SGA保留的区用于存储如SQLPL/SQL存储过程及包数据字典锁字符集信息安全属性等共享池包含有) 库高速缓存(Library Cache)) 字典高速缓沖区(Dictionary Cache )
库高速缓存(Library Cache)
该区包含有) 共享SQL区(Shared Pool Area)) 私有SQL区(Private SQL Area)) PL/SQL存储过程及包(PL/SQL Procedure and Package)) 控制结构(Control Structure)
也就是说该区存放有经过语法分析并且正确的SQL语句并随时都准备被执行
字典高速缓沖区(Data Dictionary Cache)
用于存放Oracle系统管理自身需要的所有信息这些信息是登录到Oracle的用户名这些用户有那些数据库对象以及这些数据库对象的位置等
SVRMGR> Show SGA Total System Global Area bytes Fixed Size bytes Variable Size bytes Database Buffer bytes Redo Buffer bytes
后四项相加等于前一项
也可以使用 select * from v$SGA 查询当前实例的SGA
大的池(Large Pool)
在SGA中大池是可选的缓沖区它可以根据需要有管理权进行配置它可以提供一个大的区以供象数据库的备份与恢复等操作
)程序全局区(PGA)
PGA是Oracle使用的内存区域该区同一时间只能被一单个进程存放数据和控制用于存放会话变量及内部数组等
SGA Oracle内存结构(SGA图)
§ 程序全局区PGA是Oracle使用的内存区域该区同一时间只能被一单个进程存放数据和控制用于存放会话变量及内部数组等
§ Oracle实例一个Oracle 实例(Instance) 是由SGA后台进程以及数据文件组成每个数据库有自己的SGA和独立的Oracle进程集如图所示
Oracle 实例和后台进程(instance图)
在分布情况下为使不同的数据库系统的名字不致混淆Oracle使用了一个SID(System Identifer)来标识每个Oracle Server的名字在UNIX环境中以变量Oracle_Sid来区分
§ 多线程服务器 (MTS)
Oracle多线程服务器(Multithreader Server )允许对数据库进行多个连接以充分共享内存和资源这使得可以用较少的内存来支持较多的用户
连接到Oracle数据库的进程都需要占用一定的内存空间这样如果有过多的进程连接到Oracle则出现了一个性能瓶颈
Oracle可以允许一万个以上用户同时连接到Oracle但并不是所有的用户都使用MTS目前的一些GL工具并不支持MTS象VBPB等不支持MTS象VC/C++可以支持MTS Oracle多线程服务器有自己的连接池(即共享服务器进程)由于用户共享开放连接这比原来的专用方法快的多(消除瓶颈)
多线程对于一些专用的应用系统来说是非常合适的比如订单登记系统顾客提交订单录入员该订单的数据另外的录入员在与顾客交涉并不都在录入数据(专用服务器进程闲着)单这些终端被迫与系统连着占据了其他用户的资源
多线程服务器则消除这些缺点多线程服务器只维护一个连接池当某个终端需和系统对话则给其分配一个连接即可不需要则可以去掉这样系统的资源被多个用户平摊
改变参数文件中的相关参数来达到使系统成为多线程服务器配置(重新启动即可有效)另外数据库实例必须提供用户数目与所放置的一样才行
§ Oracle事务处理流程银行取款业务处理流程
发出查询余款的SQL语句如Select account_balance From banktable Where account_number= And account_type=SAVINGS
SQL语句通过SGA得到服务器进程
服务器进程检查共享池中有无该条语句无该条语句则将放置共享池中并准备运行
执行SQL语句把存放有余款的数据块从数据文件中读到SGA的数据高速缓沖区
显示结果比如余款为$
取款$SQL语句为Update Bank_table set account_balanct= Where account_number= And account_type=SAVINGS
客户进程通过SGA把SQL语句传给服务器进程l 服务器进程查找有无该条语句有执行(l 分析SQL语句并存入共享池l 执行SQL语句
要处理的数据在数据高速缓沖区吗?是转
从数据文件中读数据块到数据高速缓沖区
在回滚段中记录原来的数值($)
在重做日志中生成该事务的一个拷贝
将数据高速缓沖区中的余额改为$
银行柜员机通过SGA发出工作完成信号(提交)
在重做日志中记录已完成事务
清除回滚段中的恢复信息(Undo Information)
顾客取钱完成
§ ORACLE系统的SYS和SYSTEM模式SYS和SYSTEM 是每个ORACLE 数据库系统缺省安装的两个帐户SYS 是所有内部数据库表结构过程包等拥有者此外它还拥有 V$ 和数据字典视图并创建所有封装的数据库角色(DBACONNECTRESOURCE) Sys是一个唯一能访问特定内部数据字典的用户 System 也是在安装ORACLE 时创建的用户用于 DBA 任务的管理
SYS 安装后的缺省口令为 change_on_install SYSTEM 缺省口令为 manager 为了安全可在安装完成后 用 ALTER USER sys IDENTIFIED BY password 命令修改这两个特权帐户的口令
§ ORACLE系统跟蹤文件所有ORACLE 数据库都至少有一个文件用于记录系统信息错误及主要事件这个文件叫做ALERTsidlog(这里的sid 为 oracle 的系统标识)存储位置由INITsidORA 文件的 BACKGROUND_DUMP_DEST 参数给出
后台进程和用户进程都可以建立各自的跟蹤文件后台进程跟蹤文件位置由BACKGROUND_DUMP_DEST 参数给出 而用户跟蹤文件位置由 USER_DUMP_DEST 参数给出 如参数文件 initoraora 中给出
# define directories to store trace and alert files background_dump_dest=d\oracle\admin\ora\bdump user_dump_dest=d\oracle\admin\ora\udump后台跟蹤文件被命名为 sidPROCTRC
§ ORACLE系统数据字典数据字典(data dictionary)是存储在数据库中的所有对象信息的知识库ORACLE数据库系统使用数据字典获取对象信息和安全信息而用户和DBA用它来查阅数据库信息数据字典保存数据对象和段的信息如表视图索引包过程以及用户权限角色审计等的信息数据字典是只读对象不允许任何人对其进行修改
§ 其它数据对象ORACLE 除前面给出的数据对象外还有包括视图序列同义词触发器数据库链及程序包过程和函数下面是必要介绍
§ 视图视图是存储在数据库中的查询的SQL 语句它主要出于两种主要原因安全原因 视图可以隐藏一些数据如社会保险基金表可以用视图只显示姓名地址而不显示社会保险号和工资数等另一原因是可使复杂的查询易于理解和使用
§ 序列序列是用于产生唯一数码的数据库对象序列创建时带有 初始值增量值最大值等最大可达 位整数
§ 触发器触发器(trigger)是个特殊的存储过程它的执行不是由程序调用也不是手工启动而是由个事件来触发比如当对一个表进行操作( insertdelete update)时就会激活它执行触发器经常用于加强数据的完整性约束和业务规则等 触发器可以从 DBA_TRIGGERS USER_TRIGGERS 数据字典中查到
§ 同义词同义词(synonym)是指向其它数据库表的数据库指针同义词有两种类型私有(private)和公共(public)私有的同义词是在指定的模式中创建并且只创建者使用的模式访问公共同义词是由public 指定的模式访问所有数据库模式(用户)都可以访问它
§ 数据库链数据库链( database link )是与远程数据库连接的存储定义 它们用于查询分布数据库环境的远程者 由于存储在 DBA_DB_LINKS 数据字典中所以可以把它们看作一种数据库对象类型