zoukankan      html  css  js  c++  java
  • oracle BBED 直接改动数据库block块

    1.BBED配置

    1)将相应文件放到$ORACLE_HOME/rdbms/mesg和$ORACLE_HOME/rdbms/lib中;
        --将lib中bbedus.msb和bbedus.msg 放在$ORACLE_HOME/rdbms/mesg下
        --将lib中sbbdpt.o和ssbbded.o 放在$ORACLE_HOME/rdbms/lib下
    2)安装BBED

        --在$ORACLE_HOME/rdbms/lib下运行:
    [oracle@jibo lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
        --运行后会在lib下生成一个bbed可运行文件
    默认password;
    blockedit

    3)配置參数文件和数据文件列表
    --參数文件:

    cd /home/oracle
    vi bbed.par
    blocksize=8192
    listfile=/home/oracle/list.log
    mode=edit

    这个文件是bbed的配置文件,配置了blocksize,listfile,mode 三个參数,我们在启动的时候,使用这个文件把bbed拉起来。
    SQL> show parameter db_block_size
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_block_size                        integer     8192
    SQL>
     
    [oracle@dell1 home]$ cat bbed.log
    blocksize=8192
    listfile=/home/oracle/list.log
    mode=edit

    mode=edit  默认是borwser 浏览模式
    能够使用 set mode edit 来切换


    --数据文件列表:
    vi list.log
    这个文件相应的3个列为。file_id,path,block_size,能够使用SQL生成:

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

    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

    oracle BBED 直接改动数据库block块
    bbed就是英文block browse block edit的缩写,用来直接查看和改动数据文件数据的一个工具。

    4)进入BBED

    在$ORACLE_HOME/rdbms/lib下
    ./bbed parfile=/home/oracle/bbed.par

    2.构造測试数据:

    新建一个表,插入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,
             user_id,username from t
             where rownum <6;
     
       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 ,也就是第一行。


     
    3.备份数据文件

    RMAN> backup datafile plus archivelog;
    或者
    RMAN> backup datafile 4;

    4.直接改动数据库block块

    1)bbed概览
    -- 进入bbed
    [oracle@dell1 home]$./bbed parfile=/home/oracle/bbed.par 或者直接是 ./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   查看全部命令帮助

    最经常使用的有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
     
    2)确定文件和块
    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里的偏移量。能够用+和-进行操作

    还有非常多种,不多写了。參见:http://blog.csdn.net/tianlesoftware/article/details/5006580
    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>

    3)改动块
    TEST_USER1@PROD> select dump('aa',1016) from dual;
     DUMP('AA',1016)
    ----------------------------------------------------------------------------------
     Typ=96 Len=2 CharacterSet=US7ASCII: 61,61
     
     在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  (注意长度。不能超过建表时候设置的长度,否则会出错)
    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
    Total Blocks Marked Corrupt   : 0
    Total Blocks Influx           : 0
     
    /*
    Total Blocks Marked Corrupt   : 0。表示木有错误
    在实际工作其中,假设发现改动错误了,则能够通过undo。revert进行回滚操作。
    在上面最经常使用的基本命令里面讲过了, 请注意undo和 revert的差别。
    */

    4.在sqlplus中查看改动结果
    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
    ok。下一次继续写当数据库,因为某个数据文件不一致。启动不来的时,改怎么样去改动datafile header的 SCN 号。

    使其和控制文件的SCN号一致!

  • 相关阅读:
    hdu 1711Number Sequence
    hdu 4911Inversion
    DataView数据变化的各种状态
    c#中的dataview数据视图的sort属性进行排序,用rowfilter属性进行筛选,完成学生档案信息的显示。
    DataView.RowFilter筛选DataTable中的数据
    C# 递归产生树
    treeview递归绑定的两种方法
    C#递归加载树
    c# DropDownList 下拉框实现树形导航
    C# ComboBox 下拉显示层次(树)
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7117302.html
Copyright © 2011-2022 走看看