12c RAC+ASM异机恢复到单机文件系统

背景说明

有一套Oracle 12c RAC环境由其他供应商实施RMAN备份,但多年时间过去一直没有实施恢复测试。客户也没有找到当年验收资料有针对恢复的手顺书,于是拜托我针对现有备份实施一次恢复测试并留下一份指导手顺书。

实施记录

鉴于客户信息的保密性,如下是测试环境模拟。

1. 检查备份

通过备份检查,我们可以获取到一些有用的信息,参考如下:
实例名称:RACDB
DBID号码:1038706910
在这里插入图片描述

2. 恢复服务器环境构筑

创建恢复服务器,设置大于原库数据大小的磁盘容量。设置相同的服务器主机名参照原服务器系统及软件版本和位数配置恢复的服务器,避免恢复过程中版本差异导致的问题;
ORACLE用户权限与号码参考本番,否则挂载NFS备份盘会有权限问题
<过程省略>

3. 挂载本番NFS备份盘

通过挂载NFS备份盘可以减少拷贝带来的等待时间与磁盘空间,许多客户的数据动不动就是TB级别拷贝太耗时。

mount -t nfs,_netdev -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=600 192.168.0.99:/home/nfs /backups

在这里插入图片描述

4. 创建相关的目录

mkdir -p /opt/app/oracle/admin/RACDB/{
    
    adump,bdump,cdump,dpdump,pfile,udump}
mkdir -p /opt/app/oracle/oradata/RACDB
mkdir -p /opt/app/oracle/archive/RACDB

5. 手工编写PFILE文件

鉴于原有的RAC SPFILE内容与恢复服务器不一样,因此手工创建PFILE文件。

vi /opt/app/oracle/product/12.1.0/dbhome_1/dbs/initRACDB.ora
## pfile参考
*.audit_file_dest='/opt/app/oracle/admin/RACDB/adump'
*.audit_sys_operations=TRUE
*.audit_trail='NONE'
*.cluster_database=false
*.compatible='12.1.0.2.0'
*.control_files='/opt/app/oracle/oradata/RACDB/control01.ctl','/opt/app/oracle/oradata/RACDB/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_files=500
*.db_name='RACDB'
*.diagnostic_dest='/opt/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
*.instance_number=1
*.log_archive_dest_1='LOCATION=/opt/app/oracle/archive/RACDB/'
*.log_archive_format='%t_%s_%r.dbf'
*.log_checkpoints_to_alert=TRUE
*.memory_max_target=7516192768
*.memory_target=7516192768
*.nls_language='ENGLISH'
*.nls_territory='HONG KONG'
*.open_cursors=500
*.processes=500
*.recyclebin='off'
*.remote_login_passwordfile='exclusive'
*.sessions=955
*.thread=1
*.undo_tablespace='UNDOTBS1'
*.local_listener=''

6. 新文件路径变更构筑

异机恢复时,我们的原数据库是ASM环境,恢复服务器是文件系统。两者不一样,因此需要通过SET NEWNAME方式实现指定新位置。
不可以采用DG时的db_file_name_convert参数实现自动修改,必须要用SET NEWNAME方式

select 'SET NEWNAME FOR DATAFILE '|| file# ||' to ' ||''''|| name ||''''|| ';' from v$datafile;

在这里插入图片描述
通过替换方式构造RMAN恢复脚本:

run {
    
    
SET NEWNAME FOR DATAFILE 1 to '/opt/app/oracle/oradata/RACDB/system01.dbf';
SET NEWNAME FOR DATAFILE 2 to '/opt/app/oracle/oradata/RACDB/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/opt/app/oracle/oradata/RACDB/undotbs101.dbf';
SET NEWNAME FOR DATAFILE 4 to '/opt/app/oracle/oradata/RACDB/undotbs201.dbf';
SET NEWNAME FOR DATAFILE 5 to '/opt/app/oracle/oradata/RACDB/users01.dbf';
restore database;
switch datafile all;
}

7. 新REDOFILE路径变更构筑

select 'alter database rename file '''||member||q'[' to '/opt/app/oracle/oradata/RACDB/redo';]' from v$logfile;

在这里插入图片描述

8. RMAN异机恢复

rman target /
# 设置DBID号码信息
set dbid=1038706910
# 通过pfile启动到nomount状态
startup nomount pfile ='/opt/app/oracle/product/12.1.0/dbhome_1/dbs/initRACDB.ora';
# 恢复ControlFile控制文件
restore controlfile from '/backups/RACDB.c-1038706910-20200530-01.conf';
# 数据库启动到mount状态
alter database mount;
# 注册RMAN备份信息
catalog start with '/backups/';
# restore database还原数据文件
run {
    
    
SET NEWNAME FOR DATAFILE 1 to '/opt/app/oracle/oradata/RACDB/system01.dbf';
SET NEWNAME FOR DATAFILE 2 to '/opt/app/oracle/oradata/RACDB/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 3 to '/opt/app/oracle/oradata/RACDB/undotbs101.dbf';
SET NEWNAME FOR DATAFILE 4 to '/opt/app/oracle/oradata/RACDB/undotbs201.dbf';
SET NEWNAME FOR DATAFILE 5 to '/opt/app/oracle/oradata/RACDB/users01.dbf';
restore database;
switch datafile all;
}
# recover database应用日志文件
## "完整恢复" (鉴于有一些REDOFILE在ASM未取出来的且Archivelog也没有取过来,无法做完整恢复)
recover database;
## 基于时间恢复
sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
recover database until time '2020-05-30 01:30:00';

# REDO FILE路径变更
alter database rename file '+DATA01/RACDB/redo01.log' to '/opt/app/oracle/oradata/RACDB/redo01.log';
alter database rename file '+DATA01/RACDB/redo02.log' to '/opt/app/oracle/oradata/RACDB/redo02.log';
alter database rename file '+DATA01/RACDB/redo03.log' to '/opt/app/oracle/oradata/RACDB/redo03.log';
alter database rename file '+DATA01/RACDB/redo04.log' to '/opt/app/oracle/oradata/RACDB/redo04.log';
# 创建SPFILE文件
create spfile from pfile
# 启动数据库 (如果需要可以通过read only开库检查一下)
alter database open resetlogs;

9. 创建监听服务

netca

在这里插入图片描述
<略>

10. TEMP表空间修复

create temporary tablespace temp02 tempfile '/opt/app/oracle/oradata/RACDB/temp02.dbf' size 10M autoextend on next 100M maxsize 30G;
alter database default temporary tablespace temp02;
drop tablespace temp;
create temporary tablespace temp tempfile '/opt/app/oracle/oradata/RACDB/temp01.dbf' size 100M autoextend on next 100M maxsize 30G;
alter database default temporary tablespace temp;
drop tablespace temp02;

11. 检查数据库状态

# 检查数据库启动状态
select dbid, open_mode from v$database;
# 检查数据文件状态
select status,enabled, name, bytes/1024/1024 file_size from v$datafile;
# 检查临时文件状态
select status,enabled, name, bytes/1024/1024 file_size from v$tempfile;
# 检查日志文件状态
select * from v$logfile;
# 检查无效对象状态
col vname format a60
select o.object_type,o.status,o.owner||'.'||o.object_name vname from dba_objects o join dba_users u on o.owner = u.username 
where u.default_tablespace like 'USER%' and o.status ='INVALID';

常见问题

  1. 恢复控制文件出现如下信息:
RMAN> restore controlfile from '/backups/RACDB.c-1038706910-20200530-00.conf';

Starting restore at 30-MAY-20
using channel ORA_DISK_1

channel ORA_DISK_1: no AUTOBACKUP in 7 days found
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 05/30/2020 22:48:16
RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece

解决方案:/backups 的备份文件权限问题引起,解决权限问题即可。

2.sys用户登录会报 ORA-01017
解决方案:手工创建密码文件

# 查询密码文件是否存在
select * from v$pwfile_users;
# 创建密码文件
orapwd file='/opt/app/oracle/product/12.1.0/dbhome_1/dbs/orapwRACDB' password=oracle entries=5 force=y
  1. 业务测试过程中,数据库会出现自动关闭。查询日志反馈如下信息:
ORA-00600: internal error code,arguments:[17090], [] , []

解决方案:TEMP文件不会在RMAN恢复过程被创建,我们必须要手工创建。

猜你喜欢

转载自blog.csdn.net/weixin_38623994/article/details/106447061