如何知道一条记录在哪个数据文件中?
今天客户问了一个问题“
如何知道一条记录在哪个数据文件中?
”
想了一下,查了一下资料,但是有些地方还是不清楚,只能在这里求教大师了?
考虑最简单的情况
假设 用户test,有一个表 table1,里面只有一列col1,也只有一行记录 ,值为 ‘A’
请问这样处理对吗?
这一步的目标是得到相对文件号
select t.col1 , dbms_rowid.rowid_relative_fno(rowid) fno from table1 t
A 11
这一步的目标是得到表空间的名称
select TABLE_NAME,OWNER,TABLESPACE_NAME from all_tables a where a.TABLE_NAME='table1',owner='test';
table1 test test_tablsepace
这一步的目标是根据表空间名称和相对文件号去查找数据文件
表空间名称可以对应绝对文件号
select file_id,relative_fno,tablespace_name, FILE_NAME from dba_data_files where tablespace_name='test_tablsepace' and relative_fno='11';
1 11 test_tablsepace /dev/raw/raw48
所以所对应的记录在 /dev/raw/raw48中
参考资料 http://blog.itpub.net/post/5073/83396
[ 本帖最后由 etl2007 于 2012-4-14 08:38 编辑 ] 想说明啥?
基本上做dba的都知道 原帖由 xifenfei 于 2012-4-14 09:43 发表 http://t.askmaclean.com/images/common/back.gif
想说明啥?
基本上做dba的都知道
我的意思我不是很清楚,要麻烦你或者其他大侠看看是否正确? ODM TEST:
SQL> create table t_row(t1 int) tablespace users;
Table created.
SQL> insert into t_row values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system checkpoint;
System altered.
SQL> select dbms_rowid.rowid_relative_fno(rowid) "FILE NUMBER",
2 dbms_rowid.rowid_block_number(rowid) "BLOCK NUMBER"
3 from t_row;
FILE NUMBER BLOCK NUMBER
----------- ------------
4 589862
SQL> alter system dump datafile 4 block 589862;
System altered.
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug tracefile_name;
/s01/admin/G10R21/udump/g10r21_ora_24962.trc
Start dump data blocks tsn: 4 file#: 4 minblk 589862 maxblk 589862
buffer tsn: 4 rdba: 0x01090026 (4/589862)
scn: 0x0000.010d299b seq: 0x01 flg: 0x06 tail: 0x299b0601
frmt: 0x02 chkval: 0x81db type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0000000006B88600 to 0x0000000006B8A600
Block header dump: 0x01090026
Object id on Block? Y
seg/obj: 0xde25 csc: 0x00.10d2999 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1090021 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.00b.00000df1 0x02003f22.04a0.1b --U- 1 fsc 0x0000.010d299b
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x6b88664
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x06b88664
bdba: 0x01090026
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f92
avsp=0x1f7b
tosp=0x1f7b
0xe:pti nrow=1 offs=0
0x12:pri offs=0x1f92
block_row_dump:
tab 0, row 0, @0x1f92
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c1 02
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 589862 maxblk 589862
SQL> select dump(1,16) from dual;
DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2
SQL> select name from v$datafile where file#=4;
NAME
--------------------------------------------------------------------------------
/s01/oradata/G10R21/datafile/o1_mf_users_7ch80085_.dbf 请问这个操作是什么目的呢?
col 0: [ 2] c1 02
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 589862 maxblk 589862
SQL> select dump(1,16) from dual;
DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2
能否解释一下
“
col 0: [ 2] c1 02
”
和
“
Typ=2 Len=2: c1,2
”
对应关系吗?
[ 本帖最后由 etl2007 于 2012-4-15 14:59 编辑 ] 我插入过一条记录
SQL> insert into t_row values(1);
1 row created.
number 1 对应 oracle 16进制存储是 c1,2, 可以通过 select dump(1,16) from dual; 获得
在dump 的结果中以 以下内容体现:
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c1 02 我的意思
col 0: [ 2] c1 02
Typ=2 Len=2: c1,2
这个 0是什么意思?第一行,也不对啊?
[ 2] 是类型吗?还是长度? col 0 ==》 第0列 即首个字段 column
[ 2] 这个字段的长度 那我还是有疑问啊?
如果不存储类型,那么怎么知道这个 1 是 数值的1 还是字符串的 的 '1'呢?
难道16进制的存储本身就带有了类型信息? 还有一个问题是?
绝对文件号貌似意义不大啊,至少在读取数据的时候
因为通过表空间和rowid(获取相对文件号),就能确认某条记录在某个文件中
那么绝对文件号意义似乎意义不大,最多就是知道了有多少个数据文件?
请问我这个理解对吗? "如果不存储类型,那么怎么知道这个 1 是 数值的1 还是字符串的 的 '1'呢?"
数据字典中有 关于列的类型的信息,所以不需要重复存储类型, 试想每一个列都记录其类型是何等的浪费空间。
"因为通过表空间和rowid(获取相对文件号),就能确认某条记录在某个文件中
那么绝对文件号意义似乎意义不大,最多就是知道了有多少个数据文件?"
建议再开一个帖子 讨论该问题 SQL> select dump (1,16) from dual;
DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2
SQL> select dump ('1',16) from dual;
DUMP('1',16)
----------------
Typ=96 Len=1: 31 Maclean Liu(刘相兵 发表于 2012-4-14 20:46 static/image/common/back.gif
ODM TEST:
SQL> create table t_row(t1 int) tablespace users;
这个地方貌似你用错了一个东东
select dbms_rowid.rowid_relative_fno(rowid) "FILE NUMBER",
dbms_rowid.rowid_block_number(rowid) "BLOCK NUMBER"
from t_row;
你应当用 select dbms_rowid.ROWID_TO_ABSOLUTE_FNO(rowid) "FILE NUMBER",
才对吧
只是当绝对文件号还在1022范围内,所以绝对文件号和相对文件号一致,所以你后面
select name from v$datafile where file#=4;
也获得了正确的结果
etl2007 发表于 2014-8-14 22:37 static/image/common/back.gif
这个地方貌似你用错了一个东东
select dbms_rowid.rowid_relative_fno(rowid) "FILE NUMBER",
这里确实存在不严谨的问题,虽然我们都知道
页:
[1]