Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

65

积分

0

好友

31

主题
1#
发表于 2012-4-14 08:08:01 | 查看: 10187| 回复: 13
今天客户问了一个问题

如何知道一条记录在哪个数据文件中?


想了一下,查了一下资料,但是有些地方还是不清楚,只能在这里求教大师了?

考虑最简单的情况

假设 用户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 编辑 ]
2#
发表于 2012-4-14 09:43:31
想说明啥?
基本上做dba的都知道

回复 只看该作者 道具 举报

3#
发表于 2012-4-14 12:11:46
原帖由 xifenfei 于 2012-4-14 09:43 发表
想说明啥?
基本上做dba的都知道


我的意思我不是很清楚,要麻烦你或者其他大侠看看是否正确?

回复 只看该作者 道具 举报

4#
发表于 2012-4-14 20:46:07
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[0]      nrow=1  offs=0
0x12:pri[0]     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

回复 只看该作者 道具 举报

5#
发表于 2012-4-15 14:41:30
请问这个操作是什么目的呢?

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 编辑 ]

回复 只看该作者 道具 举报

6#
发表于 2012-4-15 14:45:26
我插入过一条记录  

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

回复 只看该作者 道具 举报

7#
发表于 2012-4-15 15:19:28
我的意思

col  0: [ 2]  c1 02
Typ=2 Len=2: c1,2


这个 0是什么意思?第一行,也不对啊?

[ 2] 是类型吗?还是长度?

回复 只看该作者 道具 举报

8#
发表于 2012-4-15 15:58:14
col  0 ==》 第0列 即首个字段 column
[ 2]  这个字段的长度

回复 只看该作者 道具 举报

9#
发表于 2012-4-15 17:39:21
那我还是有疑问啊?
如果不存储类型,那么怎么知道这个 1 是 数值的1 还是字符串的 的 '1'呢?
难道16进制的存储本身就带有了类型信息?

回复 只看该作者 道具 举报

10#
发表于 2012-4-15 18:12:04
还有一个问题是?
绝对文件号貌似意义不大啊,至少在读取数据的时候
因为通过表空间和rowid(获取相对文件号),就能确认某条记录在某个文件中
那么绝对文件号意义似乎意义不大,最多就是知道了有多少个数据文件?
请问我这个理解对吗?

回复 只看该作者 道具 举报

11#
发表于 2012-4-15 20:58:30
"如果不存储类型,那么怎么知道这个 1 是 数值的1 还是字符串的 的 '1'呢?"

数据字典中有 关于列的类型的信息,所以不需要重复存储类型, 试想每一个列都记录其类型是何等的浪费空间。



"因为通过表空间和rowid(获取相对文件号),就能确认某条记录在某个文件中
那么绝对文件号意义似乎意义不大,最多就是知道了有多少个数据文件?"

建议再开一个帖子 讨论该问题

回复 只看该作者 道具 举报

12#
发表于 2012-4-16 22:59:17
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

回复 只看该作者 道具 举报

13#
发表于 2014-8-14 22:37:36
Maclean Liu(刘相兵 发表于 2012-4-14 20:46
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;
也获得了正确的结果

回复 只看该作者 道具 举报

14#
发表于 2014-8-14 23:20:27
etl2007 发表于 2014-8-14 22:37
这个地方貌似你用错了一个东东

select dbms_rowid.rowid_relative_fno(rowid) "FILE NUMBER",

这里确实存在不严谨的问题,虽然我们都知道

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-21 01:28 , Processed in 0.052725 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569