1. Oracle数据库中的数据库与实例
Oracle数据库包括一个数据库和至少一个实例(通常是指只有一个实例),数据库和实例是紧密相关的,Oracle数据库这个术语有时即指实例,也指数据库。这个术语严格的意义具有以下的含义:
数据库
数据库是一组文件,位于磁盘,用于存储数据,这些文件可以独立于数据库实例存在。
数据库实例
实例包含系统全局区(SGA)的共享内存区和一组后台进程。实例可以独立于数据库文件而存在。
2. Oracle数据库的工作原理
(1)在Oracle数据库上启动Oracle实例。
(2)用户进程通过监听与服务器建立连接。
(3)当应用程序发出SQL语句时,在PGA中打开游标
(4)语法检查
对SQL语句进行语法检查,Oracle数据库必须检查SQL语句的语法有效性。违法了标准格 式的 SQL语法规则的语句无法通过检查。例如:把FROM的关键字错误的拼写成为FORM;
(5)语义检查
对SQL语句进行语义检查,语句的语义即它的含义。因此,语义检查确定一条语句是否是 有意义的,语义检查是在共享全局区(SGA)的Shared pool的Data Dictinary Cache 中对照数据字典中检查表、索引、视图和用户的权限。
(6)解析
数据库为SQL语句生成哈希值,在Library Cache中存放着SQL的执行计划,然后会在Shared pool中的Libray Cache 的共享SQL区中查找是否已有执行计划。如果没有,就要进行硬解析,在硬解析期间,要对SQL进行查询转化,生成执行效率更高的SQL语句。数据库多次访问库缓存和数据字典缓存以检查数据字典。要进行大量的磁盘IO操作,同时闩锁争用会增加语句的执行时间,并降低并发性。如果共享SQL中存储着要执行语句的执行计划,那么就要进行软解析。
(7)取结果
现在有了执行计划,从DB buffer cache中取数据,
1)当一个Server进程需要读数据到Buffer Cache 中时,首先必须判断该数据Buffer Cache中是否存在(图中的①),如果存在且可用,则获取该数据,同时根据LRU算法增进其访问的计数;如果DB buffer cache还没有缓存该数据,则需要从数据文件上进行读取;
2)在读取数据之前,Server 进程需要扫描LRU List 寻找Free的Buffer,扫描过程中 Server进程会发现的所有已经被修改过的Buffer注册到LRUW List上(图中②)这些Dirty Buffer随后可以被写到数据文件
3)如果LRUW Queue超过阈值,Server进程就会通知DBWn去写出去脏数据(图中的③)这是出发DBWn的一个条件,这个阈值是25%,也就是Dirty Queue 超过25%满就会触发的写操作;
如果Server j进程扫描LRU超过40%还没有找到足够多的额Free Buffer就会停止搜索,通知DBWn 执行写出,这进程处于free buffer wait 等待;
4)找到足够的Buffer之后,Server进程就可以将Buffer从数据文件读入Buffer Cache(图中的④);
5)如果读取的Block不满足读一致性需求,则Server进程需要通过当前的Block版本和回滚段构造前镜像返回给用户。
(8)执行UPDATE语句时
当执行的语句是update的时候,Server进程把数据从磁盘读到Buffer cache:要开始这个事务,首先要获得一个UNDO数据块来存放数据的前镜像,UNDO的数据块被读入Buffer Cache中;在修改数据之前数据的前镜像被保存在UNDO中,对于UNDO块的修改会生成一条Redo记录;UNDO记录生成后ORACLE就可以修改数据了。数据修改的时候同时也会生成一条Redo记录。
(9)重做缓冲区
当数据发生变化的时候会生成重做日志,比如执行UPDATA,DELETE等语句的时候都会生成redo log,当日志缓冲区的日志数据达到一定数量时,由后台进程LGWR将日志数据写入日志文件中。进行LGWR的条件有:(1)无论何时,只要提交时,(2)重做缓冲区三分之一满,或者包含了1MB的缓存重做日志数据,每3秒一次(3)DBWR之前。都会使缓冲区的日志数据写入日志文件的。
(10)归档
在Oracle数据库中日志文件是采用循环复写的方式。一般日志文件有三组,先往第一组写,当第一组写满,再往第二组写,发生日志切换。第一组的日志数据就会归档,保存在归档文件中。以便以后的介质恢复的时候使用。
(11)后台进程
DBWR 数据写入进程
1)、将修改后的缓冲区数据写入数据文件中。
2)、触发的条件:检查点事件,四分之一满,表空间离线,备份恢复等。
LGWR 日志写入进程
1)、负责将日志缓冲区中的日志数据写入日志文件。
2)、系统有多个日志文件,该进程以循环的方式将数据写入文件。
3), 触发的条件无论何时,只要提交时,1M,三分之一满,3秒,DBWR之前
CKPT检查点进程
1)、检查点的存在就是为了缩短数据库恢复的时间,当通常检查点发生的时候,会通知DBWn进程,把脏块,也就是在此Checkpoint SCN之前的脏数据,从Buffer Cache写入数据文件,当写完之后,CKPT进程则会相应的更新控制文件头和数据文件头,记录检查点信息,标示更改。
2)、检查点包括两种:完全检查点、增量检查点。
3)、完全检查点被触发:
①用户发出alter system checkpoint;
②一致性关闭数据库。
4)、增量检查点触发情况:
①每隔三秒
②日志切换
PMON 进程监控进程,监控用户进程是否正常。
1)、清理出现故障的进程。
2)、释放所有当前挂起的锁定。
3)、释放故障进程使用的资源。
SMON 系统监控进程,实时监控整个oracle状况。
1)、在实例失败之后,重新打开数据库时自动恢复实例。
2)、整理数据文件的自由空间。
3)、释放不再使用的临时段。
(11)undo段
当对数据库进行修改的时候,数据库会生成undo信息,以便回到更改前的状态,undo段中存放的是数据修改的前镜像,因为有undo段我们可以进行“Rollback”和闪回查询等操作,同时也实现了写不阻塞读,可以实多版本一致性。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29435844/viewspace-1101179/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29435844/viewspace-1101179/