一、环境:
源端服务器:CentOS release 6.8 (Final)+Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
目的服务器:CentOS release 6.8 (Final)+Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
区别:oracle的安装目录略有不同:
源端服务器:
目标服务器:和原服务器放置数据文件、日志文件等路径不一致,所以需要在恢复时进行特别转换--见二-10中的脚本
二、恢复
1、根据spfile备份文件(strings)编辑pfile文件
a、导出spfile文件
[oracle@template RMANBAK]$ strings Spfile_ORCL_1517493832_20191028_622_1_1.bak }|{z sZORCL TAG20191028T141517 ORCL orcl.__db_cache_size=922746880 orcl.__java_pool_size=16777216 orcl.__large_pool_size=16777216 orcl.__oracle_base='/home/oracle/app'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=24813502464 orcl.__sga_target=2147483648 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=1107296256 orcl.__streams_pool_size=16777216 *.audit_file_dest='/home/oracle/app/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/home/oracle/app/oradata/orcl/control01.ctl','/home/oracle/app/oradata/orcl/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_flashback_retention_target=10080 *.db_name='orcl' *.db_recovery_file_dest='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/' *.db_recovery_file_dest_size=274877906944 *.diagnostic_dest='/home/oracle/app' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.open_cursors=2000 *.pga_aggregate_target=24811405312 *.processes=300 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=2147483648 *.streams_pool_size=134217728 *.undo_tablespace='UNDOTBS1' /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl.ora
b、根据spfile文件编辑pfile;
[root@template ~]# vim /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initnc.ora orcl.__db_cache_size=922746880 orcl.__java_pool_size=16777216 orcl.__large_pool_size=16777216 orcl.__oracle_base='/home/oracle/app'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=24813502464 orcl.__sga_target=2147483648 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=1107296256 orcl.__streams_pool_size=16777216 *.audit_file_dest='/home/oracle/app/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/home/oracle/app/oradata/orcl/control01.ctl','/home/oracle/app/oradata/orcl/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_flashback_retention_target=10080 *.db_name='orcl' *.db_recovery_file_dest='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/' *.db_recovery_file_dest_size=274877906944 *.diagnostic_dest='/home/oracle/app' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.open_cursors=2000 *.pga_aggregate_target=24811405312 *.processes=300 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=2147483648 *.streams_pool_size=134217728 *.undo_tablespace='UNDOTBS1'
2、加载数据库
RMAN> startup nomount pfile="/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initnc.ora";
查找原因:
原因为:备份的spfile.ora文件中记录路径,目标端不存在,路径不一致,需要修改路径,所有的相关路径都需要进行修改
3、修改内容:
原NC的spfile的还原路径
更改后的路径:通过原spifle文件中的文件名称(如adump,或control01.cto),查找当前新环境的文件名称(如adump,或control01.ctl),更换为新环境的路径即可
(1)修改initnc.ora路径
orcl.__java_pool_size=16777216 orcl.__large_pool_size=16777216 orcl.__oracle_base='/home/oracle/app/oracle'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=24813502464 orcl.__sga_target=2147483648 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=1107296256 orcl.__streams_pool_size=16777216 *.audit_file_dest='/home/oracle/app/oracle/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.0.0' *.control_files='/home/oracle/app/oracle/oradata/orcl/control01.ctl','/home/oracle/app/oracle/fast_recovery_area/orcl/control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_flashback_retention_target=10080 *.db_name='orcl' *.db_recovery_file_dest='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/' *.db_recovery_file_dest_size=274877906944 *.diagnostic_dest='/home/oracle/app' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.open_cursors=2000 *.pga_aggregate_target=24811405312 *.processes=300 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=2147483648 *.streams_pool_size=134217728 *.undo_tablespace='UNDOTBS1'
4、新问题:进行修改后,在进入rman target /,确无法进入,解决方案,见:https://www.topunix.com/post-1343.html
5、根据上述连接解决后,继续进行还原操作--重新加载数据库
RMAN>startup nomount pfile="/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initnc.ora";
6、加载控制文件(可以加载最新控制文件)
RMAN> restore controlfile from "/home/BACKUP/RMANBAK/c-1517493832-20191028-01.ctl";
对两个控制文件都进行了还原
7、挂载数据库:
RMAN> alter database mount;
8、检查备份:
RMAN>crosscheck backup;
因没有此路径,所以全部显示过期,需要将备份数据放置此路径中。(所以在还原前,创建备份路径为控制文件中的备份路径)
当把备份文件全部考入到/home/BACKUP/RMANBAK/中后,重新执行5-6-7步,再进行检查备份,就显示avliable了
9、删除过期的备份
RMAN>delete noprompt expired backup;
再次查看已经删除
RMAN>crosscheck backup;
10、转储(还原)数据(restore database)——因为控制文件中,源端的dbf文件路径和目的端dbf文件路径不一致,所以需要用set newname for datafile更改路径到当前真实路径
run{ allocate channel a1 device type disk; allocate channel a2 device type disk; ##set until sequence=4631 thread=1; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/system01.dbf' to '/home/oracle/app/oracle/oradata/orcl/system01.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/undotbs01.dbf' to '/home/oracle/app/oracle/oradata/orcl/undotbs01.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_DATA01_2.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_DATA01_2.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/sysaux01.dbf' to '/home/oracle/app/oracle/oradata/orcl/sysaux01.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_DATA01_1.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_DATA01_1.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_INDEX02.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_INDEX02.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/users01.dbf' to '/home/oracle/app/oracle/oradata/orcl/users01.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_DATA02.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_DATA02.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_INDEX03.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_INDEX03.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_DATA03.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_DATA03.dbf'; SET NEWNAME FOR DATAFILE '/home/oracle/app/oradata/orcl/NNC_INDEX01.dbf' to '/home/oracle/app/oracle/oradata/orcl/NNC_INDEX01.dbf'; restore database; switch datafile all; release channel a1; release channel a2; }
RMAN>restore database;(如果控制文件中,源端的dbf文件路径和目的端dbf文件路径一致,可以直接使用restore database)
如下显示,如果源端dbf文件路径和目的端dbf文件路径不一致,会报如下错误)
也可以通过如下解决(增加路径):
根据错误提示,因为没有此目录,所以无法还原,所以需要创建目录(或者直接通过)
[root@template app]# mkdir /home/oracle/app/oradata
[root@template app]# mkdir /home/oracle/app/oradata/orcl
[root@template app]# chown oracle:oinstall /home/oracle/app/oradata/orcl/
再导入,报错:ORA-27072:File I/O error,经查询,是目录存储空间不足,进行扩容后,重新restor database;
restore完成:
12、恢复文件(recover):recover恢复增量备份中的1级增量文件、同时还原archilog备份文件到flash_recovery(根据initnc.ora路径/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/ORCL/archivelog)
RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
RMAN> recover database until time '2019-10-27 04:30:00'; ---找不到大量的archive log文件
RMAN> recover database until time '2019-10-27 04:20:00'; ---找不到少量的archive log文件.
RMAN> recover database until time '2019-10-27 04:00:00'; ---不缺少archive log文件,数据文件有问题,重新导入试试
此处需要加时间:
下图的错误是因为rman的0级备份+1级备份的时间点是截止到2019-10-27 04:00:00,如果还原到4:30,需要有更新的archivelog才可以
分析::datafile 1 must be restored from backup 原因为完全恢复导致,解决方法,见:https://www.topunix.com/post-1410.html中,二-10
13、 RMAN>recover database until time '2019-10-28 04:00:00';
(1)执行完成
14、 RMAN>alter database open resetlogs(通常情况下,当我们基于不完全恢复的时候,日志文件需要被清空,而此时是正在被清空。)
进行打开数据库:alter database open resetlogs 进行不完全恢复,出现报错:
原因:
a、还原的源端数据库记录的redo01.log在/home/oracle/app/oradata/orcl/中。
但是目的端数据库记录在/home/oracle/app/oracle/oradata/orcl/中,需要对此数据路径更改即可。
查看路径:SQL>select * from v$logfile;
b、一定在sql执行,在数据库只mount状态下执行
SQL>alter database rename file '/home/oracle/app/oradata/orcl/redo01.log' to '/home/oracle/app/oracle/oradata/orcl/redo01.log';
SQL>alter database rename file '/home/oracle/app/oradata/orcl/redo02.log' to '/home/oracle/app/oracle/oradata/orcl/redo02.log';
SQL>alter database rename file '/home/oracle/app/oradata/orcl/redo03.log' to '/home/oracle/app/oracle/oradata/orcl/redo03.log';
执行后,查看路径:SQL>select * from v$logfile;
c、执行上述文件后再执行打开数据库:redo02.log出现being cleared问题,
-- 查看故障描述信息:
SQL> ho oerr ora 00392
---查看当前日志信息:下面的SQL语句表名3个日志文件都处于clearing状态
SQL> select group#,bytes/1024/1024||'M',status from v$log;
--执行CLEAR LOGFILE命令
SQL>
ALTER
DATABASE
CLEAR LOGFILE
GROUP
1;
SQL>
ALTER
DATABASE
CLEAR LOGFILE
GROUP
2;
SQL>
ALTER
DATABASE
CLEAR LOGFILE
GROUP
3;
--执行完后,再查看,已经恢复正常
SQL> select group#,bytes/1024/1024||'M',status from v$log;
15、再次打开数据库(不完全恢复),成功。
16、创建spfile文件
(1)直接create spfile from pfile 报错;
SQL> create spfile from pfile;
(2)因为我们startup nomount的pfile文件是initnc.ora,所以需要指定pfile路径
SQL> create spfile from pfile='/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initnc.ora';
17、查看当前spfile,没有值,所以从pfile启动。
show parameter spfile;
18、关闭数据库,重启数据库,再查看
19、注意:temp01(临时表空间)文件在RMAN中不会自动恢复的,看下图:
(1)根据登录前台服务会发现,提示缺少temp01.dbf文件
(2)目标数据库:temp01.dbf,时间仍然是早期的文件,并未被恢复到Nov 6这一天的。
(3)下图是还原时的文件,可以看出,并不包含temp01.dbf 文件。
(4)登录sql 查看,发现数据库中并不能查出符合条件的临时表空间(因当前环境中没有/home/oracle/app/oradata/orcl目录),原因是控制文件中记录的的临时表空间的数据位置是在/home/oracle/app/oradata/orcl,而不是在/home/oracle/app/oracle/oradata/orcl中;所以删除temp表空间并重新创建
SQL> select tablespace_name, file_name from dba_temp_files;
(5)手动创建临时表空间:(这种rman恢复的环境,无法通过删除旧temp文件,并重启数据库解决)可以手动创建临时表空间——但同样报错
SQL> create temporary tablespace nc_temp tempfile '/home/oracle/app/oracle/oradata/orcl/temp01.dbf' size 50m autoextend on next 50m maxsize 2480m extent management local;
(6)查看当前表空间信息,temp表空间是online状态
SQL> select tablespace_name,status,contents from dba_tablespaces;
(7)查看临时表空间数据文件
(8)--删除整个临时表空间及数据文件(无法直接删除)
SQL>drop tablespace temp including contents and datafiles;
无法直接删除,重新创建其他临时表空间nc_temp
a.创建其他表空间:
SQL>create temporary tablespace nc_temp tempfile '/home/oracle/app/oracle/oradata/orcl/temp01.dbf' size 50m autoextend on next 50m maxsize 2480m extent management local;
b.将临时表空间进行更改:
SQL>alter database default temporary tablespace nc_temp;
c.再删除原报错表空间:
SQL>drop tablespace temp including contents and datafiles;
d.重新测试完成了
d.alter database default temporary tablespace temp1;
RMAN> crosscheck archivelog all;+————检查归档日志
RMAN> delete noprompt archivelog until time "sysdate-1";——删除前一天之前归档日志
总结:
从上面的测试发现,当数据库中temp表空间中的数据文件损坏或丢失情况下,使用rman是无法进行恢复的。
可以通过,直接重启数据库,或者新建临时表空或者新增tempfile方法进行修复。
文章评论