`
mikixiyou
  • 浏览: 1097958 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:352825
社区版块
存档分类
最新评论

真实案例:Oracle数据库恢复ORA-01861问题

阅读更多

Oracle 数据库WEBDB 在新的服务器环境进行备份的异地恢复测试,在执行到还原数据文件时出现“ORA-01861: literal does not match format string ”的错误。

该错误不是NLS_DATE_FORMAT 参数设置不正确导致的,而是一个Oracle bug 导致的。在该错误的解决过程中,我们没有采用官方推荐的重建控制文件的解决方法,而是使用自己的解决方法,将老备份集完全删除再注册进新备份集。

生产数据库是10.2.0.3  RAC 集群,ASM 存储,测试数据库为单实例,文件系统存储。

这个bug 不会影响到生产库的正常的备份和恢复操作。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1569963 )

 

1.  问题

在还原数据文件时,出现ORA-01861 错误,文件无法还原,导致备份恢复工作停止。

整个还原过程操作如下:

1 、在sqlplus 中启动实例到nomount 状态;

2 、在rman 中还原控制文件;

restore controlfile from ‘/backup/ctl.xxx’;

3 、启动实例到mounted 状态

sql ‘alter database mount’;

4 、注册备份集

catalog start with ‘/backup/’;

因为生产库的备份集所在目录和测试库的备份集所在目录不一样,所以使用catalog 将新位置注册进控制文件中。

5 、还原所有数据文件,并重命名。

这里测试还原第一个数据文件,文件位置从ASM 修改文件系统目录。


run
{
allocate channel ch01 type disk;
set until time "to_date('2012-06-25 23:00:00','yyyy-mm-dd hh24:mi:ss')";

set newname for datafile 1 to '/stor2T/app/oracle/oradata/WEBDB/system01.dbf';
restore datafile 1;
switch datafile all;
release channel ch01;
}


在这一步操作时,出现如下错误:


RMAN-03002: failure of restore command at 06/27/2012 16:09:51

ORA-01861: literal does not match format string

 


备份恢复测试工作因此而中止。

从错误信息看,这个应该是NLS_DATE_FORMAT 的格式设置的不对,set until time 的格式有问题。

于是,我们换成set until scn 进行数据文件的还原,还原操作的脚步如下是这样。

run
{
allocate channel ch01 type disk;
set until scn 3054150330;

set newname for datafile 1 to '/stor2T/app/oracle/oradata/WEBDB/system01.dbf';
restore datafile 1;
switch datafile all;
release channel ch01;
}

 


但是,还是报ORA-01861 错误。

甚至执行列出所有备份集时都出现这个错误。


RMAN> list backupset summary;

 

using target database control file instead of recovery catalog

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: failure of list command at 06/27/2012 16:29:18

ORA-01861: literal does not match format string

从这个现象看,这个问题已经不是一个参数设置不正确那么简单了。

2.  分析

Oracle 有一个BUG ,为 Bug 8513905 : ORA-1861 DURING RMAN RECOVERY

它分析这个bug 是因为控制文件的备份片含有无效的日期数据。

这里的控制文件是从备份集中restore 过来的。使用还原方法是”restore controlfile from ‘/backup/ctl.ccc’”

使用下列SQL 查询v$backup_piece 视图,找出无效日期数据。

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

 

select recid, status, device_type, handle, completion_time from v$backup_piece where completion_time > '2012-06-25 23:00:00';

查询操作很快报错,错误信息就是ORA-01861

 

使用这个SQL 将控制文件信息dump 出来,分析备份集在控制文件中是如何存储的。

alter session set events 'immediate trace name controlf level 20';

得到的信息如下:

 

***************************************************************************

BACKUP PIECE RECORDS

***************************************************************************

(size = 736, compat size = 736, section max = 4401, section in-use = 4401,

   last-recid= 313177, old-recno = 4338, last-recno = 4337)

 (extent = 1, blkno = 1326, numrecs = 4401)

Earliest record:

 RECID #308777 Recno 4338 Record timestamp   01/13/12 23:22:35 piece #1   copy #1 pool 0

   Backup set key: stamp=772500152, count=310443

   V$RMAN_STATUS: recid=18446744071562033872, stamp=18446744071562033864

   Flags: <deleted> <concurrent access>

   Device: DISK

   Handle:

   Media-Handle:

   Comment:

   Tag: TAG20120113T222641

   Completion time   01/13/12 23:36:12

Latest record:

 RECID #313177 Recno 4337 Record timestamp   06/27/12 16:50:43 piece #1   copy #2 pool 0

   Backup set key: stamp=784411507, count=313801

   V$RMAN_STATUS: recid=18446744071562033872, stamp=18446744071562033864

   Flags: <concurrent access>

   Device: DISK

   Handle: /WEBDBbackup/WEBDB_db_e9nc2arj_1_1.20120527

   Media-Handle:

   Comment:

   Tag: BAK_FULL

   Completion time   06/31/12 08:00:44

 

 RECID #313171 Recno 4331 Record timestamp   06/27/12 16:50:42 piece #1   copy #2 pool 0

   Backup set key: stamp=787003506, count=314306

   V$RMAN_STATUS: recid=18446744071562033872, stamp=18446744071562033864

   Flags: <concurrent access>

   Device: DISK

   Handle: /WEBDBbackup/WEBDB_db_u2nehe3i_1_1.20120626

   Media-Handle:

   Comment:

   Tag: BAK_FULL

   Completion time   06/31/12 08:09:08

 

 

在控制文件中,备份片除掉最早的2012113 日的结束时间是正常的,其他都是不正确的,结束时间为2012631 日。

这个时间格式是不正确的,因为20126 月根本就没有31 日。

问题可以确认了,所有的备份片的结束时间都是不正确的,所以只要校验到该时间,就会出错。

 

3.  解决

3.1          重建控制文件解决法

问题出在控制文件中备份片的完成时间上,因此可以使用重建控制文件的方法来解决这个问题。

使用alter database backup controlfile to trace 生成创建控制文件的脚步到trc 文件中。

执行创建文件时,出现下列错误:

CREATE CONTROLFILE REUSE DATABASE "WEBDB" NORESETLOGS FORCE LOGGING ARCHIVELOG

*

ERROR at line 1:

ORA-01503: CREATE CONTROLFILE failed

ORA-01565: error in identifying file '+WEBDBDG/system01.dbf'

ORA-17503: ksfdopn:2 Failed to open file +WEBDBDG/system01.dbf

ORA-15001: diskgroup "WEBDBDG" does not exist or is not mounted

ORA-15077: could not locate ASM instance serving a required diskgroup

ORA-29701: unable to connect to Cluster Manager

 

因为数据文件不存在,所以控制文件不能重建。但数据文件要存在,则需要控制文件先正常,再从备份集中还原出来。

这里陷入死锁状态。

3.2          清理控制文件备份集解决法

我们再想一下,是控制文件中的备份集有错误的日期数据,所以不能还原数据文件。

我们重建控制文件的解决方法就是为了完全清理掉这些备份集,再重新注册备份集进来。

但控制文件不能重建,故我们需要手工去清理掉这些备份集,再注册新备份集进来,也可达到清理错误日期数据的目的。

首先,删除掉所有的备份集。

这个操作不需要校验备份集的完成日期,因此可用。

再次,重新注册备份集。

catalog start with ‘/backup/’ ;

最后,还原数据文件。

此时,数据文件可以正常还原了。

我们再dump 一下控制文件中的信息,发现所有的备份集的结束时间已经处于正确的值。

***************************************************************************

BACKUP PIECE RECORDS

***************************************************************************

 (size = 736, compat size = 736, section max = 4401, section in-use = 4401,

   last-recid= 313178, old-recno = 4339, last-recno = 4338)

 (extent = 1, blkno = 1326, numrecs = 4401)

Earliest record:

 RECID #308778 Recno 4339 Record timestamp   01/13/12 23:22:34 piece #1   copy #1 pool 0

   Backup set key: stamp=772500152, count=310442

   V$RMAN_STATUS: recid=18446744071562033792, stamp=18446744071562033784

   Flags: <deleted> <concurrent access>

   Device: DISK

   Handle:

   Media-Handle:

   Comment:

   Tag: TAG20120113T222641

   Completion time   01/13/12 23:36:12

Latest record:

 RECID #313178 Recno 4338 Record timestamp   06/28/12 10:32:42 piece #1   copy #2 pool 0

   Backup set key: stamp=787003506, count=314306

   V$RMAN_STATUS: recid=18446744071562033792, stamp=18446744071562033784

  Flags: <concurrent access>

   Device: DISK

   Handle: /WEBDBbackup/WEBDB_db_u2nehe3i_1_1.20120626

   Media-Handle:

   Comment:

   Tag: BAK_FULL

   Completion time   07/01/12 01:51:08

 

trc 文件中,最后的备份集记录的结束时间不再是2012631 日。

 

4.  bug 是如何生成的

首先,我回到生产库时,查询v$backup_pieces 视图,并没有发现completion_time 的值有2012631 日的记录。这就是说,bug 不是在主库中,主库的备份和恢复不会有问题。

接着,我们重新审视一下测试库的恢复操作过程。

1 、在sqlplus 中启动实例到nomount 状态;

2 、在rman 中还原控制文件;

restore controlfile from ‘/backup/ctl.xxx’;

3 、启动实例到mounted 状态

sql ‘alter database mount’;

4 、注册备份集

catalog start with ‘/backup/’;

 

在第三步将数据库实例启动到mounted 状态后,我们就可以查询一下控制文件中的备份集状况了。

如果这时测试库服务器上的备份集文件和主库上的备份集文件一致的话,则不用执行catalog ,将新备份集注册进控制文件中。

在第四步之前,我们检查一下备份集。


alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

 

select recid, status, device_type, handle, completion_time from v$backup_piece where completion_time > '2012-06-25 23:00:00';


这时,并没有报错,没有出现异常的日期数据。

再执行了第四步之后,我们再执行查询v$backup_piece 的操作时,就出错了。

因此,我们可以判断bug 再使用catalog 注册新备份集时出错的。(注:至于为什么会出错,这需要oracle 的工程师去分析其软件产品。)

这里,我怀疑是控制文件中已经有的备份集和新注册的备份集冲突,所以导致备份集完成时间出现错误。

5.  总结

在注册进新的备份集到控制文件之前,需要将老的所有的备份集删除掉,这样确保不出现ORA-01861 错误。

Oracle 官方文档RMAN Recovery Session Fails with ORA-1861 [ID 852723.1] 中记录该bug 的生成原因和解决方法。但它提供的解决方法在我们这种情况下并不适用。

我们使用delete backupset 方法将所有备份集删除掉,再注册进新备份集的方法更加简洁有效。

再新注册备份集之后,我又对控制文件做了一次dump 操作,得出trc 文件中关于备份片记录的情况。


***************************************************************************

BACKUP PIECE RECORDS

***************************************************************************

 (size = 736, compat size = 736, section max = 4401, section in-use = 4401,

   last-recid= 313178, old-recno = 4339, last-recno = 4338)

 (extent = 1, blkno = 1326, numrecs = 4401)

Earliest record:

 RECID #308778 Recno 4339 Record timestamp   01/13/12 23:22:34 piece #1   copy #1 pool 0

   Backup set key: stamp=772500152, count=310442

   V$RMAN_STATUS: recid=18446744071562033792, stamp=18446744071562033784

   Flags: <deleted> <concurrent access>

   Device: DISK

   Handle:

   Media-Handle:

   Comment:

   Tag: TAG20120113T222641

   Completion time   01/13/12 23:36:12

Latest record:

 RECID #313178 Recno 4338 Record timestamp   06/28/12 10:32:42 piece #1   copy #2 pool 0

   Backup set key: stamp=787003506, count=314306

   V$RMAN_STATUS: recid=18446744071562033792, stamp=18446744071562033784

   Flags: <concurrent access>

   Device: DISK

   Handle: /WEBDBbackup/WEBDB_db_u2nehe3i_1_1.20120626

   Media-Handle:

   Comment:

   Tag: BAK_FULL

   Completion time   07/01/12 01:51:08


从结果中可以看到备份集的完成时间已经恢复正常。

因此,我们的异地恢复测试操作步骤需要做一点修改。在第四步注册备份集操作时,需要加上删除所有老的备份集操作。

 

1
1
分享到:
评论

相关推荐

    解决 navicat连接oracle报错:ORA-12737InstantClientLight

    然而,有时在使用Navicat连接Oracle数据库时可能会遇到各种问题,如"ORA-12737 InstantClientLight"错误。本文将深入探讨这个错误及其解决方案,同时也会涉及Navicat与Oracle的集成以及InstantClient的相关知识。 ...

    Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法.pdf

    Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...

    TNS-12541: TNS: 无监听程序 TNS-12560

    ORA-609 : opiodr aborting process unknown ospid (4116_6104) 这时候朋友怀疑是不是监听器配置问题,就把原先的监听器删除重建了下,问题依然。 网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下:...

    离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法

    这些问题可能会导致数据库启动时出现ORA-01033错误(数据库无法完成启动过程),以及在尝试修复过程中可能遇到的ORA-01145错误(除非启用了介质恢复,否则不允许立即脱机)。本文将详细介绍这两种错误的原因、可能的...

    包装物流管理软件:Oracle二次开发-OraclePL-SQL编程技术

    包装物流管理软件:Oracle二次开发_Oracle数据库体系结构与管理.docx 包装物流管理软件:Oracle二次开发_Oracle物流管理软件API与集成.docx 包装物流管理软件:Oracle二次开发_Oracle物流管理软件业务流程自动化....

    oracle断电导致控制文件不一致报错ORA-00214处理

    在Oracle数据库管理过程中,遇到控制文件版本不一致的问题时,通常会收到ORA-00214错误提示。此错误表示数据库中的一个或多个控制文件与其它控制文件版本不匹配,这可能是由于突然断电、硬件故障或其他原因导致的...

    ora-227101错误解决办法

    在Oracle数据库管理与维护的过程中,遇到各种错误代码是家常便饭,其中“ORA-227101”错误虽然在题目中被误标,实际案例中展示的是“ORA-27101”错误,这是一个较为常见的问题,通常发生在数据库服务未能正确启动或...

    解决Oracle 9.2.0.6版本数据库由于ORA-07445宕机问题

    Oracle数据库在运行过程中可能会遇到各种错误,其中,ORA-07445错误是一个与内核相关的严重异常,通常表示数据库遇到了未预期的内部错误,可能导致数据库实例的崩溃。在这个特定的问题中,XX网的Oracle 9.2.0.6版本...

    oracle ora-03113错误

    ### Oracle ORA-03113 错误解析及解决方法 ... - 对于Oracle数据库的日志和告警信息进行定期审查,及时发现问题并解决。 通过以上步骤,可以有效地解决ORA-03113错误,并防止类似问题在未来再次发生。

    oracle报错(ORA-00600)问题处理

    Oracle数据库在运行过程中可能会遇到各种错误,其中ORA-00600是一个内部错误代码,表示遇到了数据库系统内部无法处理的异常情况。这个错误通常与数据库的底层结构或数据不一致有关,它不是一个通用错误,而是针对...

    数据库ORA-01460错误的解决方法

    ORA-01460错误全称为“ORA-01460: unimplemented unreasonable conversion requested”,主要出现在Oracle数据库中,当系统试图将一种数据类型转换为另一种无法处理的数据类型时触发。这种错误常见于数据导出(如...

    ora-01720 授权选项对于'xxxx'不存在的解决方法

    在Oracle数据库管理中,权限管理和授予是非常重要的一个环节。它确保了数据的安全性和访问控制的有效性。然而,在进行权限授予时可能会遇到各种各样的错误,其中`ORA-01720`就是一个典型的例子。该错误提示“授权...

    oracle11g 内部参数出错问题

    Oracle 11g 内部错误代码 ORA-00600 是一个非常通用的错误,它表示数据库遇到了一个无法处理的内部错误或异常情况。这个错误通常涉及到Oracle数据库的底层结构,如数据块、索引或者内存管理等,且参数列表可以提供...

    数据库ORA-01196故障-归档日志丢失恢复详解

    在Oracle数据库环境中,当遇到"ORA-01196: 文件 1 由于介质恢复会话失败而不一致"的错误时,这通常意味着数据库在尝试打开时发现数据文件的状态不正常,可能是因为数据文件损坏或者缺少必要的归档日志进行恢复。...

    oracle11g数据库常见故障处理

    除了以上提到的问题外,Oracle 11g 数据库中还存在其他类型的故障,如数据管理和恢复类问题、管理工具类问题等,这些故障通常需要根据具体情况进行诊断和解决。例如: - **ORA-00600 错误** - **介绍**:ORA-00600...

    Oracle数据泵(Data Dump)使用过程当中经常会遇到一些奇奇怪怪的错误案例

    **错误案例1:ORA-39065 和 ORA-44002** 这两个错误通常涉及到数据泵在处理数据泵作业时内部出现的异常。ORA-39065 表示在DISPATCH过程中遇到了未预期的主进程异常,而ORA-44002则意味着对象名无效。这个错误可能是...

    oracle数据库迁移实例01

    本案例介绍了一个特定场景下的Oracle数据库迁移过程,涉及的环境包括: - **源数据库**:Oracle 9.2.0.8,数据库名称(db_name)为`oradb`,实例名称(instance_name)为`oradb`;操作系统为Windows 2003,实例安装位置...

Global site tag (gtag.js) - Google Analytics