月归档:2015 年一月

global_name为空导致的数据库不能open—–使用DUL修复

GLOBAL_NAME和props$对象介绍 global_name为空导致的数据库不能open—–使用gdb修复(中断oracle启动的部分监测功能) global_name为空导致的数据库不能open—–使用dd修复(使用dd拷贝块的方式) global_name为空导致的数据库不能open—使用BBED修复(bbed恢复update的数据) 这篇为第3种解决 global_name 为NULL导致数据库不能启动的方法。 即,使用DUL来直接修改一个block内部的数据的方法。 模拟损坏,将global_name置空: 那么如何定位到是哪一个block呢? 答案是N中方法: (1)使用ODU定位这行记录的dba地址 (2)对比其他大版本相同的正常库的相同行的数据 (3)查看报错的trace,找到改行数据的和block 。。。。。。 我们这里使用第二种,查看其他相同版本数据库的信息。具体的方法在第一篇《GLOBAL_NAME和props$对象介绍》 中已经介绍了,这里不再赘述。 首先报错的数据库的alert.log信息如下: 可以看到,当前global_name已经被置空了: 现在修改 修改后的数据如下: 直接启动数据库:

发表在 DUL ODU | 标签为 , , | 留下评论

GLOBAL_NAME和props$对象介绍

有朋友遇到一个老问题,将数据库 global_name 置空后,数据库不能open。 这类问题已经是几年前的老问题了,这里用4中方法解决。 这一篇先大概介绍一下GLOBAL_NAME对象的来龙去脉。 GLOBAL_NAME和props$对象介绍 global_name为空导致的数据库不能open—–使用gdb修复(中断oracle启动的部分监测功能) global_name为空导致的数据库不能open—–使用dd修复(使用dd拷贝块的方式) global_name为空导致的数据库不能open—–使用DUL修复 global_name为空导致的数据库不能open—使用BBED修复(bbed恢复update的数据) 我们知道,全局数据库名是在分布式数据库系统中用于标识数据库的唯一名称,默认为DB_NAME.DB_DOMAIN。 该默认值在数据库创建的时候被标记,如果数据库创建后手工修改了DB_NAME或者DB_DOMAIN,全局数据库名称仍然保持为数据库创建时候的DB_NAME.DB_DOMAIN。 我们查看一下GLOBAL_NAME是什么类型的对象,其定义是怎样的: 可以看到,GLOBAL_NAME实际上是已于sys.props$ where name = ‘GLOBAL_DB_NAME’的一张视图和同义词。 props$中总共多少行数据,在相同版本是固定的,我这里是11.2,因此共36行: props$的定义如下: 看一下props$对象存储了哪些内容: 当数据库正常启动时,会对PROPS$表进行全表扫描来获取PROPS$中是否含有错误信息。 一般升级的时候系统会将数据库引导对象的错误信息记录到该表的BOOTSTRAP_UPGRADE_ERROR中: 启动时10046跟踪的trace中: 从这里我们看到,读取了file#=1 block#=800和file#=1 block#=801,他们分别为props$的段头和第一个数据块的位置。 他们的对象号是obj#=98,也就是props$。 从数据库中,我们也可以证实这一点:

发表在 Internal | 标签为 , | 留下评论

BBED简介

Oracle8i 的BBED在windows 平台下的$ORACLE_HOME/bin下可以找到 ORACLE9i数据库就自带bbed程序,就在%ORACLE_HOME%/bin目录下,在linux上面也有,需要自己编译。 9i/10g bbed: 11g和12.1需要10g的5个文件(bbedzhs.msb是可选的): BBED的缺省口令是 blockedit: 一般使用bbed,都是将一些配置信息写入到一个参数文本里,在调用bbed时,指定该参数文件。如: 先从v$datafile中获取file#,name,bytes,然后组成filelist.lst BBED常用命令: 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 可以使用help来查看bbed的命令语法:

发表在 bbed | 标签为 | 留下评论