[20190129]简单探究cluster table(补充)4.txt --//在链接http://blog.itpub.net/267265/viewspace-2286968/=>[20181229]简单探究cluster table(补充)3.txt, --//里面提到我看到的一个现象,在删除全部关联的cluster 键值后,mref部分(mref=0),并且hrid的offset占了mref --//的原来的位置.nrid也做了移动.col 0的位置没有变动. --//实际上上面是bbed显示上的一个bug,学习不够仔细,还是通过例子说明情况: 1.环境: SCOTT@book> @ ver1 PORT_STRING VERSION BANNER ------------------- ---------- ---------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 2.建立测试环境: create cluster deptx_cluster (deptno number(2)) size 800; --//加入参数size 800 create table deptx ( deptno number(2) , dname varchar2(14 byte), loc varchar2(13 byte) ) cluster deptx_cluster (deptno); alter table deptx add constraint pk_deptx primary key (deptno); create table empx ( empno number(4) , ename varchar2(10 byte), job varchar2(9 byte), mgr number(4), hiredate date, sal number(7,2), comm number(7,2), deptno number(2) ) cluster deptx_cluster (deptno); --//取消主外键约束. alter table empx add constraint pk_empx primary key (empno); create index i_deptx_cluster_deptno on cluster deptx_cluster; --//注这里不能使用unique,否则报ORA-01715: UNIQUE may not be used with a cluster index insert into deptx select * from dept; insert into empx select * from emp; commit; --//分析略. SCOTT@book> alter system checkpoint ; System altered. 3.查看数据: SCOTT@book> select rowid,deptx.* from deptx where deptno=20; ROWID DEPTNO DNAME LOC ------------------ ---------- -------------- ------------- AAAWQOAAEAAAAIMAAB 20 RESEARCH DALLAS SCOTT@book> select rowid,empx.* from empx where deptno=20; ROWID EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------------------ ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- AAAWQOAAEAAAAIMAAA 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 AAAWQOAAEAAAAIMAAD 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 AAAWQOAAEAAAAIMAAH 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20 AAAWQOAAEAAAAIMAAK 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20 AAAWQOAAEAAAAIMAAM 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20 SCOTT@book> @ rowid AAAWQOAAEAAAAIMAAB OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT ---------- ---------- ---------- ---------- -------------------- -------------------- ---------------------------------------- 91150 4 524 1 0x100020C 4,524 alter system dump datafile 4 block 524 ; BBED> p kdbt[0] struct kdbt[0], 4 bytes @114 sb2 kdbtoffs @114 0 sb2 kdbtnrow @116 4 BBED> p kdbt[1] struct kdbt[1], 4 bytes @118 sb2 kdbtoffs @118 4 sb2 kdbtnrow @120 4 BBED> p kdbt[2] struct kdbt[2], 4 bytes @122 sb2 kdbtoffs @122 8 sb2 kdbtnrow @124 14 BBED> x /rn *kdbr[0] rowdata[679] @8166 ------------ flag@8166: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK) lock@8167: 0x00 cols@8168: 1 kref@8169: 4 mref@8171: 4 hrid@8173:0x0100020c.0 nrid@8179:0x0100020c.0 col 0[2] @8185: 10 BBED> x /rn *kdbr[1] rowdata[633] @8120 ------------ flag@8120: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK) lock@8121: 0x00 cols@8122: 1 kref@8123: 6 mref@8125: 6 hrid@8127:0x0100020c.1 nrid@8133:0x0100020c.1 col 0[2] @8139: 20 BBED> dump /v offset 8120 count 22 File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 8120 to 8141 Dba:0x0100020c ----------------------------------------------------------------------------------------------------------- ac000106 00060001 00020c00 01010002 0c000102 c115 l ...................... --// ~~~~~!!!! =>~~ 表示 kref,!! 表示mref,占用2个字节. intel系列cpu大小头对调来看. <32 bytes per line> --//注意mref的偏移量8125.deptno=20的记录,deptx 1条记录,empx 5条记录. BBED> x /rcc *kdbr[5] rowdata[613] @8100 ------------ flag@8100: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC) lock@8101: 0x02 cols@8102: 2 ckix@8103: 1 col 0[8] @8104: RESEARCH col 1[6] @8113: DALLAS --//ckix=1,表示cluster 键值取自 *kdbr[1].也就是deptno=20. BBED> x /rcc *kdbr[4] rowdata[655] @8142 ------------ flag@8142: 0x6c (KDRHFL, KDRHFF, KDRHFH, KDRHFC) lock@8143: 0x02 cols@8144: 2 col 0[10] @8146: ACCOUNTING col 1[8] @8157: NEW YORK --//ckix没有显示,实际上ckix=0,表示cluster 键值取自 *kdbr[0].也就是deptno=10. --//实际上如果你仔细看上面x /rcc *kdbr[5]的cols以及ckix的偏移量就可以发现2个紧挨着的,ckix占1个字节. --//而没有ckix显示的x /rcc *kdbr[4],cols,col 0的偏移差存在2个字节.也就是中间的offset=8145对应的值就是ckix. --//感觉bbed设计上不应该跳过ckix=0的显示,这样不科学. BBED> dump /v offset 8142 count 24 File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 8142 to 8165 Dba:0x0100020c ----------------------------------------------------------------------------------------------------------- 6c020200 0a414343 4f554e54 494e4708 4e455720 594f524b l l....ACCOUNTING.NEW YORK ~~对应ckix. <32 bytes per line> 4.删除deptno=20的记录看看: SCOTT@book> delete from empx where deptno=20; 5 rows deleted. SCOTT@book> delete from deptx where deptno=20; 1 row deleted. SCOTT@book> commit ; Commit complete. SCOTT@book> alter system checkpoint ; System altered. BBED> x /rn *kdbr[1] rowdata[633] @8120 ------------ flag@8120: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK) lock@8121: 0x00 cols@8122: 1 kref@8123: 6 hrid@8125:0x0100020c.1 nrid@8131:0x0100020c.1 col 0[2] @8139: 20 --//删除6条记录后.mref通过bbed无法看到,我把上面的显示贴到下面便于对比. BBED> x /rn *kdbr[1] rowdata[633] @8120 ------------ flag@8120: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK) lock@8121: 0x00 cols@8122: 1 kref@8123: 6 mref@8125: 6 hrid@8127:0x0100020c.1 nrid@8133:0x0100020c.1 col 0[2] @8139: 20 --//可以发现offset=8125的位置现在显示的hrid的偏移,从bbed上看删除全部关联的cluster键值后hrid,nrid整体上移2个字节. --//而实际上还是bbed显示上的一个bug. BBED> dump /v offset 8120 count 22 File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 8120 to 8141 Dba:0x0100020c ----------------------------------------------------------------------------------------------------------- ac000106 00000001 00020c00 01010002 0c000102 c115 l ...................... <32 bytes per line> --//对比前面的显示 BBED> dump /v offset 8120 count 22 File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 8120 to 8141 Dba:0x0100020c ----------------------------------------------------------------------------------------------------------- ac000106 00060001 00020c00 01010002 0c000102 c115 l ...................... ~~~~~!!!! =>~~ 表示 kref,!! 表示mref,占用2个字节. <32 bytes per line> --//仔细看实际上hrid,nrid并没有变动.而仅仅是bbed显示上的一个bug. --//感觉bbed设计上的问题,应该正常显示mref=0.而bbed不显示这个0. --//可以通过一个简单的方法验证,直接修改offset=8125,8126的内容验证看看. BBED> assign offset 8125=0x34; ub1 rowdata[0] @8125 0x34 BBED> assign offset 8126=0x12; ub1 rowdata[0] @8126 0x12 --//0x1234=4660. BBED> x /rn *kdbr[1] rowdata[633] @8120 ------------ flag@8120: 0xac (KDRHFL, KDRHFF, KDRHFH, KDRHFK) lock@8121: 0x00 cols@8122: 1 kref@8123: 6 mref@8125: 4660 ~~~~~~~~~~~~~~~~~~ hrid@8127:0x0100020c.1 nrid@8133:0x0100020c.1 col 0[2] @8139: 20 --//再次说明学习细节很重要,要仔细论证查看,要敢于怀疑,仔细一想就明白,oracle不可能上移动hrid.nrid --//这样对应的块数据结构使用C语言定义的不对了. --//如果上移mref实际上对应位置是0x0100.oracle如何知道这个位置是mref还是hrid呢. 5.最后尝试手工恢复看看. BBED> p kdbh struct kdbh, 14 bytes @100 ub1 kdbhflag @100 0x01 (KDBHFFK) sb1 kdbhntab @101 3 sb2 kdbhnrow @102 22 sb2 kdbhfrre @104 -1 sb2 kdbhfsbo @106 70 sb2 kdbhfseo @108 7387 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sb2 kdbhavsp @110 7317 sb2 kdbhtosp @112 7518 BBED> p kdbr sb2 kdbr[0] @126 8066 sb2 kdbr[1] @128 8020 sb2 kdbr[2] @130 7978 sb2 kdbr[3] @132 7938 sb2 kdbr[4] @134 8042 sb2 kdbr[5] @136 8000 sb2 kdbr[6] @138 7960 sb2 kdbr[7] @140 7916 sb2 kdbr[8] @142 7881 sb2 kdbr[9] @144 7840 sb2 kdbr[10] @146 7799 sb2 kdbr[11] @148 7761 sb2 kdbr[12] @150 7718 sb2 kdbr[13] @152 7680 sb2 kdbr[14] @154 7642 sb2 kdbr[15] @156 7605 sb2 kdbr[16] @158 7570 sb2 kdbr[17] @160 7529 sb2 kdbr[18] @162 7494 sb2 kdbr[19] @164 7459 sb2 kdbr[20] @166 7423 sb2 kdbr[21] @168 7387 --//当前最小行目录的偏移是7387. BBED> set count 20 COUNT 20 BBED> set offset 7387 OFFSET 7387 --//注意count不要设置太大,避免跳过一些记录. BBED> find /x 7c curr File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 7523 to 7542 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020601 03c25003 04464f52 4407414e 414c5953 <64 bytes per line> BBED> find File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 7594 to 7613 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020601 03c24f4d 05414441 4d530543 4c45524b <64 bytes per line> BBED> find File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 7705 to 7724 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020601 03c24e59 0553434f 54540741 4e414c59 <64 bytes per line> BBED> find File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 7861 to 7880 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020601 03c24c43 054a4f4e 4553074d 414e4147 <64 bytes per line> BBED> find File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 7981 to 8000 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020601 03c24a46 05534d49 54480543 4c45524b <64 bytes per line> BBED> find File: /mnt/ramdisk/book/users01.dbf (4) Block: 524 Offsets: 8100 to 8119 Dba:0x0100020c ----------------------------------------------------------------------------------------------------- 7c020201 08524553 45415243 48064441 4c4c4153 <64 bytes per line> BBED> find BBED-00212: search string not found --//记下偏移7523 7594 7705 7861 7981 8100,注意看看是否正确. assign offset 7523 = 0x6c assign offset 7594 = 0x6c assign offset 7705 = 0x6c assign offset 7861 = 0x6c assign offset 7981 = 0x6c assign offset 8100 = 0x6c BBED> assign offset 8125=0x6 ub1 rowdata[0] @8125 0x06 BBED> assign offset 8126=0x0 ub1 rowdata[0] @8126 0x00 --//如果不修改mref值.报如下错误. BBED> assign offset 8125=0x0 ub1 rowdata[0] @8125 0x00 BBED> sum apply Check value for File 4, Block 524: current = 0x8bed, required = 0x8bed BBED> verify DBVERIFY - Verification starting FILE = /mnt/ramdisk/book/users01.dbf BLOCK = 524 Block Checking: DBA = 16777740, Block Type = KTB-managed data block data header at 0x1964c64 kdbchk: key comref count wrong keyslot=1 Block 524 failed with check code 6121 --//继续: assign offset 8125=0x6 assign offset 8126=0x0 BBED> sum apply Check value for File 4, Block 524: current = 0x8ded, required = 0x8ded BBED> verify DBVERIFY - Verification starting FILE = /mnt/ramdisk/book/users01.dbf BLOCK = 524 Block Checking: DBA = 16777740, Block Type = KTB-managed data block data header at 0x7fbd9434c264 kdbchk: the amount of space used is not equal to block size used=771 fsc=177 avsp=7317 dtl=8088 Block 524 failed with check code 6110 --//OK,这个错误不修复了. SCOTT@book> select * from empx where deptno=20; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20 7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20 7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20 7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20 SCOTT@book> select * from deptx where deptno=20; no rows selected --//索引没有同步. SCOTT@book> select /*+ full(deptx) */ * from deptx where deptno=20; DEPTNO DNAME LOC ---------- -------------- ------------- 20 RESEARCH DALLAS SCOTT@book> alter index pk_deptx rebuild online ; Index altered. SCOTT@book> select * from deptx where deptno=20; DEPTNO DNAME LOC ---------- -------------- ------------- 20 RESEARCH DALLAS --//注意empx的索引也要修复.不然: SCOTT@book> select * from empx; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30 7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30 7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10 7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30 7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30 7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10 9 rows selected. SCOTT@book> alter index pk_empx rebuild online; Index altered. --//注意一定要加入online参数.
[20180129]简单探究cluster table(补充)4.txt
来源:这里教程网
时间:2026-03-03 12:55:06
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 我们都被骗了,所有的跨平台迁移都可以通过XTTS实现
我们都被骗了,所有的跨平台迁移都可以通过XTTS实现
26-03-03 - Oracle 客户端安装
Oracle 客户端安装
26-03-03 - MathType中如何更改公式颜色操作详解
MathType中如何更改公式颜色操作详解
26-03-03 - 谷歌:Oracle Java 胜诉将杀死软件开发,要求美最高法院必须作出裁决!
- 探寻大表删除字段慢的原因
探寻大表删除字段慢的原因
26-03-03 - 强强联合|华云网际&颉一科技将共同开创中国二级数据高端市场
强强联合|华云网际&颉一科技将共同开创中国二级数据高端市场
26-03-03 - [20190118]toad下如何调试存储过程和函数.txt
[20190118]toad下如何调试存储过程和函数.txt
26-03-03 - 不删内容 减小Word文件体积小技巧
不删内容 减小Word文件体积小技巧
26-03-03 - Word文档内容的选取技巧
Word文档内容的选取技巧
26-03-03 - rac下修改内存配置后数据库无法启动问题
rac下修改内存配置后数据库无法启动问题
26-03-03
