oracle
NinGoo's blog

安装使用BBED

一次故障处理中,使用到了BBED(Oracle Block Brower and EDitor Tool),这是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。该工具不受Oracle支持,所以默认是没有生成可执行文件的,在使用前需要重新连接。

在9i/10g中连接生成bbed:

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

以上生成的bbed可执行文件在$ORACLE_HOME/rdbms/lib目录,可以复制到其他位置或者其他同Oracle版本的机器上运行。也可通过以下命令将bbed生成到$ORACLE_HOME/bin目录

make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed

在11g中生成bbed,需要先从10g中复制如下文件到相应目录,然后再执行上述连接命令:

$ORACLE_HOME/rdbms/lib/ssbbded.o
$ORACLE_HOME/rdbms/lib/sbbdpt.o
$ORACLE_HOME/rdbms/mesg/bbedus.msb

BBED设置了口令保护,密码为blockedit。BBED的命令行参数:

$bbed help=yes
PASSWORD - Required parameter
FILENAME - Database file name
BLOCKSIZE - Database block size
LISTFILE - List file name
MODE - [browse/edit]
SPOOL - Spool to logfile [no/yes]
CMDFILE - BBED command file name
LOGFILE - BBED log file name
PARFILE - Parameter file name
BIFILE - BBED before-image file name
REVERT - Rollback changes from BIFILE [no/yes]
SILENT - Hide banner [no/yes]
HELP - Show all valid parameters [no/yes]

一般将一些常用选项写入到一个parfile中:

blocksize=8192
listfile=filelist.txt
mode=edit

其中filelist.txt列出了需要使用BBED编辑的数据文件列表,格式为

文件编号 文件名字 文件大小

1 /u01/oracle/oradata/NinGoo/system.dbf 2097160192
2 /u01/oracle/oradata/NinGoo/test.dbf 2097160192

这里的文件编号不一定要和数据库里的file_id相同,当然最好能设置相同,以免在处理过程中搞混淆了。

$bbed parfile=bbed.par
Password: 

BBED: Release 2.0.0.0.0 - Limited Production on Sun Nov 15 00:26:14 2009

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

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

BBED> help
HELP [  | ALL ]

BBED> help all
SET DBA [ dba | file#, block# ]
SET FILENAME 'filename'
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] 'filename'
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE  [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]
SHOW [  | ALL ]
INFO
MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
:
N - a number which specifies a repeat count.
u - a letter which specifies a unit size:
  b - b1, ub1 (byte)
  h - b2, ub2 (half-word)
  w - b4, ub4(word)
  r - Oracle table/index row
f - a letter which specifies a display format:
  x - hexadecimal
  d - decimal
  u - unsigned decimal
  o - octal
  c - character (native)
  n - Oracle number
  t - Oracle date
  i - Oracle rowid
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
MODIFY[/x|d|u|o|c] numeric/character string
      [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
ASSIGN[/x|d|u|o] =
 : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
 : [ value |  ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [  | ALL ]
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

关于bbed的具体用法,这里就不罗嗦了,有兴趣的可以自行学习,下面这篇参考文档非常的详尽:
http://orafaq.com/papers/dissassembling_the_data_block.pdf

记一次redo损坏导致ora-600[4000]的恢复

据说今天是光棍节,逢年过节,必有大事。快下班的时候,一位朋友碰到了一个大问题,数据库服务器异常断电重启以后,数据库无法启动,报ora-600[4000]错误,尝试了使用隐藏参数,还是无法打开。

ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [4000], [46], [], [], [], [], [], []

ora-600内部错误的类型可以看到,4000是trasaction undo相关的内部错误。搜索一下可以发现,logzgh同学已经两次碰到过该问题了(第一次第二次)。看来在异常宕机的情况下,这个问题出现的机率还是比较高的。既然是有先例的,恢复起来应该是没有问题的,这个案例和logzgh的第一个案例基本一样,trace文件里显示也是obj$上有异常事务:

ORA-00600: internal error code, arguments: [4000], [46], [], [], [], [], [], []
Current SQL statement for this session:
select ctime, mtime, stime from obj$ where obj# = :1

将trace文件往下翻,可以看到出现问题的block的dump信息,在block的itl中果然有一条活动事务存在。用bbed找到对应块,设置offset到61,将itl的flag从20改为80,重新计算block的checksum并apply。然后尝试重新启动数据库,这次ora-600[4000]错误没有了,报的是ora-600[2662]错误,数据库无法open。2662就比较容易了,网上相关的处理案例已经一大堆了,将数据库启动到mount状态,设置10015事件来调整scn即可

alter session set events '10015 trace name adjust_scn level 1';

如果数据库已经处于open状态,则可以使用如下语句来调整SCN:

alter session set events 'IMMEDIATE trace name ADJUST_SCN level x';

再次重新打开库,报ora-600[2256],继续使用10015事件,这次level设置为(ora-600错误的第三个参数+1)*4

alter session set event '10015 trace name adjust_scn level 20';

重启,报ora-600[4097]错误,好了,现在基本上恢复已经接近尾声了,使用下面几个隐藏参数,可以正常将数据库打开了。接下来就是告诉朋友做全库export/重建库/import了。

_allow_resetlogs_corruption=true
_allow_terminal_recovery_corruption=true
_corrupted_rollback_segments=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$, _SYSSMU6$,
 _SYSSMU7$, _SYSSMU8$, _SYSSMU9$, _SYSSMU10$)

年关将近,事故高发时期,阿弥陀佛,多求个平安吧。话说这个案例还没来得及些写呢,晚上回家的路上又接到说有人truncate了一张表。。。

OOW2009美国行:大会第四天

14号上午没有想听的session,就出去转了转。酒店和会场就在旧金山的购物大街Market Street旁边没多远的Howard Street,走过去几分钟就够了。Market Street街上很多名牌专卖店,我基本都是不懂的,再过去一点就是联合广场(Union Square),号称全美三大购物中心之一,看了看好像也没感觉有啥特别的地方的,把要买东西的几个店的地方摸清楚就回去吃午饭了。

第四天的重头戏,自然是拉里埃里森的演讲,据说加州州长,终结者阿诺施瓦辛格同学也会来捧场,更加的有噱头。所以下午2:45分才开始的keynote,而且前面一个小时还是infosys的CEO的预热场,结果吃饭午饭不久就开始排起来了长龙。因为不想排队,我和Fenng又出去转了一圈,打算等四点左右看能不能混进会场,事实证明是不可行的。没办法,我们只能在昨天听tom讲课的教室里看大屏幕直播。进去的时候埃里森正在不遗余力的推广Sun Oracle Database Machine(Exadata v2),PPT上甚至出现了大段大段的技术细节描述。

oow2009_27

埃里森在ppt里公布了Exadata V2的价格:
oow2009_26

讲到中途,拉里正在拿一千万悬赏跟IBM宣战呢,后面突然冒出几个人搬上讲台和凳子,施瓦辛格闪亮出场了。阿诺在演讲中大肆赞言了技术对加州的重要性,也顺带拍了下Oracle和Sun的马屁。曾经的终结者,如今的州长,世事变迁,岁月流转,一切皆有可能。演讲的最后,施瓦辛格开玩笑说请大家帮个忙,留在这就别走了,多花钱消费,加州需要你们的money,全场一片哄笑。施瓦辛格来去匆匆,一分钟都不耽误,演讲一完成立马跑路。然后拉里再接着之前的话题继续推销Exadata,也没说要尊重领导,要等领导先讲之类的。

oow2009_28

终于还是不死心,又听了Tom的最后一场《Effective PL/SQL》,这次近距离的拍了一场tom的特写。

oow2009_29

晚上Oracle在金银岛(Treasure Island)举办了一个盛大的party,请了四支乐队(Aerosmith,Roger Daltrey,The Wailers,THree Dog Night),准备了大量的游乐设施和食品,几万人的狂欢之夜。现场感受了Aerosmith乐队疯狂震撼的演出,真的是震耳欲聋,声嘶力竭。回到酒店已经凌晨一点了,所以blog也是今天补记的。

oow2009_30

oow2009_32

oow2009_31

于我而言,OOW2009到第四天就算是结束了,第五天已经没有和database相关的session了,正好可以趁机好好逛一下旧金山,顺带扫货回家咯。

OOW2009美国行:大会第三天

美国太平洋时间10月13日,中国北京时间10月14日,OOW2009时间第三日,雨。壬辰水箕破日,日值月破,大事不宜。

今天不再受东西部时差困扰,一觉睡到早上八点。拉开窗帘一看,旧金山笼罩在阴云细雨中,于是早上八点半开始的keynote就没有去听。熬到十点多,雨还是不停,只好冒雨跑到旁边不远的Moscone west的展厅,嗯,先到那里解决早餐的问题。昨天在展厅走马观花,没有细看,原来GoldenGate也有展台。
oow2009_18

在昨天的session中,了解到Sun Oracle Database Machine备份数据到磁带可以达到7.8TB/小时,刚好今天上午有个session讲关于database machine备份和恢复的,就去听了听。原来昨天的数据就是今天讲的一个测试环境测试出来的。
oow2009_19

听完还特意跑到keynote会场旁边放的五台Database Machine旁边给它们拍了一张特写。
oow2009_20

今天中午比较好运,找到一份有鸡肉的快餐,做为一个无肉不欢的DBA,这是一件值得庆幸的事情。昨天在Salesforce.com展台领了件T-shirt,结果收到邮件说今天下午一点他们有个session,前500位参加的送一台Flip HD camera。吃完饭看还差三十分钟就想去排队,结果队伍已经排到了外面大街上,雨还在稀里哗啦的下,我又没带雨伞,只好作罢。回头随便找了个session,《managing statistcs for optimal query performance》,实际上在这样的大会上听这种比较深入的技术课程是比较难听进去的。这个session的讲师是一位女士,非常风趣的利用扑克牌将课程讲得更加浅显易懂,这个ppt回去以后应当去找找,用来给新人做培训非常不错。
oow2009_21

接下来走了几个会场都没找到想听的,外面雨越来越大,就想打道回酒店休息。顺道去会场里的Oracle Book Store里转了一下,买了件印有Oracle Logo的抓绒外套,加税82刀多,还不打折,NND,肉痛。