More Related Content Similar to 1, OCP - architecture intro
Similar to 1, OCP - architecture intro (20) 1, OCP - architecture intro3. Instance vs. Database
• 通常我们在谈论oracle数据库时指的是数据库
服务器(oracle database server), 它由两个部分
组成: 实例(instance) + 数据库(database);
• 实例
实例指的是oracle运行时的内存和相关的操作
系统进程, 在数据库启动时会分配相应的内存
并启动相关的后台进程.
• 数据库
数据库指的是相关的存储文件, 包括参数文件,
密码文件, 数据文件等.
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.