论文部分内容阅读
摘要:本文通过实例讲解利用ORACLE的BBED工具对损坏的Block进行恢复,以供遇到类似问题的ORACLE数据库管理员借鉴参考。
关键词:ORACLE;Block;BBED;恢复
中图分类号:TP309.3 文献标识码:A 文章编号:1007-9599 (2011) 21-0000-01
Oracle Database Block Corruption Recovery
——Analysis of BBED Application in the Database Recovery
Chen Fei
(Ministry of Public Security Traffic Management Research Institute,Wuxi 214151,China)
Abstract:In this paper,examples to explain the use of ORACLE BBED tool to recover corrupted Block,for similar problems and experiences for the ORACLE database administrator.
Keywords:ORACLE;Block;BBED;Recovery
一、前言
ORACLE数据库是目前市场上最主流的商用大型数据库,以其高可用性、优越的性能、强大的扩展性和良好的管理性占据了大部分的商用数据库市场份额。
Block(块)是ORACLE数据库的基本存储单位,用来存储数据库的数据。block的损坏是DBA们经常遇到的问题,可以通过RMAN、DBMS_REPAIR等手段进行恢复。本文将着重介绍ORACLE的BBED工具在block损坏情况下的使用。
二、BBED介绍
BBED(Block Browerand Editor Tool)是ORACLE的一款内部工具,可以直接查看和修改数据库文件数据,甚至可以直接修改数据文件块的内容。但是该工具不受ORACLE支持,所以在一般情况下,请不要在生产环境中尝试使用该工具,可能会造成不可恢复的灾难性后果。
BBED在WINDOWS平台的ORACLE版本中未提供,只能在UNIX/LINUX平台的ORACLE版本中使用。由于ORACLE不提倡使用此工具,所以未有现成的可执行文件,需要编译生成BBED的可执行文件。
三、BBED的安装
以LINUX平台的ORACLE 10g版本为例,如下:
[oracle@linux1 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@linux1 lib]$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
[oracle@linux1 lib]$ls –l bbed
-rwxr-xr-x 1 oracle oinstall 536161 Nov 3 18:46 bbed
注意:使用上述命令生成的bbed可执行文件在$ORACLE_HOME/rdbms/lib目录下,可以复制到其他位置或者其他同ORACLE版本的机器上运行。一般可以将bbed可执行文件复制到$ORACLE_HOME/bin目录,这样就可以不修改oracle用户的PATH变量。
四、BBED的使用
BBED是ORACLE内部使用的工具,ORACLE官方不提供技术支持,所以使用一定要谨慎。
[oracle@linux1 bin]$ bbed
Password:
注意:为了安全,ORACLE设置了口令保护,默认的密码为blockedit。
正式使用BBED之前,需要先创建两个配置文件,文件内容如下:
[oracle@linux1 oracle]$ cat bbed.par
blocksize=8192
listfile=/oracle/filelist.txt
mode=edit
[oracle@linux1 bin]$ cat filelist.txt
1 /oradata/orcl/system01.dbf 314572800
2 /oradata/orcl/undotbs01.dbf 104857600
3 /oradata/orcl/sysaux01.dbf 125829120
4 /oradata/orcl/test.dbf 10485760
5 /oradata/orcl/users01.dbf 5242880
filelist.txt包含了数据库的datafile的信息,格式为:文件编号 文件名称 文件大小。filelist.txt文件的内容可由以下SQL语句得到:
select file#||' '||name||' '||bytes from v$datafile;
注意:filelist中的文件编号可以自己指定,不一定要与file#一致,bbed读取的文件编号是根据filelist.txt文件的内容来确定的,而不是file#。但是为了避免混淆,文件编号最好还是与file#保持一致。
bbed.par和filelist.txt都生成后,可以使用parameter file连接bbed了:
[oracle@linux1 oracle]$ bbed parfile=/oracle/bbed.par
Password:
BBED> help all
从help all的输出中,我们可以看到全部的bbed的语法,最常用的有以下几个:
set 设定当前的环境参数
show 查看当前的环境参数
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 回滚当前的修改操作
revert 回滚所有之前的修改操作
注意:虽然bbed可以在数据库open的状态下修改block,但是建议在做modify之前先shutdown数据库。避免ORACLE后台的checkpoint进程重写bbed对block的修改。也避免ORACLE在bbed修改完成之前读取正在修改的block或者申明这个block为corrupt(损坏的)。
五、BBED使用示例
(一)修改filelist.txt文件
修改filelist.txt文件,将数据文件的备份文件也加入到filelist.txt中:
[oracle@linux1 orcl]$ vi filelist.txt
修改后的filelist.txt如下:
1 /oradata/orcl/system01.dbf 314572800
2 /oradata/orcl/undotbs01.dbf 104857600
3 /oradata/orcl/sysaux01.dbf 125829120
4 /oradata/orcl/test.dbf 10485760
5 /oradata/orcl/users01.dbf 5242880
6 /oradata/orcl/test.dbf.bak 10485760
(二)备份数据文件
SQL> create table bbed_test (id number(3),name varchar2(10));
SQL> insert into bbed_test values(1,'aaa');
SQL> insert into bbed_test values(2,'bbb');
SQL> commit;
SQL> select segment_name,tablespace_name from user_segments;
SEGMENT_NAME TABLESPACE_NAME
------------------------------------- -----------------------------------------
BBED_TEST TEST
SQL> select
rowid,
dbms_rowid.rowid_relative_fno(rowid) rel_fno,
dbms_rowid.rowid_block_number(rowid) blockno,
dbms_rowid.rowid_row_number(rowid) rowno
from bbed_test;
ROWID REL_FNO BLOCKNO ROWNO
------------------ ---------- ---------- ----------
AAACf8AAEAAAAAPAAA 4 15 0
AAACf8AAEAAAAAPAAB 4 15 1
SQL> shutdown immediate;
[oracle@linux1 ~]$ cd /oradata/orcl
[oracle@linux1 orcl]$ cp test.dbf test.dbf.bak
(三)破坏block
[oracle@linux1 ~]$ bbed parfile=/oracle/bbed.par
Password:
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME /oradata/orcl/system01.dbf
BIFILE bifile.bbd
LISTFILE /oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> set file 4
[oracle@linux1 orcl]$ sqlplus "/as sysdba"
SQL> startup
SQL> select count(*) from chen.bbed_test;
select count(*) from chen.bbed_test
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 15)
ORA-01110: data file 4: '/oradata/orcl/test.dbf'
(四)使用bbed恢复坏块
SQL> alter tablespace test offline;
BBED> set file 6
BBED> copy file 6 block 15 to file 4 block 15
SQL> alter tablespace test online;
SQL> select count(*) from chen.bbed_test;
COUNT(*)
----------
2
至此,数据块恢复成功。这个示例只是简单介绍了一个数据块恢复的大致流程,还有更多BBED工具的使用方法,大家可以在测试环境中实验,以便生产环境遇到类似问题时能够及时解决。
参考文献:
[1]盖国强.深入解析Oracle:DBA入门,进阶与诊断案例[M].人民邮电出版社,2009
[2]陈吉平.构建Oracle高可用环境[M].电子工业出版社,2008.电子工业出版社,2008
关键词:ORACLE;Block;BBED;恢复
中图分类号:TP309.3 文献标识码:A 文章编号:1007-9599 (2011) 21-0000-01
Oracle Database Block Corruption Recovery
——Analysis of BBED Application in the Database Recovery
Chen Fei
(Ministry of Public Security Traffic Management Research Institute,Wuxi 214151,China)
Abstract:In this paper,examples to explain the use of ORACLE BBED tool to recover corrupted Block,for similar problems and experiences for the ORACLE database administrator.
Keywords:ORACLE;Block;BBED;Recovery
一、前言
ORACLE数据库是目前市场上最主流的商用大型数据库,以其高可用性、优越的性能、强大的扩展性和良好的管理性占据了大部分的商用数据库市场份额。
Block(块)是ORACLE数据库的基本存储单位,用来存储数据库的数据。block的损坏是DBA们经常遇到的问题,可以通过RMAN、DBMS_REPAIR等手段进行恢复。本文将着重介绍ORACLE的BBED工具在block损坏情况下的使用。
二、BBED介绍
BBED(Block Browerand Editor Tool)是ORACLE的一款内部工具,可以直接查看和修改数据库文件数据,甚至可以直接修改数据文件块的内容。但是该工具不受ORACLE支持,所以在一般情况下,请不要在生产环境中尝试使用该工具,可能会造成不可恢复的灾难性后果。
BBED在WINDOWS平台的ORACLE版本中未提供,只能在UNIX/LINUX平台的ORACLE版本中使用。由于ORACLE不提倡使用此工具,所以未有现成的可执行文件,需要编译生成BBED的可执行文件。
三、BBED的安装
以LINUX平台的ORACLE 10g版本为例,如下:
[oracle@linux1 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@linux1 lib]$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
[oracle@linux1 lib]$ls –l bbed
-rwxr-xr-x 1 oracle oinstall 536161 Nov 3 18:46 bbed
注意:使用上述命令生成的bbed可执行文件在$ORACLE_HOME/rdbms/lib目录下,可以复制到其他位置或者其他同ORACLE版本的机器上运行。一般可以将bbed可执行文件复制到$ORACLE_HOME/bin目录,这样就可以不修改oracle用户的PATH变量。
四、BBED的使用
BBED是ORACLE内部使用的工具,ORACLE官方不提供技术支持,所以使用一定要谨慎。
[oracle@linux1 bin]$ bbed
Password:
注意:为了安全,ORACLE设置了口令保护,默认的密码为blockedit。
正式使用BBED之前,需要先创建两个配置文件,文件内容如下:
[oracle@linux1 oracle]$ cat bbed.par
blocksize=8192
listfile=/oracle/filelist.txt
mode=edit
[oracle@linux1 bin]$ cat filelist.txt
1 /oradata/orcl/system01.dbf 314572800
2 /oradata/orcl/undotbs01.dbf 104857600
3 /oradata/orcl/sysaux01.dbf 125829120
4 /oradata/orcl/test.dbf 10485760
5 /oradata/orcl/users01.dbf 5242880
filelist.txt包含了数据库的datafile的信息,格式为:文件编号 文件名称 文件大小。filelist.txt文件的内容可由以下SQL语句得到:
select file#||' '||name||' '||bytes from v$datafile;
注意:filelist中的文件编号可以自己指定,不一定要与file#一致,bbed读取的文件编号是根据filelist.txt文件的内容来确定的,而不是file#。但是为了避免混淆,文件编号最好还是与file#保持一致。
bbed.par和filelist.txt都生成后,可以使用parameter file连接bbed了:
[oracle@linux1 oracle]$ bbed parfile=/oracle/bbed.par
Password:
BBED> help all
从help all的输出中,我们可以看到全部的bbed的语法,最常用的有以下几个:
set 设定当前的环境参数
show 查看当前的环境参数
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 回滚当前的修改操作
revert 回滚所有之前的修改操作
注意:虽然bbed可以在数据库open的状态下修改block,但是建议在做modify之前先shutdown数据库。避免ORACLE后台的checkpoint进程重写bbed对block的修改。也避免ORACLE在bbed修改完成之前读取正在修改的block或者申明这个block为corrupt(损坏的)。
五、BBED使用示例
(一)修改filelist.txt文件
修改filelist.txt文件,将数据文件的备份文件也加入到filelist.txt中:
[oracle@linux1 orcl]$ vi filelist.txt
修改后的filelist.txt如下:
1 /oradata/orcl/system01.dbf 314572800
2 /oradata/orcl/undotbs01.dbf 104857600
3 /oradata/orcl/sysaux01.dbf 125829120
4 /oradata/orcl/test.dbf 10485760
5 /oradata/orcl/users01.dbf 5242880
6 /oradata/orcl/test.dbf.bak 10485760
(二)备份数据文件
SQL> create table bbed_test (id number(3),name varchar2(10));
SQL> insert into bbed_test values(1,'aaa');
SQL> insert into bbed_test values(2,'bbb');
SQL> commit;
SQL> select segment_name,tablespace_name from user_segments;
SEGMENT_NAME TABLESPACE_NAME
------------------------------------- -----------------------------------------
BBED_TEST TEST
SQL> select
rowid,
dbms_rowid.rowid_relative_fno(rowid) rel_fno,
dbms_rowid.rowid_block_number(rowid) blockno,
dbms_rowid.rowid_row_number(rowid) rowno
from bbed_test;
ROWID REL_FNO BLOCKNO ROWNO
------------------ ---------- ---------- ----------
AAACf8AAEAAAAAPAAA 4 15 0
AAACf8AAEAAAAAPAAB 4 15 1
SQL> shutdown immediate;
[oracle@linux1 ~]$ cd /oradata/orcl
[oracle@linux1 orcl]$ cp test.dbf test.dbf.bak
(三)破坏block
[oracle@linux1 ~]$ bbed parfile=/oracle/bbed.par
Password:
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME /oradata/orcl/system01.dbf
BIFILE bifile.bbd
LISTFILE /oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> set file 4
[oracle@linux1 orcl]$ sqlplus "/as sysdba"
SQL> startup
SQL> select count(*) from chen.bbed_test;
select count(*) from chen.bbed_test
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 15)
ORA-01110: data file 4: '/oradata/orcl/test.dbf'
(四)使用bbed恢复坏块
SQL> alter tablespace test offline;
BBED> set file 6
BBED> copy file 6 block 15 to file 4 block 15
SQL> alter tablespace test online;
SQL> select count(*) from chen.bbed_test;
COUNT(*)
----------
2
至此,数据块恢复成功。这个示例只是简单介绍了一个数据块恢复的大致流程,还有更多BBED工具的使用方法,大家可以在测试环境中实验,以便生产环境遇到类似问题时能够及时解决。
参考文献:
[1]盖国强.深入解析Oracle:DBA入门,进阶与诊断案例[M].人民邮电出版社,2009
[2]陈吉平.构建Oracle高可用环境[M].电子工业出版社,2008.电子工业出版社,2008