暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据文件offline drop后重新online缺失归档的恢复测试

原创 trex 2022-09-02
1641

[[toc]]

适用范围

11G

问题概述

数据文件offline drop后,无法online

问题原因

丢失了归档日志

解决方案

创建表空间:

  
create tablespace tbs1 datafile '/u01/app/oradata/orcl/tbs1_1.dbf' size 100m ;
alter tablespace tbs1 add datafile '/u01/app/oradata/orcl/tbs1_2.dbf' size 100m;

创建表:

  
create table scott.ttbs1 (f1 number);

模拟业务,执行多次:

  
declare
begin
for i in 1..1000 loop
insert into scott.ttbs1 values (i);
end loop;
commit;
end;
/

alter system archive log current;

alter system archive log current;

==============================
模拟数据文件offline

alter database datafile 9 offline drop;

select file#,name,status,checkpoint_change# from v$datafile order by 1;

     FILE# NAME                                                                                     STATUS  CHECKPOINT_CHANGE#
---------- ---------------------------------------------------------------------------------------- ------- ------------------
         1 /u01/app/oradata/orcl/system01.dbf                                                       SYSTEM             2661784
         2 /u01/app/oradata/orcl/sysaux01.dbf                                                       ONLINE             2661784
         3 /u01/app/oradata/orcl/undotbs01.dbf                                                      ONLINE             2661784
         4 /u01/app/oradata/orcl/users01.dbf                                                        ONLINE             2661784
         5 /u01/app/oradata/orcl/users001.dbf                                                       ONLINE             2661784
         6 /u01/app/oradata/orcl/users02.dbf                                                        ONLINE             2661784
         7 /u01/app/oradata/orcldg/users03.dbf                                                      ONLINE             2661784
         8 /u01/app/oradata/orcldg/users04.dbf                                                      ONLINE             2661784
         9 /u01/app/oradata/orcl/tbs1_1.dbf                                                         RECOVER            2661290
        10 /u01/app/oradata/orcl/tbs1_2.dbf                                                         ONLINE             2661784



select name,thread#,SEQUENCE#,FIRST_CHANGE#,RESETLOGS_CHANGE#,next_change# from v$archived_log where dest_id=1 and first_change#=2661290 order by 3;

NAME                                                       THREAD#  SEQUENCE# FIRST_CHANGE# RESETLOGS_CHANGE# NEXT_CHANGE#
------------------------------------------------------- ---------- ---------- ------------- ----------------- ------------
/archivelog/1_261_1008423780.dbf                                 1        261       2661290                 1      2661463

Select dest_id,sequence#,name from v$archived_log where &scn + 1 between first_change# and next_change# ;
Select name,sequence# from v$archived_log where sequence# >= 261;
//需要261归档

rm -f /archivelog/1_261_1008423780.dbf

  
SQL> alter database datafile 9 online;
alter database datafile 9 online
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: '/u01/app/oradata/orcl/tbs1_1.dbf'

  
SQL> recover datafile 9;
ORA-00279: change 2661290 generated at 08/18/2022 08:55:45 needed for thread 1
ORA-00289: suggestion : /archivelog/1_261_1008423780.dbf
ORA-00280: change 2661290 for thread 1 is in sequence #261


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log '/archivelog/1_261_1008423780.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


ORA-00308: cannot open archived log '/archivelog/1_261_1008423780.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

==============================

安装BBED:

  
cd /software
unzip bbed.zip

chown oracle:oinstall ssbbded.o
chown oracle:oinstall sbbdpt.o
chown oracle:oinstall bbedus.msb
chown oracle:oinstall bbedus.msg

chmod 644 ssbbded.o
chmod 644 sbbdpt.o
chmod 644 bbedus.msb
chmod 644 bbedus.msg

cp *.o $ORACLE_HOME/rdbms/lib/
cp *.ms* $ORACLE_HOME/rdbms/mesg/

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

which bbed
/u01/app/oracle/product/11.2.0/dbhome_1/bin/bbed

==============================
通过BBED推进SCN实现数据文件重新online

生成数据文件清单列表:

  
sqlplus -S / as sysdba << "EOF" > /tmp/listfile.txt
set feedback      off
set heading       off
set line 300 pages 999
select file#||chr(9)||name||chr(9)||bytes from v$datafile where file# in (9,10);
EOF

配置BBED的parfile

  
cat << "EOF" >> /tmp/bbed.par
mode=edit
listfile=/tmp/listfile.txt
blocksize=8192
EOF

  
bbed parfile=/tmp/bbed.par password=blockedit
BBED> info
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     9  /u01/app/oradata/orcl/tbs1_1.dbf                                 12800
    10  /u01/app/oradata/orcl/tbs1_2.dbf                                 12800

BBED> set file 9 block 1

BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x00289baa  ==> 这里就是SCN的16进制,目的就是要推进这里的SCN号,换算成10进制就是 2661290
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x42579891
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x00000105
         ub4 kcrbabno                       @504      0x00000002
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00

因为Linux的字节序是little endian,编码需倒序

0x289D98

modify /x 989D28 dba 9,1 offset 484

sum apply

==============================
恢复 datafile 9

  
recover datafile 9;
alter database datafile 9 online;
alter system checkpoint;

注意

bbed工具是Oracle内部工具,慎用。

最后修改时间:2022-09-05 11:00:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论