【问题标题】:Restoring from Oracle RMAN backup fails about 60% of the time (noarchivelog mode)从 Oracle RMAN 备份还原大约 60% 的时间会失败(noarchivelog 模式)
【发布时间】:2023-03-19 05:09:01
【问题描述】:

我有一个奇怪的情况,即还原最近创建的 Oracle RMAN 备份有时有效,有时无效。

我们使用 Oracle 12c。数据库正在以 noarchivelog 模式运行。

全文:我们有一个大型 CI 设置,其中一个节点可以选择一个工作,从 repo 构建自己并运行测试。对于某些测试,需要构建数据库。为了加快测试速度,我们

  • 首次尝试从备份中恢复数据库。
  • 如果失败,我们将删除数据库,重新构建 shell 和数据。重新创建备份,然后开始测试。

这个想法当然是大部分时间恢复都会起作用,实际上恢复大约有 40% 的时间起作用,而在其他时候它会失败并重建数据库。发生这种情况似乎与单个节点之间没有任何关联,它工作了一次,然后就不起作用了。

我们使用下面的脚本来备份

rman target=/ << EOF
RUN {
    CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    BACKUP DATABASE;
}
EXIT;
EOF

以及以下要恢复的

rman target=/ << EOF
RUN {
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    RESTORE DATABASE;
    RECOVER DATABASE;
    ALTER DATABASE OPEN RESETLOGS;
}
EXIT;
EOF

当事情变得糟糕时,它会发生在 RECOVER 步骤中。

错误并不总是相同的。以下是我看到的一些

这个好像是最近最频繁的

04:23:10 channel ORA_DISK_1: restore complete, elapsed time: 00:00:15
04:23:10 Finished restore at 06-02-2017 04:23:10
04:23:10 
04:23:10 Starting recover at 06-02-2017 04:23:10
04:23:10 using channel ORA_DISK_1
04:23:11 
04:23:11 starting media recovery
04:23:11 
04:23:11 archived log for thread 1 with sequence 52 is already on disk as file /oracle/oradata/DB1/redoDB11.log
04:23:11 archived log for thread 1 with sequence 53 is already on disk as file /oracle/oradata/DB1/redoDB12.log
04:23:11 archived log for thread 1 with sequence 54 is already on disk as file /oracle/oradata/DB1/redoDB13.log
04:23:11 RMAN-08187: WARNING: media recovery until SCN 1662458 complete
04:23:11 Finished recover at 06-02-2017 04:23:11
04:23:11 
04:23:15 RMAN-00571: ===========================================================
04:23:15 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
04:23:15 RMAN-00571: ===========================================================
04:23:15 RMAN-03002: failure of sql statement command at 02/06/2017 04:23:14
04:23:15 ORA-01147: SYSTEM tablespace file 1 is offline
04:23:15 ORA-01110: data file 1: '/oracle/oradata/DB1/DB1_system.dbf'
04:23:15 
04:23:15 RMAN> 
04:23:15 
04:23:15 Recovery Manager complete.

另一个错误

09:49:17 Finished restore at 27-01-2017 09:49:14
09:49:17 
09:49:17 Starting recover at 27-01-2017 09:49:14
09:49:17 using channel ORA_DISK_1
09:49:17 
09:49:17 starting media recovery
09:49:17 
09:49:17 archived log for thread 1 with sequence 52 is already on disk as file /oracle/oradata/DB1/redoDB11.log
09:49:17 archived log for thread 1 with sequence 53 is already on disk as file /oracle/oradata/DB1/redoDB12.log
09:49:17 archived log for thread 1 with sequence 54 is already on disk as file /oracle/oradata/DB1/redoDB13.log
09:49:17 RMAN-08187: WARNING: media recovery until SCN 1755105 complete
09:49:17 Finished recover at 27-01-2017 09:49:15
09:49:17 
09:49:17 RMAN-00571: ===========================================================
09:49:17 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
09:49:17 RMAN-00571: ===========================================================
09:49:17 RMAN-03002: failure of sql statement command at 01/27/2017 09:49:16
09:49:17 ORA-01147: SYSTEM tablespace file 1 is offline
09:49:17 ORA-01110: data file 1: '/oracle/oradata/DB1/DB1_system.dbf'
09:49:17 
09:49:17 RMAN> 

还有一个

11:17:55 starting media recovery
11:17:55 media recovery failed
11:17:55 RMAN-00571: ===========================================================
11:17:55 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
11:17:55 RMAN-00571: ===========================================================
11:17:55 RMAN-03002: failure of recover command at 01/27/2017 11:17:55
11:17:55 ORA-00283: recovery session canceled due to errors
11:17:55 RMAN-11003: failure during parse/execution of SQL statement: alter database recover if needed
11:17:55  start until cancel
11:17:55 ORA-00283: recovery session canceled due to errors
11:17:55 ORA-16433: The database or pluggable database must be opened in read/write mode.
11:17:55 
11:17:55 RMAN> 

还有一个与上述三个不同的,这个在 RESTORE 上失败

09:14:11 Starting restore at 06-02-2017 09:14:11
09:14:11 allocated channel: ORA_DISK_1
09:14:11 channel ORA_DISK_1: SID=12 device type=DISK
09:14:12 
09:14:12 creating datafile file number=1 name=/oracle/oradata/DB1/DB1_system.dbf
09:14:12 RMAN-00571: ===========================================================
09:14:12 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
09:14:12 RMAN-00571: ===========================================================
09:14:12 RMAN-03002: failure of restore command at 02/06/2017 09:14:12
09:14:12 ORA-01180: can not create datafile 1
09:14:12 ORA-01110: data file 1: '/oracle/oradata/DB1/DB1_system.dbf'
09:14:12 
09:14:12 RMAN> 

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 正如您所说,您的数据库在 noarchivelog 模式下运行,您不需要恢复它。
  • 还需要在恢复数据库之前恢复spfile和控制文件。
  • 谢谢! RECOVER 存在的原因是,除非我运行它和以下命令,否则数据库不会重新联机。我恢复数据库的方式是否不正确,对于 noarchivelog 应该采取不同的方式吗?
  • 好吧,您仍然需要“以下命令”......只是不要像 JSapkota 所说的那样运行恢复命令。在 noarchivelog 模式下,只需运行: restore database;更改数据库打开重置日志;

标签: oracle restore oracle12c rman


【解决方案1】:

为了了解您收到错误的原因,了解这些部分中的每一部分在您的脚本中的含义很重要:

RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;

RESTORE DATABASE; 将备份集中的数据文件复制回您的数据库位置。如果进行备份时数据库已关闭且一致(干净关闭),则您的备份是一致的。

RECOVER DATABASE; 首先尝试通过应用备份归档重做日志、归档重做日志和/或重做日志来使备份保持一致。然后,它将尝试从备份时间点向前滚动您的数据库,直到最近的重做日志。由于您在 NOARCHIVELOG 模式下运行,因此此步骤只会产生您所看到的错误。

ALTER DATABASE OPEN RESETLOGS; 使您的数据库联机。 RESETLOGS 清除重做日志,在不完全恢复后需要它(如果数据库无法前滚并应用备份归档日志、归档日志和重做日志中的所有重做)。

考虑到这一点,您的脚本应如下所示:

RUN {
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    RESTORE DATABASE;
    ALTER DATABASE OPEN RESETLOGS;
}

附带说明,您还应该从 RMAN 配置 spfile+controlfile 自动备份。每当您备份数据库时,都会自动进行此备份。

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';

正如 JSapkoka 所说,您还应该先恢复 spfile 和 controlfile,完整的恢复脚本如下所示:

RUN {
    SHUTDOWN IMMEDIATE;
    STARTUP NOMOUNT;
    SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'autobackup_format';
    RESTORE SPFILE FROM AUTOBACKUP;
    SHUTDOWN IMMEDIATE;
    STARTUP NOMOUNT;
    RESTORE CONTROLFILE FROM AUTOBACKUP;
    ALTER DATABASE MOUNT;
    RESTORE DATABASE;
    ALTER DATABASE OPEN RESETLOGS;
}

【讨论】:

  • 感谢您提供非常详细的答复。如果没有 RESTORE,我无法让它工作,因为数据库会抛出以下消息,这就是我首先添加 RESTORE 的原因:RMAN-00571: ================ =========================================== RMAN-00569:==== =========== 错误消息堆栈跟随 =============== RMAN-00571:=============== ============================================ RMAN-03002:sql失败2017 年 2 月 6 日 14:51:09 的语句命令 ORA-01139:RESETLOGS 选项仅在数据库恢复不完整后有效
  • @rednax 如果您没有在备份和恢复尝试之间打开数据库(例如,您只是在测试备份/恢复),则数据库不需要擦除重做日志,因为它仍将被视为完全恢复。那是你在做什么吗?无论如何,请尝试:“更改数据库打开;”而不是“alter database open resetlogs;”。
  • 还没有运气。我对数据库进行了一些更改,以确保在重新测试还原之前有需要还原的内容。尝试 ALTER DATABASE OPEN RESETLOGS;给出同样的错误。没有 RESETLOGS 得到 RMAN-03002:sql 语句命令在 02/06/2017 15:37:09 失败 ORA-01190:控制文件或数据文件 1 来自最后一个 RESETLOGS ORA-01110:数据文件 1:
  • @rednax 检查你的化身,你可能不得不重置化身:RMAN> 列出化身; RMAN> 将数据库重置为化身 #;参考:docs.oracle.com/database/121/RCMRF/rcmsynta2007.htm#RCMRF148
猜你喜欢
  • 2016-02-16
  • 2015-04-24
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多