日期:2014-05-16  浏览次数:20694 次

bbed小结1--修改数据
1. 安装
10g:
[oracle@styrac1 ~]$ cd $ORACLE_HOME/rdbms/lib/
[oracle@styrac1 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
11g:
拷贝10g的文件

[oracle@styrac2 lib]$ mkdir /tmp/libtmp
[oracle@styrac2 lib]$ mkdir /tmp/msgtmp
[oracle@styrac2 lib]$ cp $ORACLE_HOME/rdbms/lib/ssbbded.o /tmp/libtmp
[oracle@styrac2 lib]$ cp $ORACLE_HOME/rdbms/lib/sbbdpt.o /tmp/libtmp
[oracle@styrac2 lib]$ ls /tmp/libtmp
sbbdpt.o  ssbbded.o
[oracle@styrac2 lib]$ cp $ORACLE_HOME/rdbms/mesg/bbed* /tmp/msgtmp
[oracle@styrac2 lib]$ ls /tmp/msgtmp
bbedus.msb  bbedus.msg
上传到11g服务器上面
cp libtmp/* $ORACLE_HOME/rdbms/lib/
cp msgtmp/* $ORACLE_HOME/rdbms/mesg/
执行make
[oracle@james-test ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@james-test lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
2. 创建flist文件
sys@FAKE> select file#||' '||name||' '||bytes as flist from v$datafile ;
FLIST
----------------------------------
1 /u01/apps/oracle/oradata/fake/system01.dbf 744488960
2 /u01/apps/oracle/oradata/fake/sysaux01.dbf 703922176
3 /u01/apps/oracle/oradata/fake/undotbs01.dbf 325058560
4 /u01/apps/oracle/oradata/fake/users01.dbf 16777216
5 /u01/apps/oracle/oradata/fake/example01.dbf 104857600



[oracle@oel bbed]$ cat flist.txt 
1 /u01/apps/oracle/oradata/fake/system01.dbf 744488960
2 /u01/apps/oracle/oradata/fake/sysaux01.dbf 703922176
3 /u01/apps/oracle/oradata/fake/undotbs01.dbf 325058560
4 /u01/apps/oracle/oradata/fake/users01.dbf 16777216
5 /u01/apps/oracle/oradata/fake/example01.dbf 104857600


3. 创建parfile
sys@FAKE> show parameter db_block_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192




[oracle@oel bbed]$ cat dex.par
blocksize=8192
listfile=/home/oracle/bbed/flist.txt
mode=broswer


方便一下放进环境变量里面
alias bbed='rlwrap bbed parfile=/home/oracle/bbed/dex.par'


4. 下面我们来修改数据



先声明,笔者做实验之前已经有了全集备份,也希望大家在做实验的时候做好备份。

首先补充一下基本知识,假设块大小为

8kb=8192byte

1byte=8bit

dump文件使用16进制编码

所以可以使用2个16进制编码代表1byte

因此一个块中总共有8192*2=16384个0到F的代码构成,每2位代表一个字节。



sys@FAKE> select t.*,
  2         dbms_rowid.rowid_relative_fno(t.rowid) as "FNO#",
  3         dbms_rowid.rowid_block_number(t.rowid) as "BLK#",
  4         dbms_rowid.rowid_row_number(t.rowid) as "ROW#"
  5    from scott.emp t
  6   where t.empno = 7839;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO       FNO#       BLK#       ROW#
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-81       5000                    10          4         29          8




就来修改一下emp 表中 的 7839 这条记录把 修改sal为4000


先来看一下5000的十六制码是多少

sys@FAKE>  select dump(5000,1016) from dual;


DUMP(5000,1016)
------------------
Typ=2 Len=2: c2,33




使用十六进制码查找一下



BBED> find /x c233
 File: /u01/apps/oracle/oradata/fake/users01.dbf (4)
 Block: 29