天天看点

Oracle 体系结构详解

到目前为止,接触Oracle已经将近2年了,但是总也没有好好的总结过这些东西,今天闲下来了,从头到尾捋一捋,写一写,如果能真正写下来,那么这个印象可就更加深刻了。。。

学习一门技能,你首先应该搞清楚它的架构,了解到它的架构,懂得它的组成、工作过程、原理,你学习起来才能更简单些。如下图所示就是Oracle体系架构

Oracle 体系结构详解

学习Oracle数据库,你首先应该清楚它的两个比较重要的概念:

  1. 实例(Instance):是由内存结构和后台进程组成的,每次实例启动时,会分配一个称为SGA(System Global Area)的共享内存区域,启动后台进程。
  2. 数据库:数据库是由物理结构和逻辑结构构成。物理结构是:比较实际的东西,看得见的,如:数据文件、控制文件、日志文件、参数文件和归档日志文件等,逻辑结构是:描述Oracle内部组织和管理数据的方式,说起来可能你感觉你比较抽象,哈哈哈,但是你映射到表空间、数据段、数据区、数据块等,差不多就能理解了~

实例和数据库,这两个是如何相辅相成的呢?

实例是用来管理和控制数据库的,而数据库是用来存储数据的,这些数据就是为实例准备的,一个数据库可以被一个或多个实例打开,但是一个实例的运行时期只能打开一个数据库。我们常见的单机数据库,就是一个实例对应一个数据库,而高性能RAC,就是多个实例,一个库,还有容灾环境DG,是多个数据库,多个实例。

下面咱们详解上图SGA的各个组件:

  1. 系统全局区(SGA):SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享,当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
  2. 库缓存(Library cache):库缓存主要是存储刚刚执行过的SQL和PL/SQL语句(如存储过程、函数、包、触发器)所对应的执行计划、解析树、Pcode、Mcode等对象,当同样的SQL和PL/SQL语句再次被执行时,就可以利用已经缓存在库缓存中的那些相关对象而无须从剃头再次开始解析,这样就提高了SQL和PL/SQL语句在重复执行的执行效率,减少了硬解析
  3. 数据字典缓冲区:数据字典缓存区缓存数据库对象的信息,包括用户账号数据,数据文件名、段名、表说明和权限,当数据库需要这些信息时,将读取数据字典表并将返回的数据存储在字典缓存区的SGA中
  4. database buffer cache:数据库缓冲区用来存储从数据库中读取数据段的数据块信息,大小由DB_LOCK_BUFFERS参数决定。通常数据库缓冲区的大小是数据库大小的1%~2%,oralce使用LRU算法来管理可用空间,当存储区需要自由空间时,将最近少使用的数据块移除,将最频繁使用的数据保存在存储区,提高数据库的命令率。
  5. redo log buffer cache:重做日志缓冲区,缓存着数据库进行的修改操作,它们将写到联机重做日志文件中,以便在数据库恢复过程中用于向前滚动,在写入联机重做日志文件之前,事物首先被记录在重做日志缓冲区中,大小是由参数文件的LOG_BUFFER决定的
  6. JAVA POOL:JAVA池为JAVA命令提供语法分析,JAVA池的大小是参数文件中JAVA_POOL_SIZE设置的
  7. Large Pool:大池是个可选的内存区,如果使用线程服务器选项或频繁执行备份/恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持SQL大型命令。利用大池,就可以防止这些SQL大型命令把条目重写入SQL共享池中,从而减少再装入到库缓存区中的语句数量。大池的大小(以字节为单位)通过init.ora文件的LARGE_POOL_SIZE参数设置 

2、后台进程

数据库的物理结构和内存结构之间的交互都是要通过后台进程来完成的,接着,咱们再了解一下这几大后台进程:

  1. DBWR:Database Write Process 数据库写进程,该进程是将数据缓冲区的数据写入到数据文件。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。触发DBWR进程的条件:
    1. 每3秒会自动唤醒一次
    2. 系统中没有多余的闲置缓冲区来存放数据
    3. CKPT检查点进程触发DBWR   ps但是这个的条件 首先LGWR日志写进程把日志缓冲区的日志写入到文件中后,才会进行在将数据缓冲区的编辑过的数据写入磁盘,都是有先后顺序的
  2. LGWR日志写进程:把日志缓冲区的日志写入到联机日志文件中,释放日志缓冲区空间,触发条件 :
    1. 用户发出commit命令,即提交事务
    2. 每三秒定时唤醒
    3. 日志缓冲区的缓冲大小超过1/3,或者日志数据量超过1M
    4. 手动进行了联机日志切换
    5. DBWR触发,因为DBWR将脏数据写入磁盘前会先检查日志缓冲区的日志是否写入到联机日志文件中,没有没有就会通知LGWR进程
  3. CKPT  --Checkpoint Process 检查点进程:检查点进程主要是维护数据库一致性状态的,负责更新控制文件和数据文件的头文件的检查点信息,触发DBWn写脏数据到磁盘,触发条件:日志切换会触发检查点  
  4. PMON:Process Monitor Process 进程监控进程,简单来说就是发现用户进程异常终止,则进行清理buffer cache,释放资源,例如:重置事务表的状态,释放锁,删除进程ID等  。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。pmon会调查监听是否启动,若是启动会传递相关参数给listener,若是没有,pmon会定时尝试连接listener
  5. SMON:System Monitor Process 系统监控进程,该进程实例启动时,执行实例恢复,还负责清理不再使用的临时段。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

补充:

  1. ARCH进程:  该归档进程将已写满的在线日志文件拷贝到指定的存储设备。当数据库运行在归档模式下,归档进程负责在日志切换后将已经写满的重做日志文件复制到归档目的地。
  2. MMON进程:管理性监视器(Manageability Monitor),MMON主要用于AWR,ADDM。MMON会从SGA将统计结果写到系统表中。
  3. RECO进程:负责在分布式数据库环境中自动恢复那些失败的分布式事务,保证分布式事务的一致性,在分布式事务中,要么同时commit,要么同时rollback;

以上进程也看完了,再次说明一下DBWR,LGWR,CKPT吧

日志切换会触发检查点,而切换是很频繁的,后台默认的看不见的,都会有很多检查点,检查点和检查点之间会形成队列,而DBWR进程每次把脏数据写入磁盘上时,就从检查点队列中寻找,如果已经写入磁盘,则就把相应的检查点队列给删除,下次寻找再继续寻找着,而检查点队列也是一直在生成着,这样防止DBWR写数据的时候,都知道从哪开始写,就不会出现漏的问题。

Oracle 体系结构详解