非归档模式下一个或多个数据文件损坏恢复

1. 介绍

        有些时侯可能你的库处于非归档的模式下,而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复,这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption,让数据库重生。

  • 通过设置隐含参数恢复

alter system set "_allow_resetlogs_corruption"=true scope=spfile;

这种操作数据库数据肯定有丢失了,但是可以通过这种方式来减少数据的丢失,尽量恢复数据库中的数据。

2. 操作

修改数据库为非归档模式

SYS@hfzcdb> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@hfzcdb> startup mount
ORACLE instance started.

Total System Global Area 2466249672 bytes
Fixed Size                  8899528 bytes
Variable Size             671088640 bytes
Database Buffers         1778384896 bytes
Redo Buffers                7876608 bytes
Database mounted.
SYS@hfzcdb> alter database noarchivelog;    -- 更改数据库为非归档模式

Database altered.

SYS@hfzcdb> alter database open;

Database altered.

停止数据库,冷备份 user 表空间

SYS@hfzcdb> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@hfzcdb91:/home/oracle]$cp /oradata/hfzcdb/users01.dbf .  -- 备份users01
SYS@hfzcdb> startup
ORACLE instance started.

Total System Global Area 2466249672 bytes
Fixed Size                  8899528 bytes
Variable Size             671088640 bytes
Database Buffers         1778384896 bytes
Redo Buffers                7876608 bytes
Database mounted.
Database opened.

插入数据

SYS@hfzcdb> conn hfedu/hfedu123
Connected.
hfedu@hfzcdb> create table itpux002(id int,scn int) tablespace users;

Table created.

hfedu@hfzcdb> insert into itpux002 values (1,dbms_flashback.get_system_change_number);

1 row created.

hfedu@hfzcdb> commit;

Commit complete.

hfedu@hfzcdb> alter system switch logfile;

System altered.

hfedu@hfzcdb> insert into itpux002 values (2,dbms_flashback.get_system_change_number);

1 row created.

hfedu@hfzcdb> commit;

Commit complete.

hfedu@hfzcdb> alter system switch logfile;

System altered.
hfedu@hfzcdb> insert into itpux002 values (3,dbms_flashback.get_system_change_number);

1 row created.

hfedu@hfzcdb> commit;

Commit complete.

hfedu@hfzcdb> alter system switch logfile;

System altered.

hfedu@hfzcdb> insert into itpux002 values (4,dbms_flashback.get_system_change_number);

1 row created.

hfedu@hfzcdb> commit;

Commit complete.

hfedu@hfzcdb> alter system switch logfile;

System altered.

hfedu@hfzcdb> insert into itpux002 values (5,dbms_flashback.get_system_change_number);

1 row created.

hfedu@hfzcdb> select * from itpux002;

ID        SCN
---------- ----------
1    2396781
2    2396805
3    2396824
4    2396836
5    2396862

模拟删除文件

[oracle@hfzcdb91:/home/oracle]$rm /oradata/hfzcdb/users01.dbf     

把之前备份的 user 文件拷贝过来

[oracle@hfzcdb91:/home/oracle]$cp users01.dbf /oradata/hfzcdb/      -- 之前备份的恢复

启动数据库,报错

hfedu@hfzcdb> conn / as sysdba
Connected.
SYS@hfzcdb> shutdown abort
ORACLE instance shut down.
SYS@hfzcdb> startup
ORACLE instance started.

Total System Global Area 2466249672 bytes
Fixed Size                  8899528 bytes
Variable Size             671088640 bytes
Database Buffers         1778384896 bytes
Redo Buffers                7876608 bytes
Database mounted.
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/oradata/hfzcdb/users01.dbf'

检查数据库

SYS@hfzcdb> select file#,checkpoint_change# from v$datafile;  --查询控制文件中的scn select checkpoint_change# from v$database;

FILE# CHECKPOINT_CHANGE#
---------- ------------------
1            2396832
2            2396832
3            2396832
4            2396832
5            2396832
6            2396832

6 rows selected.

SYS@hfzcdb> select file#,checkpoint_change# from v$datafile_header;

FILE# CHECKPOINT_CHANGE#
---------- ------------------
1            2396832
2            2396832
3            2396832
4            2395434   -- 不一致
5            2396832
6            2396832

6 rows selected.

尝试恢复,由于没有归档,恢复不了


SYS@hfzcdb> recover datafile 4;  
ORA-00279: change 2395434 generated at 03/29/2023 20:03:52 needed for thread 1
ORA-00289: suggestion : /archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_6_%u_.arc
ORA-00280: change 2395434 for thread 1 is in sequence #6


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.

        此时,由于没有归档日志,无法恢复数据库,导致数据库无法启动,这时候可以通过使用隐含参数进行强制启动,跳过检测一致性操作。

SYS@hfzcdb> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

System altered.

再尝试启动数据库

SYS@hfzcdb> shutdown abort
ORACLE instance shut down.
SYS@hfzcdb> startup
ORACLE instance started.

Total System Global Area 2466249672 bytes
Fixed Size                  8899528 bytes
Variable Size             671088640 bytes
Database Buffers         1778384896 bytes
Redo Buffers                7876608 bytes
Database mounted.
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/oradata/hfzcdb/users01.dbf'


SYS@hfzcdb> recover database until cancel;
ORA-00279: change 2395434 generated at 03/29/2023 20:03:52 needed for thread 1
ORA-00289: suggestion : /archive/HFZCDB/archivelog/2023_03_29/o1_mf_1_6_%u_.arc
ORA-00280: change 2395434 for thread 1 is in sequence #6


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/oradata/hfzcdb/system01.dbf'


ORA-01112: media recovery not started


SYS@hfzcdb> alter database open resetlogs
2  ;
ERROR:
ORA-03114: not connected to ORACLE


alter database open resetlogs
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [kcbzib_kcrsds_1], [], [], [], [], [], [], [], [], [], [], []
Process ID: 82409
Session ID: 9 Serial number: 58617


SYS@hfzcdb> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@hfzcdb91:/backup/hfzcdb]$sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 29 20:20:20 2023
Version 19.3.0.0.0

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

Connected to an idle instance.

hfeduSQL> startup
ORACLE instance started.

Total System Global Area 2466249672 bytes
Fixed Size                  8899528 bytes
Variable Size             671088640 bytes
Database Buffers         1778384896 bytes
Redo Buffers                7876608 bytes
Database mounted.      
Database opened.      

可以看到数据库可以打开了,再查询下之前插入的数据

-- 发现有的表数据还是无法恢复,报00600错误
hfeduSQL> select * from hfedu.itpux002;
select * from hfedu.itpux002
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kcbzib_6], [0], [4], [], [], [], [], [], [], [], [], []

-- 但是有的表数据可以查询,这个就看运气了吧。
hfeduSQL> select * from hfedu.itpux001;

ID        SCN
---------- ----------
1    2190591
2    2190624
3    2190633
4    2190650
5    2190696

3. 总结

这种非归档的模式在 OLTP 中是非常罕见,只有在 OLAP 中由于数据量非常庞大,

归档的数据文件也非常可观,为了减少空间的压力,会选择非归档,但有几个前提条件:

1. 数据不是特别重要,允许少量丢失

2. 表空间都只为只读表空间,只为报表所用

可能处于这些情况之下,这个模式可用,也就是说具体情况得具体分析,根据业务的需求而架设方案。

这种恢复方式(非归档为了保持 scn 一致只能 resetlogs 了)是没有办法中的办法,通过这种方式恢复,有可能会导致数据库中数据的不一致,

如已提交的数据未写入数据文件,而未提交的数据倒是被写入了数据文件。

即使数据库被打开,也能够访问其中的表和数据,也只是看起来正常,

如果你注意关注数据库的 Alert 文件(我的 11g/19c 不用找告警文件内容,直接就报出来错误了,这估计就是版本不同结果也不同吧!!!) ORA-00600 错误。

因此,如果数据库能够顺利打开,强烈建议马上通过 EXPORT 逻辑导出的方式执行一次 FULL EXPORT。 【全备】

然后新建数据库,再通过 IMPORT 导入之前导出的二进制文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莳花微语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值