Oracle Core
一、准备开始
回顾
疑问
- undo段头 -> 24(41/244)
- 事务列表(ITL)
- 事务槽(ITL slot) -> 49(66/244)
二、redo和undo
回顾
收获
疑问
- 变化数据捕捉(Change Data Capture, CDC)
- 重做日志转储 redo log file dump -> Oracle内核揭密第5章
dump log file
三、事务的一致性
回顾
收获
疑问
- extend map、extend control head -> 24(41/244)
- 事务表、事务表控制区 -> 24(41/244) -> 26(43/244)
- warp# -> 24(41/244)
- newed newing
四、锁与闩锁
回顾
收获
- 锁和pin -> 类似队列的“先到先服务”;闩锁和互斥锁 -> 随机抢占策略。 锁&pin&某些互斥锁持有时间较长 -> 保护对象;闩锁持有时间短 -> 保护共享内存。
- 数组、指针、链表、散列表
- v$resource_limit
- 闩锁两种类型:独占&共享读
- v$latch
- v$lock
- 锁、pin、闩锁和互斥锁
疑问
- KGL锁和KGL pin
五、缓存和复制
回顾
收获
- LRU 最近最少使用 -> LRU链闩锁
- TCH 接触计数
物理读时,服务器进程要将数据块从数据文件读进Buffer Cache中。假设Buffer Cache有10000个Buffer,那么,进程应覆盖哪个Buffer呢?简单点说,就是进程将数据块读进Buffer Cache的什么地方。答案是,哪个Buffer最不常用,它就会被当作牺牲者,也就是说,会覆盖掉它。覆盖最不常用的Buffer,这是所有LRU算法的本质。可如何快速找到这个最不常用的Buffer呢?这就是LRU需要解决的问题了。
LRU会将Buffer Cache中所有的Buffer都链接在一起。LRU又分两条链表,主LRU链表和辅助LRU链表。其中,主LRU又有冷端、热端两部分。同时,每个Buffer有一个访问计数TCH。TCH以3秒为一个阶段,每个阶段只要有进程访问,它的数值就会加1。如果3秒之内访问了多次,也只会加1。Buffer是在冷端还是在热端,主要靠这个TCH了。
疑问
- granule(内存单元)
- 工作集(working data set )
- 散列链 -> 79(96/244)
- repl_main repl_aux
六、写入和恢复
回顾
- LNS和RFS
- log file sync
收获
- commit_write -> commit_logging[batch | immediate] commit_wait[wait | nowait]
2. x$kcbwds
3. v$controlfile_record_section;
- 检查点名称和触发事件
- 介质恢复和实例恢复
- 闪回数据库
疑问
- LRU链和缓冲区散列链
- 检查点队列、文件队列、对象队列
- RBA LRBA
- tablespace begin backup & tablespace read only
七、解析与优化
回顾
- 库缓存
- 编译原理
- SQL执行顺序
收获
-
解析=语法分析+语义分析
-
在缓冲中
数据字典缓存(行缓存):缓存元数据,包含对象的信息,比如表、索引、列、直方图、触发器等。[从数据字典里一行一行读数据而非一个个数据块]
库缓存:缓存代码,包含语句(包括SQL和PL/SQL语句)、语句的游标,以及有关对象依赖和权限的一些信息。
疑问
-
tkprof格式化跟踪文件?
-
desc obj$
-
desc trigger$
-
desc v$rowcache
-
公共同义词 desc dba_dependencies
八、RAC及“缺陷”
回顾
- scanip vip priip
- DG只有一个实例能打开MRP进程的原因?
收获
- LMHB 锁管理心跳监控
- 全局资源目录(GRD)
- vKaTeX parse error: Expected 'EOF', got '&' at position 16: resource_limit &̲ vsgastat
- gc cr block 2-way(select) & gc current block 2-way(update)
- CUR * CR
- 缺陷 – 序列
疑问
- 全局锁
- 缓存一致性
- 全局资源目录(GRD)
- 缓存融合(cache fusion)
- master & shadow
- 恢复