设为首页 收藏本站
查看: 552|回复: 0

[经验分享] oracle BBED 直接修改数据库block块

[复制链接]

尚未签到

发表于 2016-7-24 13:15:21 | 显示全部楼层 |阅读模式
  
  bbed就是英文block browse block edit的缩写,用来直接查看和修改数据文件数据的一个工具。
  

  新建一个表,插入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个配置文件,
  一个是 file.txt文件
  这个文件对应的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
  

  
  一个是bbed.txt:
  

  这个文件是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.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   查看所有命令帮助
  最常用的有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

   
  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>
   
  

  [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  (注意长度,不能超过建表时候设置的长度,否则会出错)
  

  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的区别。
  */ 
  

  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号一致!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248674-1-1.html 上篇帖子: ORACLE DBA技术学习笔记续1 下篇帖子: Oracle 9201升级到9208出现乱码报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表