ORACLE_OCP之oracle体系结构

ORACLE_OCP之oracle体系结构

  • 实例:在内存中产生的实际区域,供oracle数据库实现内存与磁盘和内存与CPU交互的功能,我们称之为实例。

    • 内存结构
      • PGA(程序全局区)
        • 栈区:产生进程以及进程解析所要使用的内存区域(前台进程和后台进程都要使用栈区)

        • UGA(用户全局区):所有的SQL最先到达的地方,所有用户的信息,会话信息,事务(第一阶段 )相关信息,都要在这里保存;

          • 在独占模式的oracle服务器下UGA在PGA中
          • 在共享模式的oracle服务器下UGA在SGA中
        • 私有SQL区:所有的SQL语法、语义以及CBO(基于开销的优化器)参与的SQL解析都是从这里开始

          • SQL持久区:语法语义解析所要使用到的解析区域,因为是和实例一起产生的,并且在实例关闭之前不会消亡,所以称之为SQL持久区。
          • SQL运行区:当语法语义解析完成,并且CBO参与开始后,SQL预备或准运行状态的区域称之为SQL运行区。
        • SQL工作区:SQL基于优化器解析具体发生的地方。

          • HASH区:将SQL语句转化成HASH码的形式,和SGA中的库缓存中存储的已发生过的SQL进行HASH比较。
            • 如果比较到之前发生过的SQL,那么该SQL就不用被重新解析了,只要在库缓存中拿回解析过的SQL的执行计划重新解析即可,我们称之为软解析。
            • 那么如果没有找到之前发生过的SQL,那么该SQL就不能拿到相关的执行计划进行直接解析,而是需要重新发生全部解析,然后执行,并且把解析过后的SQL的HASH码和相关的执行计划树存储到SGA中的库缓存,以备之后发生软解析使用的解析,我们称之为硬解析。

          当某条语句多次发生软解析后,那么PGA中的SERVERPROCESS就会根据相关的规则,将SGA库缓存中的执行计划树以及语句相关的信息,保存到PGA中的私有SQL区中,那么语句就可以在PGA中直接判断是否解析过了,而不用再去SGA的库缓存中进行查询,我们称之为软软解析。

          • 排序区:就是排序语句所要使用的区域(order by、group by、connect by、开窗函数、union)
          • 位图(位图和位图索引)区:当产生表合并、位图映射、表或者列的解析等跟元数据或者数据对象有关系的语句使用的区域,DDL语句、多表查询语句、位图查询语句、物化视图等大量使用该区域。
      • SGA(系统全局区)
        • 共享池:多个关于跟SQL解析和结果集有关的区域组成的,共享池最经典的报错是ORA-04031共享池空间不足,(补充:PGA最经典的报错是OR-04030,PGA空间不足)。
          • 库缓存:存放已经执行过的游标(SQL/PLSQL),并且存放该游标的执行计划树,库缓存有另外一个称呼,被称为公有SQL区。
          • 字典缓存:存储oracle数据库常用的或者解析时需要的数据字典信息。
          • 结果缓存:存放多次发生的SQL产生的结果集指针(指针指向DB_BUFFER_CACHE具体的BUFFER)。
          • 保留区:解析大对象(LOB、BFILE、LONG)所用到的区域。
        • DB_BUFFER_CACHE(数据库高速缓冲区缓存):oracle所有的读写都发生在这里(SELECT、UPDATE、INSERT、DELETE),DB_BUFFER_CACHE也有附属结构,DB_BUFFER_CACHE根据你数据块大小会产生不同的DB_BUFFER_CACHE而不是所有大小的快公用一个DB_BUFFER_CACHE,比如说我们数据库默认的快大小是8K,那么默认的DB_BUFFER_CACHE大小就是以默认的数据块的大小去创建每一个DB_BUFFER_CACHE中的BUFFER单元的,而且每一个DB_BUFFER_CACHE都有n个这样的BUFFER单元组成,如果数据块的大小为4K那么就会产生4K专用的DB_BUFFER_CACHE,那么这个DB_BUFFER_CACHE中BUFFER的大小就是4K,以此类推。
        • LOG_BUFFER:所有的数据库(数据块和UNDO快的改变)的改变都会记录到LOG_BUFFER中,然后再由LOG_BUFFER通过LGWR进程写回到REDO日志中,LOG_BUFFER是一个循环写结构,
          它是REDO产生的基础,LOG_BUFFER里的数据大部分来自于UGA对事物语句的相关判断。
        • LARGE POOL(大池):主要为其他结构提供内存空间,并且RMAN备份的时候需要使用LARGE_POOL。
    • 进程结构
      • 前台进程(SERVER PROCESS)
      • 后台进程
        • DBWR:
          • 数据库写进程,DBWR(Data Base Writer)将数据缓冲区中所有修改过的缓冲块数据写到数据文件中,并使用LRU算法来保持缓冲区中的数据块为最近经常使用的,以减少I/O次数。
          • 将旧数据(前镜像数据)写入UNDO中。
          • 写入完成后,通知CKPT进程,SCN号可以推进了,数据已经落地。
        • LGWR:将SGA LOG_BUFFER里的内容写入到REDO日志中的后台进程
        • CKPT:把相关的内容记录到控制文件中和数据文件头。
    • 数据库结构:
      • 数据文件:oracle数据库中所有的数据都记录在数据文件中(系统的数据和用户数据)。
      • 控制文件:oracle数据库所有的文件物理结构,包括SCN号,包括备份信息都记录在此。
      • 参数文件(SPFILE、PFILE):生成实例时所用到的所有的参数都在这个文件中记录,其中也包括了控制文件的位置。
      • REDO日志(ONLINE REDO):记录数据库所有的改变,REDO的备份就是归档日志(ARCHIVELOG)文件。
      • 密码文件:记录了sys和system用户的密码。
      • 告警文件:位置:/u01/app/oracle/diag/rdbms/orcl/orcl/trace,$ORACLE_BASE/diag/rdbms/orcl/orcl/trace(ORACLE 11G/12C/18C/19C alert日志存放地点),alert日志,记录所有的错误和日志切换包括数据库启停信息。
      • 追踪文件:记录oracle数据库相关的问题。
  • 数据库(database):oracle数据库运行所需要的文件和产生的文件存放地。

  • 游标:从oracle的角度去理解的话是所有可执行的程序,包括SQL、PLSQL(存储过程)、PLSQL函数和触发器包等。

    • 父游标:指的就是sql语句或PLSQL语句本身。
    • 子游标:就是由该语句(父游标)产生的执行计划等。
  • 模拟场景:SPFILE和PFILE的重要性

    • 假设数据库正常运行,当某位同事错误修改参数后,会发生的事情。(scope=spfile)
  • 监听:

    • 每个实例在监听上都有一个自己独有的实例信息区,并且监听有两种模式,第一种为动态监听,第二种为静态监听,默认的是动态监听,动态监听会以一分钟为时间频率间隔去扫描服务器上的实例状态,并根据相关的实例状态在监听上注册,所以我们在非本地连接数据库之前必须保证数据库的监听是启动的,并且相关实例已经注册到了监听上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值