• oracle BBED 直接修改数据库block块


    [b]bbed就是英文block browse block edit的缩写,用来直接查看和修改数据文件数据的一个工具。[/b]

     

    新建一个表,插入5条测试数据:

     

    create table chenlintest (id number(5) , name varchar(10))  tablespace users;

    SQL> insert into chenlintest values(1,'aa');

    1 row created.

    SQL> insert into chenlintest values (888 ,'chenlin') ;

    1 row created.

    SQL> insert into chenlintest values (999 ,'china') ;

    1 row created.

    SQL> insert into chenlintest values (999 ,'usa') ;

    1 row created.

    SQL> insert into chenlintest values (1001 ,'sydney') ;

    1 row created.

    Commit complete.

     

    SQL> select * from chenlintest ;

            ID NAME

    ---------- ----------

             1 aa

           999 usa

          1001 sydney

           888 chenlin

           999 china

     

     

    SQL> SELECT 

             dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

             dbms_rowid.rowid_block_number(rowid) BLOCKNO,

             dbms_rowid.rowid_row_number(rowid) ROWNO,

             id,namefrom chenlintest;

     

       REL_FNO    BLOCKNO      ROWNO         ID NAME

    ---------- ---------- ---------- ---------- ----------

            4     234300          0          1 aa

             4     234300          1        999 usa

             4     234300          2       1001 sydney

             4     234300          3        888 chenlin

             4     234300          4        999 china

     

     

    通过上面的sql语句可以看出,chenlintest这个表的所有数据都在第4号文件的第234300个block块上。

     

    现在我们尝试去修改 aa ,也就是第一行。

     

    设置bbed 的 2个配置文件,

    [b]一个是 file.txt文件[/b]:

    这个文件对应的3个列为,file_id,path,block_size,可以使用SQL生成:

    select file#||' '||name||' '||bytes from v$datafile ;

     

    [oracle@dell1 home]$ /home/oracle> cat file.txt 

     

    1 /opt/oracle/oradata/ge01/system01.dbf 870318080

    2 /opt/oracle/oradata/ge01/users_cms.dbf 524288000

    3 /opt/oracle/oradata/ge01/sysaux01.dbf 1866465280

    4 /opt/oracle/oradata/ge01/users01.dbf 18971361280

    5 /opt/oracle/oradata/ge01/users02.dbf 1073741824

    6 /opt/oracle/oradata/ge01/perstat.dbf 209715200

    7 /opt/oracle/oradata/ge01/undotbs02.dbf 1073741824

    8 /opt/oracle/oradata/ge01/ttuser.dbf 41943040

    9 /opt/oracle/oradata/ge01/idx_2k 20971520

     

    [b]

    一个是bbed.txt:

     

    这个文件是bbed的配置文件,配置了blocksize,listfile,mode 三个参数,我们在启动的时候,使用这个文件把bbed拉起来[/b]。

     

    SQL> show parameter db_block_size

    NAME                                 TYPE        VALUE

    ----------------------------- ----------- -------------

    db_block_size                        integer     8192

    SQL> 

     

    [oracle@dell1 home]$ cat bbed.txt 

    blocksize=8192

    listfile=/home/oracle/file.txt

    mode=edit 

     

    /*

    mode=edit  默认是borwser 浏览模式 

    可以使用 set mode edit 来切换

    */

     

    -- bbed的安装

     

    cd $ORACLE_HOME/rdbms/lib

    make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

    */

    -- 进入bbed

    [oracle@dell1 home]$./bbed parfile=/home/oracle/bbed.txt  或者直接是 ./bbed

    [oracle@dell1 lib]$ pwd

    /opt/oracle/product/10g/rdbms/lib

    [oracle@dell1 lib]$ ll | grep bbed

    -rwxr-xr-x 1 oracle oinstall  536154 May 14 14:47 bbed

     

    [oracle@dell1 lib]$ 

    [oracle@dell1 lib]$ ./bbed

    Password: blockedit

    BBED: Release 2.0.0.0.0 - Limited Production on Mon May 14 17:45:20 2012

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.

    ************* !!! For Oracle Internal Use only !!! ***************

     

    BBED>  help all   查看所有命令帮助

    [b]最常用的有show , map , dump  ,set dba , set file ,set  block  等 

    下面是几个常用的:

    set 设定当前的环境

    show 查看当前的环境参数,跟sqlplus的同名命令类似。

    dump 列出指定block的内容

    find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量--offset,偏移量就是在block中的字节数

    modify 修改指定block的指定偏移量的值,可以在线修改。

    copy 把一个block的内容copy到另一个block中

    verify 检查当前环境是否有坏块

    sum 计算block的checksum,modify之后block就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。

    undo 回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。

    revert 回滚所有之前的修改操作,意思就是 undo all[/b]

     

    BBED> show

     

            FILE#           0

            BLOCK#          1

            OFFSET          0

            DBA             0x00000000 (0 0,1)

            FILENAME       

            BIFILE          bifile.bbd

            LISTFILE       

            BLOCKSIZE       8192

            MODE            Browse

            EDIT            Unrecoverable

            IBASE           Dec

            OBASE           Dec

            WIDTH           80

            COUNT           512

            LOGFILE         log.bbd

            SPOOL           No

     

    BBED> set file 4 

     

    BBED-00312: no LISTFILE specified  /*  LISTFILE为空,说明我们刚刚新建的 file.txt未正确引入进来 */

     

    BBED> set list '/home/oracle/file.txt'

          LISTFILE   /home/oracle/file.txt

     

    BBED> info

     File#  Name                                                        Size(blks)

     -----  ----                                                        ----------

         1  /opt/oracle/oradata/ge01/system01.dbf                           106240

         2  /opt/oracle/oradata/ge01/users_cms.dbf                           64000

         3  /opt/oracle/oradata/ge01/sysaux01.dbf                           227840

         4  /opt/oracle/oradata/ge01/users01.dbf                            524287

         5  /opt/oracle/oradata/ge01/users02.dbf                            131072

         6  /opt/oracle/oradata/ge01/perstat.dbf                             25600

         7  /opt/oracle/oradata/ge01/undotbs02.dbf                          131072

         8  /opt/oracle/oradata/ge01/ttuser.dbf                               5120

         9  /opt/oracle/oradata/ge01/idx_2k                                   2560

     

    BBED> set file 4

            FILE#           4

    --4号文件为 /opt/oracle/oradata/ge01/users01.dbf 

     

    BBED> set block 234300

            BLOCK#          234300

     

    BBED> set block +10

            BLOCK#          234310

     

    BBED> set block -10

            BLOCK#          234300

     

    --偏移量是相对某个block里的偏移量,可以用+和-进行操作

     

     

    还有很多种,不多写了,参见:[url]http://blog.csdn.net/tianlesoftware/article/details/5006580[/url]

     

    BBED> map

     File: /opt/oracle/oradata/ge01/users01.dbf (4)

     Block: 234300                                Dba:0x0103933c

    ------------------------------------------------------------

     KTB Data Block (Table/Cluster)

     struct kcbh, 20 bytes                      @0       

     struct ktbbh, 72 bytes                     @20      

     struct kdbh, 14 bytes                      @100     

     struct kdbt[1], 4 bytes                    @114     

     sb2 kdbr[5]                                @118     

     ub1 freespace[7980]                        @128     

     ub1 rowdata[80]                            @8108    

     ub4 tailchk                                @8188 

     

     

     通过map之后,可以看出真正block的结构体系, 块中的存储是由下往上存储的,( @ 表示偏移量 ),

     

     freespace 在真正的行数据 rowdata 之上,这个@8108开始,到@8188 ,后面放的是数据内容。

     

     我们上面说过的,要改的aa数据就在这2个偏移量中。

     

    BBED> set offset 8108

            OFFSET          8108

    BBED> dump /v  --查看offset 为8180 -8192的数据值

     

     File: /opt/oracle/oradata/ge01/users01.dbf (4)

     Block: 234300  Offsets: 8108 to 8191  Dba:0x0103933c

    -------------------------------------------------------

     2c020203 c20b0206 7379646e 65792c02 l ,.......sydney,.

     0203c20a 64037573 612c0202 03c20a64 l ....d.usa,.....d

     05636869 6e612c00 0203c209 59076368 l .china,.....Y.ch

     656e6c69 6e3c0202 02c10402 63633c02 l enlin<......cc<.

     0202c103 0262622c 000202c1 02026161 l .....bb,......aa

     04066fe1                            l ..o.

     <16 bytes per line>

     

     

    [oracle@dell1 home]$ select dump('aa',1016) from dual;

     

     DUMP('AA',1016)

    -----------------------------------------------------------------------------

     Typ=96 Len=2 CharacterSet=US7ASCII: 61,61

     

     

    可以使用fild查找:

    在find之前先设置想要查找的 file 和 block,默认是十进制的ascii编码,/x 表示16进制,find的结果显示出offset,即字符出现的位置。

     

    通过find查找,“aa”的位置,我们发现6161就是 aa

     

    如果还不确认,可以通过dump来实现 

     

    第一种find方法:

     

    BBED> find   /x 6161 curr 

     

     File: /opt/oracle/oradata/ge01/users01.dbf (4)

     Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

    ------------------------------------------------------------------------

     61610406 6fe1 

     <32 bytes per line>

     

    第二种find方法:

    BBED> 

    BBED>  find /c aa 

     File: /opt/oracle/oradata/ge01/users01.dbf (4)

     Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

    ------------------------------------------------------------------------

     61610406 6fe1 

     <32 bytes per line>

     

     

     通过这2种方法,找到并确认 aa 在 8186 和 8191之间,下面试试修改他,把 aa 改成 bb

     

    BBED> modify /c abcdefg

    BBED-00215: editing not allowed in BROWSE mode

    BBED> set mode edit

            MODE            Edit

     

    BBED> modify /c bb  ([b]注意长度,不能超过建表时候设置的长度,否则会出错[/b])

     

    Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

     File: /opt/oracle/oradata/ge01/users01.dbf (4)

     Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

    ------------------------------------------------------------------------

     61626364 6566 

     <32 bytes per line>

    --让 oracle进行checksum操作

    BBED>  sum dba 4,234300 

    Check value for File 4, Block 234300:

    current = 0xd268, required = 0x3405

    --直接应用

    BBED>  sum dba 4,234300 apply ;

    Check value for File 4, Block 234300:

    current = 0x3405, required = 0x3405

     

    --验证是否修改成功

     

    BBED> verify

    DBVERIFY - Verification starting

    FILE = /opt/oracle/oradata/ge01/users01.dbf

    BLOCK = 234300

     

    DBVERIFY - Verification complete

    Total Blocks Examined         : 1

    Total Blocks Processed (Data) : 1

    Total Blocks Failing   (Data) : 0

    Total Blocks Processed (Index): 0

    Total Blocks Failing   (Index): 0

    Total Blocks Empty            : 0

    [b]Total Blocks Marked Corrupt   : 0[/b]

    Total Blocks Influx           : 0

     

    /*

    Total Blocks Marked Corrupt   : 0,表示木有错误

    在实际工作当中,如果发现修改错误了,则可以通过undo,revert进行回滚操作。

    在上面最常用的基本命令里面讲过了, 请注意undo和 revert的区别。

    */ 

     

    SQL> select * from chenlintest ;

             ID NAME

    ---------- ----------

             1 aa

           999 usa

          1001 sydney

           888 chenlin

           999 china

     

     

    --发现没有变化,考虑是否需要清空buffer cache

     

    SQL> alter system flush buffer_cache;

     

    System altered.

     

    SQL> select * from chenlintest ;

            ID NAME

    ---------- ----------

             1 bb

           999 usa

          1001 sydney

           888 chenlin

           999 china

     

    打完收工,下一次继续写当数据库,由于某个数据文件不一致,启动不来的时,改怎么样去修改datafile header的 SCN 号。使其和控制文件的SCN号一致!

     
  • 相关阅读:
    解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
    QProcess进程间双向通信
    DB2使用存储过程插入数据
    Qt自定义圆周动画(360 10.0 的模仿作者写的)
    经典重温:给微软上课的快乐车夫
    很劲爆!紫光赵伟国在北京微电子会议上12条惊人语录
    中芯国际董事长周子学:技术终有山顶,我们用时间换技术
    windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
    VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
    Qt判断和打开进程(windows端),运行,检测,中止
  • 原文地址:https://www.cnblogs.com/weixun/p/2981517.html
Copyright © 2020-2023  润新知