DUMP DATA BLOCK

参考链接

  1. DMBMS_ROWID
  2. DATA BLOCK
  3. v$session
  4. v$process
  5. sys_context

一、 查询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;

用 &+变量名 获取用户输入

你可能感兴趣的:(DUMP DATA BLOCK)