Architecture Intro
Overview
• Oracle数据库的架构可以分为两种类型: 单
  实例架构和分布式架构(RAC), 后者不是我们
  要讨论的内容;
• Oracle单实例架构包含两个方面: 实例架构
  (instance arch)和存储架构(storage arch), 前
  者又可以分为内存和进程两个方面. 这一章
  将依次讨论这些内容.
Instance vs. Database
• 通常我们在谈论oracle数据库时指的是数据库
  服务器(oracle database server), 它由两个部分
  组成: 实例(instance) + 数据库(database);
• 实例
  实例指的是oracle运行时的内存和相关的操作
  系统进程, 在数据库启动时会分配相应的内存
  并启动相关的后台进程.
• 数据库
  数据库指的是相关的存储文件, 包括参数文件,
  密码文件, 数据文件等.
Single-instance Architecture
• 单实例是最常见的一种情况, 数据库实例运行在某台server
  上, 并打开存储在本地磁盘的数据库. 客户端与服务端的交
  互则可以总结为:
 – 一个客户端用户进程与一个服务端进程交互;
 – 服务端进程与实例进行交互;
 – 实例与数据库进行交互. 如下:
Instance Memory Structure
                 - SGA
• 实例内存由被称为系统全局区(SGA,System
  Global Area)的系统共享内存(shared memory)组成,
  SGA包括以下必须的以及可选的组成部分, 必须:
  – 数据块缓冲区(database buffer cache)
  – 日志缓冲(log buffer)
  – 共享池(shared pool)
  可选:
  – 大池(large pool)
  – Java池(java pool)
  – 流池(stream pool)
Instance Memory Structure
              - PGA
• 当服务端接收到客户端发起的请求并成功
  建立连接时, 一个新的会话(session)就会产
  生, 该会话代表了此次客户端进程与服务端
  进程的交互. 实例会为每一个会话分配专属
  的内存空间, 被称为程序全局区(PGA, program
  global area). 与SGA不同的是, PGA是每一个
  session私有的, 不会共享;
• PGA通常用于SQL运算操作, 比如排序, 分组,
  连接(join)等.
Instance Memory Structure
       - Database Buffer Cache
• 数据库在执行SQL语句时, 需要对磁盘数据文件
  进行读取或者写入操作, 而磁盘操作通常是代
  价昂贵的, 因此oracle引入了数据块缓冲将数据
  块(data block)加载到内存进行相关的操作, 并
  在适时的情况下读写磁盘;
• 数据块缓冲区的大小对于数据库的整体性能至
  关重要, 缓冲区太小会导致频繁的读写磁盘, 太
  大以致不被用到的数据块也被缓存. 使用数据
  块命中率(data buffer hit ratio)来衡量缓冲区设
  置的合理性, 通常情况下该数值要达到99%以上.
Instance Memory Structure
         - Redo Log Buffer
• 重做日志缓冲对于oracle保持数据的完整性至关重
  要, oracle在执行DML语句时会生成重做日志(redo
  log), 并写入到该缓冲区中. 与其它的内存结构不同
  的是, 该缓冲区设置通常比较小(8M), 后台进程LGWR
  用于将缓冲区的内容写入到重做日志文件, 该进程
  会在下面的情况中被调用:
 – DBWn进程被调用
 – 1/3的缓冲区被使用
 – 执行commit语句
• 重做日志缓冲的大小设置在数据库启动参数
  log_buffer中, 可以修改该参数值, 但是不能小于默认
  值. 通常情况下设置过大的log_buffer不是一个好的
  做法, 因为在执行commit语句时会实时写重做日志
  文件, 会消耗更多的时间.
Instance Memory Structure
              - Shared Pool
• 共享池是SGA中最为复杂的内存结构, 主要由以下部分组成:
  – 库缓存(library cache)
     最常见的是用于缓存解析后的sql语句
  – 数据字典缓存(data dictionary cache)
     用于缓存最近使用过的数据库对象的数据字典信
     息, 比如表/索引等的定义
  – PL/SQL存储过程和函数缓冲
     缓存PLSQL存储过程和函数的定义
  – SQL查询和PL/SQL函数结果缓冲
     这是11g版本中引入的一个新的特性, 通过缓存sql查询和
     plsql函数的执行结果可以避免重复执行. 系统自身会检查数
     据是否已经过期. 默认情况下此特性被关闭.
• 共享池的大小对于数据库的性能至关重要, 理想情况下共享池应该能
  够存储那些经常被执行sql的解析结果和数据字典定义等信息, 但不应
  该保存那些极少被使用的数据. 共享池在数据库启动时被分配, 可以运
  行时动态改变共享池的大小(自9i).
Instance Memory Structure
             - Large Pool
• 大池是SGA中可选的内存结构, 在以下情况
  会使用到:
 – 共享服务器(shared server)
 – 并行执行服务器(parallel execution server)
 – RMAN备份数据到磁带设备
 如果在执行这些操作时, 大池没有被创建那
 么则会选择使用共享池中的内存.
Instance Memory Structure
       - Java & Streams Pool
• 当应用使用到java存储过程时, java池被用作
  堆栈(heap space)空间用于存储java类对象.
  需要注意的是, java存储过程与plsql存储过
  程一样被缓存在共享池中.
• 流池是Oracle Streams使用到的内存结构, 暂
  时不予讨论.
Instance Process Structure
• oracle数据库在启动时会启动相应的后台进程,
  这些进程有的是由来已久的比如SMON, PMON,
  DBWn, LGWR, CHKPT等; 有的是随着新的版本引
  入的, 比如MMON, MMAN等; 有的是一些非关
  键的进程, 比如ARCn, RECO等; 另外一些进程需
  要启用相关的数据库选项; 最后的一组进程则
  与数据库集群和高级流相关;
• 这些进程在不同的系统平台上表现为不同的形
  式, 在unix/linux平台上针对每个进程会启动相
  应的操作系统进程, 而在windows平台则实现为
  oracle.exe进程的子线程.
Instance Process Structure
             - Overview
• 这是一张关于SGA与实例进程之间的交互图,
  其中server processes表示的是会话进程, 用
  于处理客户端与服务端的连接; LGWR用于
  写重做日志文件, DBWn写数据文件; ARCn进
  程用于归档重
  做日志文件.
Instance Process Structure
         - SMON & PMON
• SMON, the system monitor
  系统监控进程. 在数据库启动时, SMON负责挂
  载和打开数据库; 在数据库成功启动之后,
  SMON则负责一些系统的监控任务, 比如合并数
  据文件中的空间.
• PMON, the process monitor
  PMON用于监控服务端会话进程. 当客户端发起
  一个会话连接时, 服务端会启动相应的会话进
  程. 如果该会话正常结束(比如, 用户退出登录),
  那么该进程将会被正常的终止; 否则PMON将会
  清理这些进程, 这包括回滚未完成的事务和释
  放会话的PGA内存.
Instance Process Structure
                  - DBWn
• DBWn, the database writer
  会话进程修改的是数据块缓冲区, 不会直接写磁盘数据文件, 负
  责这份工作的是DBWn进程, 可以有多个该进程同时运行分别是
  DBW0, DBW1...
  DBWn进程负责将缓冲区的脏数据块写入到数据文件, 该进程遵
  循的一个原则是: 尽可能少被调用, 每次调用尽可能少写. DBWn
  只会写缓冲区中最近没有被使用到的脏数据块, 这样只会导致最
  少量的磁盘IO操作. 以下情况会触发DBWn动作:
 –   数据块缓冲空间被使用完
 –   脏数据块过多
 –   每隔3秒DBWn会被调用
 –   调用checkpoint操作
     在上面的3种情况下只会导致尽量少的脏数据块被写入磁盘, checkpoint
     则会对所有的脏数据块执行写入操作, 这样带来的一个后果是磁盘IO
     大幅度上升, 数据库性能急剧下降. 数据块在关闭时会执行该动作, 可
     以通过如下语句手动执行(没有必要请不要执行):
     alter system checkpoint
Instance Process Structure
               - LGWR
• LGWR, the Log Writer
  LGWR进程负责将重做日志缓冲区的内容写入到在线
  重做日志文件(online redo log files)中, 每次写操作称
  为flush.
• 当一个会话执行某些DML语句(INSERT, UPDATE, etc)
  时, 会话进程首先会向重做日志缓冲区写修改队列
  (change vector), 然后才修改数据缓冲区的数据块.
  LGWR进程会在下面的情况中被调用:
  – DBWn进程被调用
  – 1/3的缓冲区被使用
  – 执行commit语句
注意: 有时候会提到LGWR进程每3秒被调用一次,
实际上这是由DBWn进程决定的, 因为DBWn进程每个3
秒被调用, 而DBWn会调用LGWR.
Instance Process Structure
                - CKPT
• CKPT, the Checkpoint Process
  检查点操作通过写入所有的脏数据块从而确保当前数据
  库的状态是一致的, CKPT会更新控制文件记录检查点位
  置(checkpoint position), 该位置被用于oracle启动时的灾
  难恢复操作(比如数据库突然崩溃). 频繁的CKPT操作可以
  减少数据库恢复的时间, 但是会对运行时性能产生影响.
• CKPT, full vs. partial
  检查点操作分为full 和 partial类型, 与前者不同的是
  partial类型的操作只会写入某个数据文件或者表空间的
  脏数据块, 而不是针对整个数据库的.
• CKPT, 8 vs. 8i and onward
  CKPT自8i版本开始有比较大的变化, 在V8版本中CKPT以
  full类型被定时执行; 自8i版本开始, CKPT使用partial类型
  以增量的方式执行, 这样带来的好处是数据库的整体性
  能表现更为平滑. 只有在用户要求执行或者数据库关闭
  时, full类型的CKPT操作才会被调用.
Instance Process Structure
              - MMON
• MMON, the Manageability Monitor
  可管理性监控器, 该进程随着10g引入, 用于
  数据库的自我监控和调优功能. MMON按照
  如下的步骤工作(默认一小时运行一次):
 – 读取实例收集的数据库活动和性能数据, 并建立
   快照(snapshot);
 – 启动ADDM(Automatic Database Diagnostic
   Monitor)工具, 对比当前快照和之前的快照并进
   行分析;
 – 生成相应的报告和警告信息.
Instance Process Structure
              - MMAN
• MMAN, the Memory Manager
  内存管理进程, MMAN是随着10g版本引入的,
  该进程用于自动管理实例内存(SGA & PGA)的分配.
• prior 9i
  在9i之前无论SGA还是PGA均是静态的, 不可以在实
  例启动之后进行重新的调整.
• 9i & 10g
  在9i版本中SGA/PGA可以被手工调整大小, 10g中引
  入了MMAN实现了SGA内存的自动管理.
• 11g
  11g在所有之前的版本上更进一步, DBA需要做的是
  设置一个总的内存共SGA和PGA使用, MMAN会监控
  SGA/PGA的内存需要进行自动的管理.
Instance Process Structure
              - ARCn
• ARCn, the Archiver
  归档日志进程, 这是一个可选的进程, 但是对于大多
  数企业应用而言此进程是必须的, 在数据库灾难发
  生的情况下, 如果没有开启该进程可能会导致数据
  无法被正常恢复.
• How it works?
  LGWR负责写在线重做日志文件(比较小), 在这些文
  件被写满之后LGWR则会覆盖之前的内容, 因此这些
  日志文件只能记录数据库近期的活动. ARCn进程用
  于在这些日志文件被重写之前对它们进行归档操作,
  以记录数据库所有的历史活动.
Instance Process Structure
                  - RECO
• RECO, the Recoverer
  RECO进程负责分布式事务的回滚操作, 分布式事务
  一个常见的情况就是使用database link, 比如:
  update orders@mirror set order_status=complete
   where customer_id=1000;
 这里mirror代表的是一个指向远程数据库的link, 对于
 这种事务的提交称之为二部提交(2PC, 2-phase
 commit). 2PC涉及到本地数据库和远程数据库的提交
 操作以及它们之间的同步, 如果均提交成功那么2PC
 操作成功, 如果出现了失败那么RECO进程负责分布
 式事务的回滚.
Instance Process Structure
             - Other Processes
• CJQn & Jnnn
  这两个进程用于管理数据库定时任务, CJQn进程监控任务队列,
  并将需要执行的任务发送给Jnnn进程执行;
• D000 & Snnn
  分派进程, 在启用共享服务器的情况下, 该进程将SQL语句发送给
  Snnn进程执行.
• DBRM
  数据库资源管理进程, 负责资源计划和其它的一些资源管理任务.
• DIA0
  此进程负责检测和解决数据库死锁(deadlock).
• DIAG
  可诊断性进程, 负责诊断信息的转储和执行oradebug命令, 该命
  令用于检测实例中的问题.
• FBDA
  闪回数据归档进程(flashback data archiver process), 负责对数据
  库表的数据进行归档, 以支持闪回查询(flashback query).
Instance Process Structure
          - Other Processes
• PSP0
  PSP0(Process Spawner)用于创建和管理其他的
  oracle进程.
• QMNC, Q000
  Oracle队列管理进程.
• SHAD
  支持用户会话的辅助进程.
• SMCO, W000
  SMCO, 空间管理调度进程. W000是它的从属进
  程.
Database Storage Structure
            - Overview
• Oracle数据库的存储结构可以划分为物理存
  储和逻辑存储两个方面, 物理存储指的是
  oracle在磁盘或者其它设备上的文件; 逻辑
  存储则是oracle对物理存储的抽象, oracle使
  用表空间(tablespace), 段(segment), 扩展
  (extent), 数据块(data block)来表示数据库的
  逻辑存储结构. 关于oracle存储会在以后的
  章节作详细的介绍.
• 接下来会首先介绍与物理存储相关的数据
  库文件, 之后介绍逻辑存储.
Database Physical Storage
             - Overview
• oracle数据库由三种必须的文件类型和其它
  的外部文件(严格上来说这些文件不是必须
  的)组成, 必须的文件包括:
  • 控制文件(controlfile)
  • 在线重做日志文件(online redo log file)
  • 数据文件(datafile)
 可选的文件类型包括:
  •   初始化参数文件(initialization parameter file)
  •   密码文件(password file)
  •   归档重做日志文件(archive redo log file)
  •   追踪文件(trace file)
Database Physical Storage
           - Controlfile
• Controlfile
  关于控制文件有两种看法, 有的DBA认为存在多个控制文
  件, 有的则认为只有一个控制文件; 这两种说法都是正确
  的, 通常确实存在多个控制文件, 但是这些控制文件内容
  都是相同的.
  控制文件对于oracle数据库至关重要, 它存储了如下信息:
 – 在线重做日志文件的位置, 当数据库处在归档日志模式, 控制
   文件会存储近期归档日志文件的位置;
 – 数据库表空间, 表空间对应的数据文件;
 – 维护数据库完整性的关键信息, 比如之前提到的检查点位置;
 – 如果使用了RMAN 进行数据库的备份, 那么备份信息会存储
   在控制文件中.
• Multiplexing
  根据控制文件对于数据库的重要性, 好的做法是对控制
  文件保存多个拷贝.
Database Physical Storage
       - Online redo log file
• oracle重做日志文件包含两种类型: 在线重做日志和归档
  重做日志, 这里讲述的是前者; Oracle数据库要求至少两
  个在线重做日志文件组(方便归档操作), 每个组包含至少
  一个文件(称之为成员文件). 为了数据的安全性, 一般在
  一个文件组中创建多个成员, LGWR进程会同时写这些文
  件以保证它们的同步.
• 相关概念
 – 当前组(current group)
 指的是当前记录重做日志的文件组.
 – 日志切换(log switch)
 当某一组重做日志文件被写满时, 会切换到另一组,
 这称为日志切换
• 重做日志文件组的数目和大小对于数据库的性能
  调优十分重要, 应当根据数据库的具体活动情况进
  行适当的调整.
Database Physical Storage
             - Datafile
• Datafile
  数据文件, 在10g&11g版本中数据库要求至少两个数据文件分别
  用于SYSTEM和SYSAUX表空间, 实际情况下会创建更多的数据文
  件;
  数据文件存储了数据库段(segments), 典型的segment类型有表/
  索引等; 这些段包含了两种类型的信息: 用户数据库和数据字典
  数据.
• Data block
  从操作系统的层面来看, 数据文件由文件系统块组成, 在内部使
  用中则会被处理为oracle数据块(接下来说的数据块均指oracle数
  据块),两者之间没有必然的联系但是基于性能的考虑oracle数据
  块大小需要大于文件系统数据块的大小;
  通常情况下, 整个数据库的数据块大小均相同, 但可以为不同的
  数据文件指定不同的块大小.
  为了数据的安全性考虑, 数据文件需要进行定时的备份操作; 使
  用oracle提供的RMAN工具或者使用磁盘阵列(RAID)技术对数据
  文件进行备份.
Database Physical Storage
            - Other files
• Parameter file
  在数据库启动时参数文件被读取并使用, oracle数据库的所有配
  置参数中仅有一个参数是必须的: DB_NAME, 其他参数均有默认
  值, 因此参数文件可能非常小. 另外, 参数文件被存储为pfile或者
  spfile.
• Password file
  通常情况下用户验证信息保存在数据字典并用于验证操作, 如果
  数据字典不可用则需要使用密码文件进行验证, 常见的情况是启
  动或者创建一个数据库.
• Archive redo log file
  归档重做日志文件, 用于数据库的恢复.
• Alert log and trace file
  告警日志文件记录了对数据库影响重大的操作, 比如数据库的启
  动和关闭, 改变数据库参数, 修改数据库的物理结构;
  跟踪文件, 由数据库后台进程生成, 经常使用到的是会话跟踪文
  件, 用于数据库错误诊断和性能调优.
Database Logical Storage
• Oracle通过表空间(tablespace)的方式实现了对
  物理存储结构的抽象; 从逻辑上来说, 表空间由
  多个逻辑段(segment)组成, 段用于存储相关的
  数据, 典型的段有表/索引/回滚段; 从物理的角
  度来看, 表空间由多个数据文件组成; 段与数据
  文件之间是多对多的关系.
• Data dictionary segment
  在创建数据库时, 需要创建大量的数据字典段,
  这些段存储在SYSTEM/SYSAUX表空间中. 10g版
  本引入了SYSAUX表空间用于数据字典的存储,
  之前所有的字典数据均存储在SYSTEM表空间中.
Database Logical Storage
• Extent
  扩展. 段由多个扩展组成,扩展则是数据块的
  集合. 段在每次扩容时, 会分配一个新的扩
  展. 下图是oracle逻辑存储结构和物理存储
  结构的映射关系
  (注意图中使用黑
  字标注的数字):
Database Logical Storage
          - Data dictionary
• 数据字典是关于数据的数据, 它是对数据库中其他对象(表, 索引,
  限制等)的描述. 以表的数据字典为例, 它包含了表的名称, 创建
  参数, 列等信息; 从10g版本开始, 数据字典还包含了性能监控的
  相关信息. 在很多方面, 数据字典与其他的数据库对象一样, 也是
  使用段进行存储的, 关键的区别在于这些段在数据库创建时创建,
  而且不应当直接去访问这些数据(通常使用视图的方式进行访
  问);
• Data dictionary views
  oracle以三种视图的形式提供对数据字典的访问, 分别以不同的
  前缀进行命名:
 – USER_XXXX
   当前用户拥有的对象的数据字典信息, 比如user_tables,
   user_indexes;
 – ALL_XXXX
   当前用户具有访问权限的对象的数据字典信息, 比如all_tables,
   all_indexes;
 – DBA_XXXX
   数据库所有对象的数据字典信息, 比如dba_tables.
END

1, OCP - architecture intro

  • 1.
  • 2.
    Overview • Oracle数据库的架构可以分为两种类型: 单 实例架构和分布式架构(RAC), 后者不是我们 要讨论的内容; • Oracle单实例架构包含两个方面: 实例架构 (instance arch)和存储架构(storage arch), 前 者又可以分为内存和进程两个方面. 这一章 将依次讨论这些内容.
  • 3.
    Instance vs. Database •通常我们在谈论oracle数据库时指的是数据库 服务器(oracle database server), 它由两个部分 组成: 实例(instance) + 数据库(database); • 实例 实例指的是oracle运行时的内存和相关的操作 系统进程, 在数据库启动时会分配相应的内存 并启动相关的后台进程. • 数据库 数据库指的是相关的存储文件, 包括参数文件, 密码文件, 数据文件等.
  • 4.
    Single-instance Architecture • 单实例是最常见的一种情况,数据库实例运行在某台server 上, 并打开存储在本地磁盘的数据库. 客户端与服务端的交 互则可以总结为: – 一个客户端用户进程与一个服务端进程交互; – 服务端进程与实例进行交互; – 实例与数据库进行交互. 如下:
  • 5.
    Instance Memory Structure - SGA • 实例内存由被称为系统全局区(SGA,System Global Area)的系统共享内存(shared memory)组成, SGA包括以下必须的以及可选的组成部分, 必须: – 数据块缓冲区(database buffer cache) – 日志缓冲(log buffer) – 共享池(shared pool) 可选: – 大池(large pool) – Java池(java pool) – 流池(stream pool)
  • 6.
    Instance Memory Structure - PGA • 当服务端接收到客户端发起的请求并成功 建立连接时, 一个新的会话(session)就会产 生, 该会话代表了此次客户端进程与服务端 进程的交互. 实例会为每一个会话分配专属 的内存空间, 被称为程序全局区(PGA, program global area). 与SGA不同的是, PGA是每一个 session私有的, 不会共享; • PGA通常用于SQL运算操作, 比如排序, 分组, 连接(join)等.
  • 7.
    Instance Memory Structure - Database Buffer Cache • 数据库在执行SQL语句时, 需要对磁盘数据文件 进行读取或者写入操作, 而磁盘操作通常是代 价昂贵的, 因此oracle引入了数据块缓冲将数据 块(data block)加载到内存进行相关的操作, 并 在适时的情况下读写磁盘; • 数据块缓冲区的大小对于数据库的整体性能至 关重要, 缓冲区太小会导致频繁的读写磁盘, 太 大以致不被用到的数据块也被缓存. 使用数据 块命中率(data buffer hit ratio)来衡量缓冲区设 置的合理性, 通常情况下该数值要达到99%以上.
  • 8.
    Instance Memory Structure - Redo Log Buffer • 重做日志缓冲对于oracle保持数据的完整性至关重 要, oracle在执行DML语句时会生成重做日志(redo log), 并写入到该缓冲区中. 与其它的内存结构不同 的是, 该缓冲区设置通常比较小(8M), 后台进程LGWR 用于将缓冲区的内容写入到重做日志文件, 该进程 会在下面的情况中被调用: – DBWn进程被调用 – 1/3的缓冲区被使用 – 执行commit语句 • 重做日志缓冲的大小设置在数据库启动参数 log_buffer中, 可以修改该参数值, 但是不能小于默认 值. 通常情况下设置过大的log_buffer不是一个好的 做法, 因为在执行commit语句时会实时写重做日志 文件, 会消耗更多的时间.
  • 9.
    Instance Memory Structure - Shared Pool • 共享池是SGA中最为复杂的内存结构, 主要由以下部分组成: – 库缓存(library cache) 最常见的是用于缓存解析后的sql语句 – 数据字典缓存(data dictionary cache) 用于缓存最近使用过的数据库对象的数据字典信 息, 比如表/索引等的定义 – PL/SQL存储过程和函数缓冲 缓存PLSQL存储过程和函数的定义 – SQL查询和PL/SQL函数结果缓冲 这是11g版本中引入的一个新的特性, 通过缓存sql查询和 plsql函数的执行结果可以避免重复执行. 系统自身会检查数 据是否已经过期. 默认情况下此特性被关闭. • 共享池的大小对于数据库的性能至关重要, 理想情况下共享池应该能 够存储那些经常被执行sql的解析结果和数据字典定义等信息, 但不应 该保存那些极少被使用的数据. 共享池在数据库启动时被分配, 可以运 行时动态改变共享池的大小(自9i).
  • 10.
    Instance Memory Structure - Large Pool • 大池是SGA中可选的内存结构, 在以下情况 会使用到: – 共享服务器(shared server) – 并行执行服务器(parallel execution server) – RMAN备份数据到磁带设备 如果在执行这些操作时, 大池没有被创建那 么则会选择使用共享池中的内存.
  • 11.
    Instance Memory Structure - Java & Streams Pool • 当应用使用到java存储过程时, java池被用作 堆栈(heap space)空间用于存储java类对象. 需要注意的是, java存储过程与plsql存储过 程一样被缓存在共享池中. • 流池是Oracle Streams使用到的内存结构, 暂 时不予讨论.
  • 12.
    Instance Process Structure •oracle数据库在启动时会启动相应的后台进程, 这些进程有的是由来已久的比如SMON, PMON, DBWn, LGWR, CHKPT等; 有的是随着新的版本引 入的, 比如MMON, MMAN等; 有的是一些非关 键的进程, 比如ARCn, RECO等; 另外一些进程需 要启用相关的数据库选项; 最后的一组进程则 与数据库集群和高级流相关; • 这些进程在不同的系统平台上表现为不同的形 式, 在unix/linux平台上针对每个进程会启动相 应的操作系统进程, 而在windows平台则实现为 oracle.exe进程的子线程.
  • 13.
    Instance Process Structure - Overview • 这是一张关于SGA与实例进程之间的交互图, 其中server processes表示的是会话进程, 用 于处理客户端与服务端的连接; LGWR用于 写重做日志文件, DBWn写数据文件; ARCn进 程用于归档重 做日志文件.
  • 14.
    Instance Process Structure - SMON & PMON • SMON, the system monitor 系统监控进程. 在数据库启动时, SMON负责挂 载和打开数据库; 在数据库成功启动之后, SMON则负责一些系统的监控任务, 比如合并数 据文件中的空间. • PMON, the process monitor PMON用于监控服务端会话进程. 当客户端发起 一个会话连接时, 服务端会启动相应的会话进 程. 如果该会话正常结束(比如, 用户退出登录), 那么该进程将会被正常的终止; 否则PMON将会 清理这些进程, 这包括回滚未完成的事务和释 放会话的PGA内存.
  • 15.
    Instance Process Structure - DBWn • DBWn, the database writer 会话进程修改的是数据块缓冲区, 不会直接写磁盘数据文件, 负 责这份工作的是DBWn进程, 可以有多个该进程同时运行分别是 DBW0, DBW1... DBWn进程负责将缓冲区的脏数据块写入到数据文件, 该进程遵 循的一个原则是: 尽可能少被调用, 每次调用尽可能少写. DBWn 只会写缓冲区中最近没有被使用到的脏数据块, 这样只会导致最 少量的磁盘IO操作. 以下情况会触发DBWn动作: – 数据块缓冲空间被使用完 – 脏数据块过多 – 每隔3秒DBWn会被调用 – 调用checkpoint操作 在上面的3种情况下只会导致尽量少的脏数据块被写入磁盘, checkpoint 则会对所有的脏数据块执行写入操作, 这样带来的一个后果是磁盘IO 大幅度上升, 数据库性能急剧下降. 数据块在关闭时会执行该动作, 可 以通过如下语句手动执行(没有必要请不要执行): alter system checkpoint
  • 16.
    Instance Process Structure - LGWR • LGWR, the Log Writer LGWR进程负责将重做日志缓冲区的内容写入到在线 重做日志文件(online redo log files)中, 每次写操作称 为flush. • 当一个会话执行某些DML语句(INSERT, UPDATE, etc) 时, 会话进程首先会向重做日志缓冲区写修改队列 (change vector), 然后才修改数据缓冲区的数据块. LGWR进程会在下面的情况中被调用: – DBWn进程被调用 – 1/3的缓冲区被使用 – 执行commit语句 注意: 有时候会提到LGWR进程每3秒被调用一次, 实际上这是由DBWn进程决定的, 因为DBWn进程每个3 秒被调用, 而DBWn会调用LGWR.
  • 17.
    Instance Process Structure - CKPT • CKPT, the Checkpoint Process 检查点操作通过写入所有的脏数据块从而确保当前数据 库的状态是一致的, CKPT会更新控制文件记录检查点位 置(checkpoint position), 该位置被用于oracle启动时的灾 难恢复操作(比如数据库突然崩溃). 频繁的CKPT操作可以 减少数据库恢复的时间, 但是会对运行时性能产生影响. • CKPT, full vs. partial 检查点操作分为full 和 partial类型, 与前者不同的是 partial类型的操作只会写入某个数据文件或者表空间的 脏数据块, 而不是针对整个数据库的. • CKPT, 8 vs. 8i and onward CKPT自8i版本开始有比较大的变化, 在V8版本中CKPT以 full类型被定时执行; 自8i版本开始, CKPT使用partial类型 以增量的方式执行, 这样带来的好处是数据库的整体性 能表现更为平滑. 只有在用户要求执行或者数据库关闭 时, full类型的CKPT操作才会被调用.
  • 18.
    Instance Process Structure - MMON • MMON, the Manageability Monitor 可管理性监控器, 该进程随着10g引入, 用于 数据库的自我监控和调优功能. MMON按照 如下的步骤工作(默认一小时运行一次): – 读取实例收集的数据库活动和性能数据, 并建立 快照(snapshot); – 启动ADDM(Automatic Database Diagnostic Monitor)工具, 对比当前快照和之前的快照并进 行分析; – 生成相应的报告和警告信息.
  • 19.
    Instance Process Structure - MMAN • MMAN, the Memory Manager 内存管理进程, MMAN是随着10g版本引入的, 该进程用于自动管理实例内存(SGA & PGA)的分配. • prior 9i 在9i之前无论SGA还是PGA均是静态的, 不可以在实 例启动之后进行重新的调整. • 9i & 10g 在9i版本中SGA/PGA可以被手工调整大小, 10g中引 入了MMAN实现了SGA内存的自动管理. • 11g 11g在所有之前的版本上更进一步, DBA需要做的是 设置一个总的内存共SGA和PGA使用, MMAN会监控 SGA/PGA的内存需要进行自动的管理.
  • 20.
    Instance Process Structure - ARCn • ARCn, the Archiver 归档日志进程, 这是一个可选的进程, 但是对于大多 数企业应用而言此进程是必须的, 在数据库灾难发 生的情况下, 如果没有开启该进程可能会导致数据 无法被正常恢复. • How it works? LGWR负责写在线重做日志文件(比较小), 在这些文 件被写满之后LGWR则会覆盖之前的内容, 因此这些 日志文件只能记录数据库近期的活动. ARCn进程用 于在这些日志文件被重写之前对它们进行归档操作, 以记录数据库所有的历史活动.
  • 21.
    Instance Process Structure - RECO • RECO, the Recoverer RECO进程负责分布式事务的回滚操作, 分布式事务 一个常见的情况就是使用database link, 比如: update orders@mirror set order_status=complete where customer_id=1000; 这里mirror代表的是一个指向远程数据库的link, 对于 这种事务的提交称之为二部提交(2PC, 2-phase commit). 2PC涉及到本地数据库和远程数据库的提交 操作以及它们之间的同步, 如果均提交成功那么2PC 操作成功, 如果出现了失败那么RECO进程负责分布 式事务的回滚.
  • 22.
    Instance Process Structure - Other Processes • CJQn & Jnnn 这两个进程用于管理数据库定时任务, CJQn进程监控任务队列, 并将需要执行的任务发送给Jnnn进程执行; • D000 & Snnn 分派进程, 在启用共享服务器的情况下, 该进程将SQL语句发送给 Snnn进程执行. • DBRM 数据库资源管理进程, 负责资源计划和其它的一些资源管理任务. • DIA0 此进程负责检测和解决数据库死锁(deadlock). • DIAG 可诊断性进程, 负责诊断信息的转储和执行oradebug命令, 该命 令用于检测实例中的问题. • FBDA 闪回数据归档进程(flashback data archiver process), 负责对数据 库表的数据进行归档, 以支持闪回查询(flashback query).
  • 23.
    Instance Process Structure - Other Processes • PSP0 PSP0(Process Spawner)用于创建和管理其他的 oracle进程. • QMNC, Q000 Oracle队列管理进程. • SHAD 支持用户会话的辅助进程. • SMCO, W000 SMCO, 空间管理调度进程. W000是它的从属进 程.
  • 24.
    Database Storage Structure - Overview • Oracle数据库的存储结构可以划分为物理存 储和逻辑存储两个方面, 物理存储指的是 oracle在磁盘或者其它设备上的文件; 逻辑 存储则是oracle对物理存储的抽象, oracle使 用表空间(tablespace), 段(segment), 扩展 (extent), 数据块(data block)来表示数据库的 逻辑存储结构. 关于oracle存储会在以后的 章节作详细的介绍. • 接下来会首先介绍与物理存储相关的数据 库文件, 之后介绍逻辑存储.
  • 25.
    Database Physical Storage - Overview • oracle数据库由三种必须的文件类型和其它 的外部文件(严格上来说这些文件不是必须 的)组成, 必须的文件包括: • 控制文件(controlfile) • 在线重做日志文件(online redo log file) • 数据文件(datafile) 可选的文件类型包括: • 初始化参数文件(initialization parameter file) • 密码文件(password file) • 归档重做日志文件(archive redo log file) • 追踪文件(trace file)
  • 26.
    Database Physical Storage - Controlfile • Controlfile 关于控制文件有两种看法, 有的DBA认为存在多个控制文 件, 有的则认为只有一个控制文件; 这两种说法都是正确 的, 通常确实存在多个控制文件, 但是这些控制文件内容 都是相同的. 控制文件对于oracle数据库至关重要, 它存储了如下信息: – 在线重做日志文件的位置, 当数据库处在归档日志模式, 控制 文件会存储近期归档日志文件的位置; – 数据库表空间, 表空间对应的数据文件; – 维护数据库完整性的关键信息, 比如之前提到的检查点位置; – 如果使用了RMAN 进行数据库的备份, 那么备份信息会存储 在控制文件中. • Multiplexing 根据控制文件对于数据库的重要性, 好的做法是对控制 文件保存多个拷贝.
  • 27.
    Database Physical Storage - Online redo log file • oracle重做日志文件包含两种类型: 在线重做日志和归档 重做日志, 这里讲述的是前者; Oracle数据库要求至少两 个在线重做日志文件组(方便归档操作), 每个组包含至少 一个文件(称之为成员文件). 为了数据的安全性, 一般在 一个文件组中创建多个成员, LGWR进程会同时写这些文 件以保证它们的同步. • 相关概念 – 当前组(current group) 指的是当前记录重做日志的文件组. – 日志切换(log switch) 当某一组重做日志文件被写满时, 会切换到另一组, 这称为日志切换 • 重做日志文件组的数目和大小对于数据库的性能 调优十分重要, 应当根据数据库的具体活动情况进 行适当的调整.
  • 28.
    Database Physical Storage - Datafile • Datafile 数据文件, 在10g&11g版本中数据库要求至少两个数据文件分别 用于SYSTEM和SYSAUX表空间, 实际情况下会创建更多的数据文 件; 数据文件存储了数据库段(segments), 典型的segment类型有表/ 索引等; 这些段包含了两种类型的信息: 用户数据库和数据字典 数据. • Data block 从操作系统的层面来看, 数据文件由文件系统块组成, 在内部使 用中则会被处理为oracle数据块(接下来说的数据块均指oracle数 据块),两者之间没有必然的联系但是基于性能的考虑oracle数据 块大小需要大于文件系统数据块的大小; 通常情况下, 整个数据库的数据块大小均相同, 但可以为不同的 数据文件指定不同的块大小. 为了数据的安全性考虑, 数据文件需要进行定时的备份操作; 使 用oracle提供的RMAN工具或者使用磁盘阵列(RAID)技术对数据 文件进行备份.
  • 29.
    Database Physical Storage - Other files • Parameter file 在数据库启动时参数文件被读取并使用, oracle数据库的所有配 置参数中仅有一个参数是必须的: DB_NAME, 其他参数均有默认 值, 因此参数文件可能非常小. 另外, 参数文件被存储为pfile或者 spfile. • Password file 通常情况下用户验证信息保存在数据字典并用于验证操作, 如果 数据字典不可用则需要使用密码文件进行验证, 常见的情况是启 动或者创建一个数据库. • Archive redo log file 归档重做日志文件, 用于数据库的恢复. • Alert log and trace file 告警日志文件记录了对数据库影响重大的操作, 比如数据库的启 动和关闭, 改变数据库参数, 修改数据库的物理结构; 跟踪文件, 由数据库后台进程生成, 经常使用到的是会话跟踪文 件, 用于数据库错误诊断和性能调优.
  • 30.
    Database Logical Storage •Oracle通过表空间(tablespace)的方式实现了对 物理存储结构的抽象; 从逻辑上来说, 表空间由 多个逻辑段(segment)组成, 段用于存储相关的 数据, 典型的段有表/索引/回滚段; 从物理的角 度来看, 表空间由多个数据文件组成; 段与数据 文件之间是多对多的关系. • Data dictionary segment 在创建数据库时, 需要创建大量的数据字典段, 这些段存储在SYSTEM/SYSAUX表空间中. 10g版 本引入了SYSAUX表空间用于数据字典的存储, 之前所有的字典数据均存储在SYSTEM表空间中.
  • 31.
    Database Logical Storage •Extent 扩展. 段由多个扩展组成,扩展则是数据块的 集合. 段在每次扩容时, 会分配一个新的扩 展. 下图是oracle逻辑存储结构和物理存储 结构的映射关系 (注意图中使用黑 字标注的数字):
  • 32.
    Database Logical Storage - Data dictionary • 数据字典是关于数据的数据, 它是对数据库中其他对象(表, 索引, 限制等)的描述. 以表的数据字典为例, 它包含了表的名称, 创建 参数, 列等信息; 从10g版本开始, 数据字典还包含了性能监控的 相关信息. 在很多方面, 数据字典与其他的数据库对象一样, 也是 使用段进行存储的, 关键的区别在于这些段在数据库创建时创建, 而且不应当直接去访问这些数据(通常使用视图的方式进行访 问); • Data dictionary views oracle以三种视图的形式提供对数据字典的访问, 分别以不同的 前缀进行命名: – USER_XXXX 当前用户拥有的对象的数据字典信息, 比如user_tables, user_indexes; – ALL_XXXX 当前用户具有访问权限的对象的数据字典信息, 比如all_tables, all_indexes; – DBA_XXXX 数据库所有对象的数据字典信息, 比如dba_tables.
  • 33.