明明白白使用数据块 —-数据块格式深入解析
一、建表空间
SQL>create tablespace tp1 datafile ‘/oradata/bxocp/tp01.dbf’ size 10M;
二、建用户及授权
SQL>create user gyj identified by gyj default tablespace tp1;
SQL>grant dba to gyj;
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
三、建表
SQL>conn gyj/gyj
SQL>create table t1 (id int,name varchar2(100));
四、插入一行数据
SQL>insert into t1 values(1,’AAAAA’);
SQL>commit;
五、手动发生一个检查点,使上面一行数据写到数据文件
alter system checkpoint;
六、查这行数据所在的文件号和块号
SQL>col name for a10
SQL>select id,name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block# from t1;
ID NAME FILE# BLOCK# ---------- --------- ---------- ---------- 1 AAAAA 6 135
七、转储6号文件135号块,新开个窗口
[[email protected] ~]$ sqlplus / as sysdba
SQL> alter system dump datafile 6 block 135;
八、找到转储的文件
SQL> show parameter dump
NAME TYPE VALUE
background_core_dump string partial
background_dump_dest string /u01/app/oracle/diag/rdbms/bxo
cp/bxocp/trace
再开一新窗口
[[email protected] ~]$ cd /u01/app/oracle/diag/rdbms/bxocp/bxocp/trace
[[email protected] trace]$ ls -lFtr
下面这个跟踪日志就是6号文件135号块转储出来的数据块信息
-rw-r—– 1 oracle oinstall 3363 Dec 11 18:02 bxocp_ora_5429.trc –
九、分析数据块结构
[[email protected] trace]$ vi bxocp_ora_5429.trc
Trace file /u01/app/oracle/diag/rdbms/bxocp/bxocp/trace/bxocp_ora_5429.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0
System name: Linux
Node name: guoyj
Release: 2.6.18-128.el5
Version: #1 SMP Wed Dec 17 11:41:38 EST 2008
Machine: x86_64
VM name: VMWare Version: 6
Instance name: bxocp
Redo thread mounted by this instance: 1
Oracle process number: 28
Unix process pid: 5429, image: [email protected] (TNS V1-V3)
* 2012-12-11 18:02:31.307
* SESSION ID:(29.15) 2012-12-11 18:02:31.307
* CLIENT ID:() 2012-12-11 18:02:31.307
* SERVICE NAME:(SYS$USERS) 2012-12-11 18:02:31.307
* MODULE NAME:([email protected] (TNS V1-V3)) 2012-12-11 18:02:31.307
* ACTION NAME:() 2012-12-11 18:02:31.307
Start dump data blocks tsn: 7 file#:6 minblk 135 maxblk 135
Block dump from cache:
Dump of buffer cache at level 4 for tsn=7 rdba=25165959
BH (0x7f3f6958) file#: 6 rdba: 0x01800087 (6/135) class: 1 ba: 0x7f33a000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 103,28
dbwrid: 0 obj: 76987 objn: 76987 tsn: 7 afn: 6 hint: f
hash: [0x908b5100,0x908b5100] lru: [0x7f3f6910,0x7f3f6b70]
ckptq: [NULL] fileq: [NULL] objq: [0x7f3f6938,0x8d148e00] objaq: [0x7f3f6948,0x8d148df0]
st: XCURRENT md: NULL fpin: ‘ktspbwh2: ktspfmdb’ tch: 3
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
Block dump from disk:
1、数据块头部分
buffer tsn: 7 rdba: 0x01800087 (6/135)
scn: 0x0000.0015a3eb seq: 0x01 flg: 0x06 tail: 0xa3eb0601frmt: 0x02 chkval: 0xec19 type: 0x06=trans data
flg:0x01 (新建块)0x2(数据块延迟清洗推进scn和seq) 0X04(设置校验和) 0x08(临时块)
type:0x06(表/索引块)
frmt: 0x01(v7) 0x02(v8)
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00002B70E9566A00 to 0x00002B70E9568A00
2B70E9566A00 0000A206 01800087 0015A3EB 06010000 […………….]
2B70E9566A10 0000EC19 00000001 00012CBB 0015A3EA [………,……]
2B70E9566A20 00000000 0032F802 01800080 000F0004 [……2………]
2B70E9566A30 00000346 00C00793 002200BB 00002001 [F………”.. ..]
2B70E9566A40 0015A3EB 00000000 00000000 00000000 […………….]
2B70E9566A50 00000000 00000000 00000000 00000000 […………….]
2B70E9566A60 00000000 00010100 0014FFFF 1F781F8C […………..x.]
2B70E9566A70 00001F78 1F8C0001 00000000 00000000 [x……………]
2B70E9566A80 00000000 00000000 00000000 00000000 […………….]
Repeat 502 times
2B70E95689F0 0202012C 410502C1 41414141 A3EB0601 [,……AAAAA….]
2.ITL
Block header dump: 0x01800087
Object id on Block? Y
seg/obj: 0x12cbb csc: 0x00.15a3ea itc: 2 flg: E typ: 1 – DATA
brn: 0 bdba: 0x1800080 ver: 0x01 opc: 0 inc: 0 exflg: 0
seg/obj: 0x12cbb –16进制转成10进制76987
SQL> select object_id from dba_objects where object_name=’T1′ and owner=’GYJ’;
OBJECT_ID
76987
csc: 0x00.15a3ea –cleanoutSCN,块清除时的SCN
itc: 2 –ITL槽的数量
flg: E –指用的是ASSM,如果是O表示用的是free list
typ: 1 – DATA –事务型的数据块(并且:数据块头的type:0x06),存放表和索引数据。
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00f.00000346 0x00c00793.00bb.22 –U- 1 fsc 0x0000.0015a3eb
0x02 0x0000.000.00000000 0x00000000.0000.00 —- 0 fsc 0x0000.00000000
Itl: ITL事务槽号的流水编号
Xid:transac[X]tion identified(事务ID),由und的段号+undo的槽号+undo槽号的覆盖次数三部分组成
Uba:undo block address记录了最近一次的该记录的前镜像(修改前的值)
Flag:C是提交,U是快速提交,—是未提交(Flg C=Committed U=Commit Upper Bound T=Active at CSC)
Lck:锁住了几行数据,对应有几个行锁
Scn/Fsc:Scn=SCN of commited TX; Fsc=Free space credit(bytes)
这里fsc 0x0000.0015a3eb是指提交的scn,这个值大于上次清除块时的scn=csc: 0x00.15a3ea(此scn是这个块中最小的SCN of commited)
SCN WRAP:如果事务已提交并完成清洗,该字段保存事务提交SCN的SCN WRAP部分,否则该字段保存空闲预支字节数(FSC).比如我删除了一行数据10个字节,在事务提前前,这10个字节就属于fsc(即会写到SCN WRAP),只有事务提交后,才能正式返回到空闲空间。
3.用户数据头
bdba: 0x01800087
data_block_dump,data header at 0x2b70e9566a64
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x2b70e9566a64
76543210
flag=——–
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f8c
avsp=0x1f78
tosp=0x1f78
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f8c
bdba: 0x01800087 — 数据块的地址:16进制转成2进制取前10位二进制为文件号0000 0001 1000 ….. 0000000110=5号文件,后面剩于的部分表示块号,0X87转成10进制为135号块
tsiz: 0x1f98 –top of size 块的总大小即8088个字节
hsiz: 0x14 –Data header size 数据头大小即20个字节
pbl: 0x2b70e9566a64 –Pointer to buffer holding the block
76543210
flag=——– N=pcrfree hit(clusters);F=do not put on free list;K=flushable cluster keys
ntab=1 –叫表数:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)
nrow=1 –叫行数:表示这个表有一行数据
frre=-1 — The first free row entry in the row directory=you have to add one
fsbo=0x14 — Free space begin offset 叫起始空间:可以存放数据空间的起始位置(即定义了数据层中空闲空间的起始offset)
fseo=0x1f8c — Free space end offset 叫结束空间:可以存放数据空间的结束位置(即定义了数据层中空闲空间的结束offset)
avsp=0x1f78 –Available space for new entries 叫空闲空间:定义了数据层中空闲空间的字节数
tosp=0x1f78 –Total space 叫最终空闲空间:定义了ITL中事务提交后,数据层中空闲空间的字节数
0xe:pti[0] nrow=1 offs=0 –Table directory,整个表的开始,共一行数据 ,定义了该表在行索引中使用的插槽数
0x12:pri[0] offs=0x1f8c –Row index,叫行索引,定义了该块中包含的所有行数据的位置
4.用户数据
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: –H-FL– lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 5] 41 41 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 135 maxblk 135
tab 0, row 0, @0x1f8c –第一个表第一行的位置 ,定义了该表在行索引中的起始插槽号
tl: 12 fb: –H-FL– lb: 0x1 cc: 2 –行头,tl: 12行长度12个字节,
fb: (Flag byte)–H-FL指H(Head piece of row)F(First data piece) L(Last data piece)
lb: 0x1 –Lock byte和上面的ITL的lck相对应,表示这行是否被lock了
cc: 2 –表示有两列,即这个表有两个字段
col 0: [ 2] c1 02 –第一行的第一个字段长度和值
col 1: [ 5] 41 41 41 41 41 –第一行的第二个字段长度和值
数据块的最后四字节tail: 0xa3eb0601=scnBASE+flg+seq,如果不相等会报块损坏!!!
5、下面对这些数据用SQL语句做相互转换
(1)把表中的数据转成16进制(即在ORACLE内部数据块看到的数据),用以下sql语句:
[email protected]> select id,name,dump(01,’16’), dump(‘AAAAA’,’16’) from t1;
ID NAME DUMP(01,’16’) DUMP(‘AAAAA’,’16’)
1 AAAAA Typ=2 Len=2: c1,2 Typ=96 Len=5: 41,41,41,41,41
(2)反过来把16进制转成表中的数据(当然我这边的数据类型只考虑了number和varchar类型),用以sql下语句:
[email protected]> col id for [email protected]> col id1 for 999
[email protected]> col name for a10
[email protected]> col name1 for a10
[email protected]> select id,UTL_RAW.CAST_TO_NUMBER(replace(‘ c1 02 ‘,’ ‘)) id1,
2 name,UTL_RAW.CAST_TO_VARCHAR2(replace(’41 41 41 41 41′,’ ‘)) name1
3 from t1;
ID ID1 NAME NAME1
1 1 AAAAA AAAAA
一、对于我上面讲的: 1、数据块头部分中讲的flg标志再做一些详细的补充0x01 (新建块)
0x2 (数据块延迟清洗推进scn和seq)
0X04 (设置校验和)
0x08 (临时块)
对于 flg标志的值是由上面一些位做组合运算的,下面我们来看几下例子:
1、先来看看0x01 (新建块)和0X04 (设置校验和) 的组合
我的版本是11gr2
[email protected]> select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production
由于11gr2在创建表的时侯有个延迟段参数的控制,默认不分配EXTNETS空间
[email protected]> show show parameter deferred_segment_creation
showmode OFF
NAME TYPE VALUE
deferred_segment_creation boolean TRUE
那么我在建表的同时要立马分配EXTENTS,好我马上建个表,操作如下:
[email protected]> create table t20(id int ,name varchar2(10)) SEGMENT CREATION IMMEDIATE;
Table created.
查分配的区号,文件号,块号
[email protected]> select extent_id,file_id,block_id from dba_extents where segment_name=’T20′;
EXTENT_ID FILE_ID BLOCK_ID
0 3 152
对3号文件的152号块做DUMP,做dump时最好新打会一个会话,避免产生不必要的日志,操作如下
[[email protected] ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 18 07:40:55 2013
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[email protected]> alter system dump datafile 3 block 152;
System altered.
好,现在马上到找到跟踪日志
[email protected]> show parameter dump
NAME TYPE VALUE
background_core_dump string partial
background_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
core_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /u01/app/oracle/diag/rdbms/ocm
/ocm/trace
[[email protected] trace]$ cd /u01/app/oracle/diag/rdbms/ocm/ocm/trace
[[email protected] trace]$ ls -lFtr
[[email protected] trace]$ more ocm_ora_12910.trc
贴出数据块头的信息:
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa798 type: 0x00=unknown
从上面看出flg是flg: 0x05,就是0x01 +0x04的组合,
0x01说明这是一个新建的块,因为我的表的是刚刚创建的,没有向块中插入数据。
0x04说明有设置校验,chkval: 0xa798这个就是校验和,这个与参数db_block_checksum有关
[email protected]> show parameter db_block_checksum
NAME TYPE VALUE
db_block_checksum string TYPICAL
默认设置了db_block_checksum,就会启动校验和检查数据块的一致性。另外数据块尾部的4个字节也是配合数据块头来验证数据块的一致性。
如果一个块头被标识成软损坏,那么块头的序列号为0xff,标志为0x00
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- 学生数据库管理系统
- SpringDataJpa 用MySQL语句怎么分页,spring全家桶SpringDataJpa 用MySQL语句怎么分页
- Docker创建MySQL容器模板命令
- Elasticsearch对应MySQL的对应关系
- 使用SpringDataJpa保存(save)报错误:SQL Error: 1062, SQLState: 23000 控制台会报:Duplicate entry ‘数‘ for key ‘PRIMA
- Navicat Premium 连接sqlserver数据库时提示安装Client失败,解决方案
- Mysql查询当前用户所有数据库语句(SHOW DATABASES)
- MySQL语句-查看当前数据库有哪些表(SHOW TABLES)
- MySQL5.0版本以上新增的 information_schema 数据库是什么?
- MariaDB数据库备份之逻辑备份
- MariaDB数据库创建用户
- MariaDB数据库给用户授权
- MariaDB数据库刷新权限表命令
- MariaDB数据库删除用户命令
- PhpStudy 2016搭建-sqli-libs靶场
- MySQL手动注入步骤
- Pikachu靶场-SQL注入-数字型注入(post)过关步骤
- Pikachu靶场-SQL注入-字符型注入(get)过关步骤
- 利用SQL注入漏洞实现MySQL数据库读写文件
- Kali-工具-sqlmap常见用法