关于DG环境下备库数据文件重命名的问题:
前言:
主要想表明DG环境下备库数据文件重命名的问题,以及db_file_name_convert与log_file_name_convert的作用。
实验证明:
主库为备库备份一份控制文件
RMAN> backup current controlfile for standby format '/home/oracle/rman/';
拷贝到备库进行恢复.
备库此时不设置db_file_name_convert ,log_file_name_convert两个参数:
SQL> show parameter db_file_name_convert;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
SQL> show parameter log_file_name_convert;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_file_name_convert string
恢复备库控制文件:
RMAN> restore controlfile from ‘/home/oracle/rman/’;
SQL> alter database mount;
查看控制文件中记录的数据文件信息:(proddg2为主库,prod为备库,曾做过主备切换)
SQL> select name from v$datafile;
NAME
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
SQL> select member from v$logfile;
MEMBER
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/std_redo04.log
/oracle/app/oradata/proddg2/std_redo05.log
/oracle/app/oradata/proddg2/std_redo06.log
控制文件中记录的数据文件位置都是主库的,进行restore前,需要进行数据文件重命名
手动重命名:
SQL> set line 500
SQL> set pages 0
SQL> select q'[alter database rename file ']' || name || q'[' to ]' || q'['/oracle/app/oradata/prod/]' || substr(name,instr(name,'/',-1)+1) || q'[';]' from v$datafile;
执行:
alter database rename file '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
alter database rename file '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
alter database rename file '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
alter database rename file '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
alter database rename file '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01141: error renaming data file 1 - new file '/oracle/app/oradata/prod/' not found
ORA-01110: data file 1: '/oracle/app/oradata/proddg2/'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
使用sqlplus手动进行重命名,重命名后的文件要在指定目录存在。(适用于热备份方式同步搭建DG)
使用RMAN在restore前重命名:
SQL> select q'[set newname for datafile ']' || name || q'[' to ]' || q'['/oracle/app/oradata/prod/]' || substr(name,instr(name,'/',-1)+1) || q'[';]' from v$datafile;
将获取到的内容复制到RMAN命令块中形成脚本
:
rman target / log=recover_log << EOF
run
{
allocate channel d1 device type disk;
allocate channel d2 device type disk;
allocate channel d3 device type disk;
catalog start with '/home/oracle/rman';
set newname for datafile '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
set newname for datafile '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
set newname for datafile '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
set newname for datafile '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
set newname for datafile '/oracle/app/oradata/proddg2/' to '/oracle/app/oradata/prod/';
release channel d1;
release channel d2;
release channel d3;
restore database;
switch datafile all;
}
exit
EOF
Recovery Manager complete.
查看数据文件以及日志文件的记录:
数据文件:
SQL> select name from v$datafile;
NAME
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
数据文件重命名成功也恢复成功。
日志文件:
SQL> select member from v$logfile;
MEMBER
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/
/oracle/app/oradata/proddg2/std_redo04.log
/oracle/app/oradata/proddg2/std_redo05.log
/oracle/app/oradata/proddg2/std_redo06.log
日志文件还需要手动重命名,因为不存在proddg2目录,重命名至prod目录下
(日志文件是可以在sqlplus中mount状态下重命名的,不需要在对应目录存在日志文件)。
2.如果在备库此时存在如下参数时的情况:
db_file_name_convert =/oracle/app/oradata/proddg2, /oracle/app/oradata/prod
log_file_name_convert=/oracle/app/oradata/proddg2, /oracle/app/oradata/prod
恢复备库的控制文件:
RMAN> restore controlfile from '/home/oracle/rman/';
SQL> alter database mount;
Database altered.
查看数据文件与日志文件信息:
SQL> select name from v$datafile;
NAME
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
SQL> select member from v$logfile;
MEMBER
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/
/oracle/app/oradata/prod/std_redo04.log
/oracle/app/oradata/prod/std_redo05.log
/oracle/app/oradata/prod/std_redo06.log
再直接使用RMAN执行restore database即可。
RMAN> restore database;
总结:
两种方式将主库的控制文件传给备库。
1.alter database create standby controlfile as ‘/home/oracle/’;
拷贝到备库,将数据库启动到mount模式后,需要手动进行数据文件重命名,但是要保证重命名后的路径下存在相应的数据文件。
//该控制文件中记录的数据文件路径仍为主库的数据文件路径。
current controlfile for standby format ‘/home/oracle/%d_%I_%s_%’;
使用RMAN备份的控制文件,拷贝到备库时,使用RMAN进行恢复控制文件时
如果备库设置了db_file_name_convert与log_file_name_convert参数,
那么当数据库启动到mount时,就无需手动进行数据文件重命名,因为RMAN在恢复控制文件过程中,会依据该参数设置,自行修改控制文件中记录的数据文件路径日志文件路径。
如果备库没有设置db_file_name_convert与log_file_name_convert参数
那么就需要在restore前在RMAN的run块中对数据文件进行set new name 然后执行switch datafile all。
但是日志文件还是需要手动重命名。
3.另外意义
db_file_name_convert与log_file_name_convert参数的另外一个意义就是当主库创建数据文件等操作时,备库会根据该参数转化路径后自动创建一个相对应位置的数据文件,前提是STANDBY_FILE_MANAGEMENT参数为auto模式。这里是引用
疑问:备库的redo与standby redo是如何生成的,何时生成的。
直通车:
/baoyuhang0/article/details/108270617