参考链接
一、 查询EMP表的数据块信息
1. 查询数据段的头部数据块信息
SET lines 2000 pagesize 200
SELECT header_file,
header_block
FROM dba_segments
WHERE segment_name = 'EMP';
输出结果:
HEADER_FILE HEADER_BLOCK
----------- ------------
4 146
2. 查询某条数据的数据块信息
SET lines 2000 pagesize 200
SELECT dbms_rowid.Rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.Rowid_block_number(rowid) BLOCKNO,
dbms_rowid.Rowid_row_number(rowid) ROWNO,
empno,
ename
FROM scott.emp
WHERE empno = 7369;
输出结果:
REL_FNO BLOCKNO ROWNO EMPNO ENAME
---------- ---------- ---------- ---------- ----------
4 151 0 7369 SMITH
二、 转储数据块
alter system dump datafile 4 block 151;
三、 确定转储文件
1. 确定转储文件所在目录
show parameter user_dump_dest
或者
SELECT value
FROM v$parameter
WHERE name = 'user_dump_dest';
2. 确定转储文件的文件名
转储文件文件名格式为DGWH_ora_pid.trc(os进程id),所以唯一要确定的就是这个os进程id
方法一
在转储文件所在目录下执行以下查看文件的命令,最下面的就是转储文件了(我真是个人才,*-*)
ls -lrt | grep DGWH_ora
方法二
另开一个连接,执行以下查看进程的命令,可以获得当前连进数据库os进程id(有多个就自己结合转储目录下的文件瞎猜吧)
ps -ef | grep DESCRIPTION
方法三
结合v$session和v$process视图查看当前进程的os进程id
SELECT spid
FROM v$session s,
v$process p
WHERE p.addr = s.paddr
AND s.audsid = Sys_context('userenv', 'sessionid');
方法四
通过查询v$diag_info视图获得
SELECT value
FROM v$diag_info
WHERE name = 'Default Trace File';
四、 分析转储文件
1. 查询EMP表第一行数据信息
SELECT empno,
ename,
job,
hiredate
FROM scott.emp
WHERE rownum > 0
AND rownum < 2;
输出:
EMPNO ENAME JOB MGR HIREDATE
---------- ---------- --------- ---------- -------------------
7369 SMITH CLERK 7902 1980-12-17 00:00:00
2. 转储文件中第一行数据的信息
block_row_dump:
tab 0, row 0, @0x1d49
tl: 38 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4a 46
col 1: [ 5] 53 4d 49 54 48
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 50 03
col 4: [ 7] 77 b4 0c 11 01 01 01
col 5: [ 2] c2 09
col 6: *NULL*
col 7: [ 2] c1 15
3. 分析第一个字段的数字数据信息
SELECT utl_raw.Cast_to_number(Replace('c2 4a 46', ' ')) value
FROM dual;
输出:
VALUE
----------
7369
4. 分析第二个字段的字符数据信息
SELECT utl_raw.Cast_to_varchar2(Replace('53 4d 49 54 48', ' ')) value
FROM dual;
输出:
VALUE
---------
SMITH
转储文件中的数据与EMP表中数据是一样的。
五、 附记
oracle变量获取用户输入
SELECT utl_raw.Cast_to_varchar2(Replace(&s, ' ')) value
FROM dual;
用 &+变量名 获取用户输入
网友评论