Oracle核心技术 笔记(该书读得不仔细,需要找时间再细读~~)
来源:互联网 发布:js date 转unix时间戳 编辑:程序博客网 时间:2024/05/29 10:58
Oracle核心技术
目录
- 1开始
- 2redo和undo
- 3事务与一致性
- 4锁与闩
- 5缓存和复制
- 6写入和恢复
- 7解析与优化
- 8RAC及‘缺陷’
- 9附录A 转储与调试
开始
- SGA/SCN
- 真正需要理解的仅仅3个进程:lgwr、dbwr、dbwN
redo和undo
- Oracle v6:改变向量(change vector)
- 两份存储:当前状态 + redo日志
- 改变数据的方法:4步关键步骤(这使得数据修改是可逆的)
- 创建改变操作的描述(redo change vector)
- undo描述(插入到undo表空间的undo块中)
- undo描述的描述(此undo的redo change vector)
- 改变数据项
- 实际的顺序变成3 1 2 4,2条redo被合并为一条日志记录,写入到redo缓冲区
- 事务中的第一次修改包含一些特殊步骤*
- (我的小结)理论上说来,redo日志写成功即意味着事务已经成功提交,这时如果数据库崩溃导致内存中的当前状态没有更新到数据库存储中时,就可以通过redo再做一次以确保事务完成;另外一方面,由于一个嵌套事务的失败,导致已完成的数据库更新需要回退,这时就需要undo,而undo本身有可能因存储于易失性区域崩溃而丢失,这时就需要把undo再通过undo的redo日志再做一遍以恢复数据到前一个一致状态
- 从上面的描述可以看到,事务的实现依赖于数据修改是可逆的这一点,否则状态易失(如赋值操作、文件写操作)就不可能做到一致性恢复
- 而一致性恢复依赖于全局一致性快照(即MVCC)的创建,为此需要事务号、时间戳这些特殊的底层属性来实现,这可以参考CLojure语言中相关概念
- why?undo记录阻止了其他用户查看我们正在改变的数据(中间临时状态)
- 其他用户可以通过undo得到记录的之前的一个版本(与他的事务视图相一
- redo allocation latch:保护redo日志缓冲区(因为只有一个lgwr进行着串行的写操作)
- 所谓的latch其实就是Linux Kernel里类似spin_lock(自旋锁)的东西
- p17 每个人都做一点点“额外的”工作(协作的开销?),就意味着他们可以在不同的地方同时工作,而不必经常在同一个地方竞争(contention)
- redo simplicity
- undo complexity
- undo的存在能够让会话在不应该看到数据的最新版本(未事务提交!)时去访问更旧的版本(与会话的一致性相符合)
- 读一致性:有限的ITL entries,超出的作为undo记录保存(往回倒带~)
- 回滚:将产生新的redo!(请对照代码管理系统里的revert操作,revert实际上产生一个新的commit)
- 消除回滚成本:全局临时表
事务与一致性
- 让提交尽可能快*,让回滚慢慢来
- *并且尽可能频繁?细粒度的提交对VCS而言有助于连续集成,对于DBMS呢?
- 事务与undo
- undo段:段头、extent map、extent control header
- 事务表TRN TBL:,wrap#列?
- 事务表中条目,在v$transaction视图里称‘槽’(slot)
- x$ktuxe
- newing, & 闪回。。。
- 单个undo块可包含多个事务的undo记录
- 数据块访问与undo
- 本节包含的内容相当重要,但由于涉及大量细节,只能等有时间的时间再细看了
- 提交SCN
- 提交清除
- 延迟块清除:通过“均摊”的方式来‘隐藏’工作量
- 事务表回滚
- ORA-1555 “快照太旧”
- 大对象(LOB)
- 只需关心索引的事务和读一致性处理,特例:ORA-22924
- 小结
- 一个ITL条目:xid: uba: SCN
锁与闩
- 锁和pin:FCFS;闩和Mutex(10g+,替换pin):随机抢占策略
- 闩:保护共享内存
- 可共享
- 本质上是一个内存位置和一个test-and-set的CPU原子操作的组合(#see Lock-Free数据结构)
- 相当于Linux内核里的spin_lock,spin_lock在单核CPU下不起作用
- 活动统计:v$latch_parent v$latch_children
- gets、misses、spin_gets、sleeps、sleepN、immediate_gets、immmediate_misses、wait_time
- 等待唤醒机制(相当于Linux内核里的信号量?)
- library cache latch
- 大部分闩锁在11g中取消了(只剩library cache load lock)
- 锁:保护对象(锁=排队?)
- 基础结构:x$ksqrs(v$resource,标记资源) x$ksqeq(设置锁模式)
- v$lock
- “锁定”某个对象:加入到等待队列某尾,直到等待队列和转换队列之间没有会话在你前面,这时附加自己到拥有者队列
- 死锁
- TX/4等待?
- 锁模式
- NL SS RS SX RX S SSX SRX X
- 保护锁的闩锁*
- KGL锁(和pin)
- 锁和pin=〉11g后逐步被Mutex替代
缓存和复制
- 内存管理
- 10g ASMM:db_cache_size/shared_pool_size ==> 固定大小的granule
- 多个数据块缓存
- 8种类型:db_cache_size db_keep_cache_size db_recycle_cache_size db_2k_cache_size(这什么破命名) ...
- 更小的chunk
- 工作集
- x$kcbwds
- LRU/TCH算法
- 似乎比较重要,待有时间重新细读
- REPL_AUX
- --> REPL_MAIN?
- 查找数据
- pin住缓存区
- 逻辑IO
- 更新
- 载入hash链
- 读一致性拷贝
- 物理IO
- 表扫描
写入和恢复
- lgwr
- redo sync writes和log file sync
- 10g+ 新的commit选项
- 重做日志浪费(redo wastage)
- 私有重做(private redo threads)
- dbwr
- 缓冲区头部
- 检查点队列
- 增量检查点
- 写进程的交互
- ?相对文件号()/绝对文件号(afn:)
- 恢复
解析与优化
- 数据字典缓存:v$sgastat
- 8i+ cursor_sharing
- parse活动和parse call?
- 库缓存
- 共享池
- 解析和优化(略)
- executing、locking和pinning
RAC及‘缺陷’
- GRD
- p178 虚拟IP和SCAN
- p183 至少需要从4个实例开始
- Master和Shadow
- GCS和GES
- 缓存融合
附录A 转储与调试
0 0
- Oracle核心技术 笔记(该书读得不仔细,需要找时间再细读~~)
- 得仔细
- 需要细读的好文章(搜集)
- 程序员需要心沉下来和仔细再仔细
- iOS学习笔记69-再细读KVO
- ejb讲得仔细
- javascript w3cschool 细读笔记
- 有时间细读这些书
- 好东西得仔细研究
- hdu 5319 Painter (此题纪念不仔细读题而逝去的WA)
- 读Java核心技术笔记
- 需要仔细读的书 (July 8, 2016)
- 需要仔细研究的问题。
- 需要仔细研究的问题
- 需要仔细研究的技术
- 需要仔细看的文章
- 需要仔细阅读的文章的URL地址(有Oracle相关的技巧)
- oracle 两个时间相减得
- CppSqLite 对sqllite的二次封装
- Sql Server数据库使用
- hadoop与hbase版本信息
- Creating a broker on Linux and UNIX systems
- error MSB8011: 未能注册输出。请尝试启用“逐用户重定向”
- Oracle核心技术 笔记(该书读得不仔细,需要找时间再细读~~)
- thean 4
- C#中连接SQL Server数据库、执行存储过程
- java mina FundTradeSAOImpl 入口
- streaming 使用
- 备忘录实现过程问题汇总
- 动漫推荐之苍之瞳的少女
- Uva10294 Arif in Dhaka (置换问题)
- SD/MMC插口的规范之三:初始化及热插拔检测机制