OCM Training by Oracle ACE Vage Hangzhou(Modify Oracle Datafile With Bbed)

OCM Training by Oracle ACE Vage Hangzhou(Modify Oracle Datafile With Bbed)
http://www.itpub.net/thread-1620472-1-1.html

一、assm:

三级多层(L3->L2->L1):一个L3包含多个L2,一个L2包含多个L1,逐层向下

L3:段头
L2/L1:数据块

assm增加L2和L1块,这种块会占10%左右,全表扫描的成本会增加。

缺点:全表扫描成本略高,索引扫描不变
优势:大并发插入大大优化

解决段头竞争:对于L3->L2的竞争,段头不会频繁修改,大部分时间在读。

assm:适合oltp
mssm:适合数据仓库(少量大并发插入)

举例:处理buffer busy waits一例

应用程序,用户登录在日记记录一次,退出时记录一次。取得用户登录持续时间。上线后存在大量buffer busy waits:两个进程同时修改同一个buffer,采用assm结果不是太理想。
解决:
1、修改应用,只在用户登录时记录一条日志。并发插入少一半,效果并非最理想。
2、仔细分析后:插入的块集中在hwm之下。hwm以下的块数量有限,造成并发等待。最终以最后增加hwm(插入数据 删除?),缺点:全表扫描很慢

疑问:读数据字典数据不算逻辑读??

读rowcache,取得时buffer cache的数据

dbms_rowid:找到一行数据插在哪里

rowid_relative_fno:解析文件号
rowid_block_number:解析块号

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),id,name from a1;

rowid包括:oid(对象号) fid(文件号) bid(块号) rid(行号)

二、高可用架构

高可用:减少宕机时间。

典型架构:

举例1:dg+infiniband

要求:不丢数据,逻辑读和物理读高

解决办法:使用ssd盘,infiniband做互联

缺点:读很快,写比较慢。

主备库互联可能成为性能瓶颈。

远程控制卡?远程控制主机启停。

主备切换时需关闭archivelog的传输

举例2:主库+共享存储+备库

要求:用于大并发事物,读写比较平均,共享存储。

主备库交换控制文件?比较有意思~~

主库的redo和control file存放在共享存储上,备库接管:使用主库的redo和controlfile,先recovery。再接管主库。

三、特种恢复技巧

bbed:最好永远别用到~~

日志切换:记录scn和rba(redo block address)

rba包括:日志序列号、块号、偏移量(一般为512字节,hp为1k)

跳过归档:修改scn和rba

bbed使用:

举例1:修改块中'abc'为'xyz'

1、找到ins_rdbms.mk文件
2、编译:make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
3、使用:./bbed
4、密码:password:blockedit
5、使用帮助:help all show all
6、echo > /temp/bbed.lst
7、set listfile 'tmp/bbed.lst'
8、set filename ''
9、set file 4
10、setblock 172
11、dba:data block address
12、set mode edit
13、set count 8192
14、dump(8192可以显示块所有信息)
15、select dump('abc',16) from dual; —dump出来看一下
16、find /x 0x0202c102 —搜索16进制
17、set offset 8185 —设置偏移量
18、dump —再次dump,确定位置
19、modify /x 0x0378797a —将'abc'修改为'xyz'
20、alter system flush buffer_cache;
21、show parameter db_block_checksum;
22、sum apply —计算校验和

举例2:跳过某个归档

1、备份一下4号文件
2、切几次归档(alter system switch logfile;)
3、删除4号文件-已备份的文件
4、restore 4号文件
5、bbed修改scn和rba
6、alter session set events 'immediate trace name file_hdrs level 10'—dump数据文件头
7、。。。。(眼都看花了,一连串的16进制修改。哎。。偶也记不住了)

总结:被跳过的归档数据就丢失了(把archivelog设为1g 损失就大了。嘿嘿~~)

问题:文件被删除后在很长时间内还能使用。

对一个删除的文件,oracle不会报错:进程未关闭前,os会打上一个删除标记。并非立即删除~~所以文件被删除后在很长时间内还能使用。

技巧:误删文件,千万别重启oracle。只要有session连接着,可以将数据文件相关的数据迁移出来

四、buffer busy waits

buffer cache中:写阻塞写、写阻塞读。就会产生buffer busy waits

buffer busy waits:跟读没关系,原因是写的太慢。

解决办法:分散写、减少写、写的更快

cbc latch:cache buffer chains latch

一次逻辑读:

1、申请cbc latch
2、得到buffer pin
3、释放cbc latch
4、读内存
5、申请cbc latch
6、释放buffer pin
7、释放cbc latch

一次写操作:

1、申请cbc latch
2、得到buffer pin
3、释放cbc latch
4、读内存
4.1、产生redo
4.2、写buffer
5、申请cbc latch
6、释放buffer pin
7、释放cbc latch

调优:让redo写的更快。

产生redo流程:

1、在pga中生成redo信息
2、从pga中移动得到shared_pool中private redo strand area(神马东东?)
3、commit后,再移动到public redo strand area(即:log buffer)
4、由log buffer写入磁盘。

mutex的内容