Oracle 11g Rman 使用 Windows 平台备份中的另一个数据库名称进行还原

Joe*_*til 2 oracle oracle-11g-r2 rman restore

任何人都可以在oracle 11g(Windows平台)中使用另一个数据库名称共享RMAN还原到另一台服务器的正确方法。我对我发现的所有 RMAN 还原方法完全感到困惑。我已经使用命令进行了备份

BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
Run Code Online (Sandbox Code Playgroud)

请确认是否需要单独进行控制文件备份。

任何帮助将不胜感激。

CaM*_*CaM 5

默认情况下,控制文件与您的数据一起备份。这是通过以下命令打开或关闭的:

CONFIGURE CONTROLFILE AUTOBACKUP ON;
Run Code Online (Sandbox Code Playgroud)

但作为一种习惯,我通常按照以下方式进行数据备份:

backup current controlfile ;
backup spfile ;
Run Code Online (Sandbox Code Playgroud)

我在 Windows 上使用重复数据库遇到了很多麻烦。通常,我会遇到目标登录的 NTS 权限失败,这会阻止创建辅助数据库。我努力解决这些错误......好吧,我放弃了。

这促使我起草了一份“剧本”文档,其中包含手动将数据库恢复到具有新实例名称的新服务器所需的所有各种 OS 和 RMAN 命令。这也让我可以通过更多的控制来调整新主机的内容。

这些脚本在我的 Oracle 12.1 Windows 环境中进行了测试,但可能不适合您的环境。例如,我知道 RMAN 更愿意在 12c 中运行 SQL 语句而不是在 11g 中。希望他们有所帮助。

这些脚本是通过多次反复试验创建的,基于用于恢复的链接和用于更改 SID 的链接。步骤是:

确保所有内容都已备份。

我喜欢获得 spfile 和 controlfile 的新副本,因为它使以后更容易。

backup device type disk incremental level = 0 section size 1g database plus archivelog;
backup current controlfile tag='Controlfile Level 0';
backup spfile tag='SPFile Level 0';
Run Code Online (Sandbox Code Playgroud)

如果您的旧服务器和新服务器对 Oracle 数据使用不同的文件路径,请运行以下命令:

select '  Set Newname For Datafile ' || file# || ' to ''' || name || ''';' from v$datafile;
select '  Alter Database Rename File ''' || Member || ''' To ''' || Member || ''';' from v$logfile;
Run Code Online (Sandbox Code Playgroud)

获取输出并根据需要更改路径/文件名以匹配您的新环境。

将备份从旧主机复制到新主机

可选,但我喜欢将 RMAN 备份文件放在我要恢复的机器上。因此,登录新服务器,并从旧服务器的快速恢复区复制完整备份、归档日志和自动备份文件夹。请注意,您只需返回到最近的完整备份,无需获取数周的文件。

暂存新实例

在新主机上,创建数据文件夹、快速恢复文件夹和管理文件夹。确保安装了 Oracle 并且 Oracle 用户帐户可以完全控制这些文件夹。

创建一个空实例,与实例同名:

oradim -new -sid <<old sid name>>

Set ORACLE_SID=<<old sid name>>
RMAN target /
Run Code Online (Sandbox Code Playgroud)

使用 RMAN 恢复 SPFILE 和控制文件。在 RMAN 中,设置 DBID 以匹配旧实例的 DB ID,以及匹配您的环境的文件名和路径:

SET DBID=1234567;
startup nomount;
restore spfile to 'C:\Oracle\Product\12.1.0\dbhome_1\database\init<<Old sid>>/ora' from 'f:\fast_recovery_area\<<old sid>>\BackupSet\2017_07_17\O1_MF_NNSNF_SPFILE_LEVEL_0_DOSTOJT8_.BKP';
create pfile='c:\oracle\product\12.1.0\dbhome_1\Database\pfile<<old sid>>.ora' from spfile='c:\oracle\product\12.1.0\dbhome_1\Database\Init<<old sid>>.ora';
shutdown immediate;
Run Code Online (Sandbox Code Playgroud)

暂时不要关闭 RMAN。在 NotePad 或 NotePad++ 中编辑上一步中的 pfile。根据需要调整路径和内存要求以反映新环境。不要更改数据库的名称,而是将文件夹路径更改为新实例名称。

返回到您的 RMAN 会话并恢复控制文件。再次,根据需要修复路径。

startup nomount pfile = 'c:\oracle\product\12.1.0\dbhome_1\Database\pfile<<old sid>>.ora’;
restore controlfile from 'F:\fast_recovery\<<old sid>>\BACKUPSET\2017_07_05\O1_MF_NCNNF_CONTROLFILE_LEVEL_0_DOSTO715_.BKP';
Alter Database Mount;
Run Code Online (Sandbox Code Playgroud)

恢复你的数据库文件

仍然在 RMAN 中,清点您复制的备份文件。

 catalog start with 'f:\fast_recovery_Area\<<old sid>>';
Run Code Online (Sandbox Code Playgroud)

现在将您的重做日志文件移动到 RMAN 中的新文件夹中。您之前生成了这些脚本。

Alter Database Rename File 'O:\ORADATA\<<old sid>>\REDO03.LOG' To 'f:\ORADATA\<<NEW sid>>\REDO03.LOG';
Alter Database Rename File 'O:\ORADATA\<<old sid>>\REDO02.LOG' To 'f:\ORADATA\<<new sid>>\REDO02.LOG';
Alter Database Rename File 'O:\ORADATA\<<old sid>>\REDO01.LOG' To 'f:\ORADATA\<<NEW Sid>>\REDO01.LOG';
Run Code Online (Sandbox Code Playgroud)

现在我们进行还原和恢复,替换之前创建的 NewName 脚本。

run { 
    Set Newname For Datafile 1 to 'f:\ORADATA\<<new sid>>\SYSTEM01.DBF';
    Set Newname For Datafile 3 to 'f:\ORADATA\<<new sid>>\SYSAUX01.DBF';
    Set Newname For Datafile 5 to 'f:\ORADATA\<<new sid>>\UNDOTBS01.DBF';
    Set Newname For Datafile 6 to 'f:\ORADATA\<<new sid>>\USERS01.DBF';

    RESTORE DATABASE;
    SWITCH DATAFILE ALL;
    RECOVER DATABASE;
}
Run Code Online (Sandbox Code Playgroud)

RMAN 完成基本还原和恢复后,创建一个新的 SPFile。

create spfile from pfile = 'c:\oracle\product\12.1.0\dbhome_1\Database\pfile<<OLD sid>>.ora’;
alter database open resetlogs;
Run Code Online (Sandbox Code Playgroud)

Oracle 不备份或恢复 TEMP 表空间。这将阻止完全恢复成功。创建一个新的临时表空间,删除旧的,然后重建原始的。

CREATE TEMPORARY TABLESPACE TEMP_NEW TEMPFILE 'f:\OraData\<<NEW Sid>>\TempNew1.dbf' SIZE 5m autoextend on next 10m maxsize unlimited;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_NEW;
DROP TABLESPACE TEMP including contents;
CREATE TEMPORARY TABLESPACE TEMP TEMPFILE 'f:\OraData\<<NEW Sid>>\Temp01.dbf' SIZE 50m autoextend on next 10m maxsize unlimited;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;
DROP TABLESPACE TEMP_NEW including contents and datafiles;
Run Code Online (Sandbox Code Playgroud)

更改实例名称

此时,Oracle 应该正在运行数据库的完全还原副本。但是你想要一个新名字。在 RMAN 中:

Shutdown immediate;
Startup mount;
Run Code Online (Sandbox Code Playgroud)

不要关闭 RMAN,而是从以管理员身份运行的新 CMD 窗口中:

 set ORACLE_SID=<<old sid>>
 NID target=/ DBNAME=<<new sid>>
Run Code Online (Sandbox Code Playgroud)

请注意这为您提供的 DBID,因为您稍后将需要它进行灾难恢复(请注意,这是我们在顶部的第一个 RMAN 命令)。

返回 RMAN 窗口:

Shutdown Immediate;
Startup Mount;
Alter System Set DB_NAME=<<New sid>> scope=SPFILE;
Shutdown Immediate;
exit;
Run Code Online (Sandbox Code Playgroud)

启动您的新数据库!

在另一个 CMD 窗口中,创建一个新的密码文件,然后重新创建 Windows 服务。请注意,此实用程序不会在路径周围使用引号,这与 Oracle 中的大多数情况不同。

orapwd file=c:\oracle\product\12.1.0\dbhome_1\Database\pwd<<new SID>>.ora password=<SYS pwd> entries=25
oradim -delete -sid <<old sid>>
oradim -new -sid <<new sid>> -intpwd <SYS pwd> -startmode a 
Run Code Online (Sandbox Code Playgroud)

启动数据库。

Set Oracle_SID=<<new sid>>
lsnrctl reload
sqlplus / as sysdba
Startup Mount;
Alter Database Open ResetLogs;
Run Code Online (Sandbox Code Playgroud)

备份您的新数据库

此时,您的数据库没有备份。在此数据库中执行任何工作之前执行 RMAN 备份。