实验环境:windows 2008 R2 & RHEL 6.5Oracle版本:11.2.0.4参考文档:
- 将windows数据库shutdown immediate,然后启动到mount模式下2. 生成pfile文件create pfile='d:rmanbackuppfile.ora' from spfile;3. 进行RMAN备份数据库和控制文件rman target /
- 将pfile.ora和RMAN备份的数据文件和控制文件传到linux上
- 修改传送过去的pfile.ora文件,将一系列目录改为linux上的对应目录,注意sga和PGA的修改
假如报错,根据报错排查对应错误一定需要注意,修改或者加上redo日志的位置,不然就会变成下面这样这TM就很尴尬了…怎么会犯这种低级错误呢,..
- SQL> set linesize 999
- SQL> col member format a80;
- SQL> select * from v$logfile;
- GROUP# STATUS TYPE MEMBER IS_
- ———- ———- ——- ——————————————————————————– —
- 1ONLINE /u01/app/oracle/product/11.2.0/db_1/dbs/D:ORACLEPRODUCTORADATAORCLREDO01.LOG NO
- 3ONLINE /u01/app/oracle/product/11.2.0/db_1/dbs/D:ORACLEPRODUCTORADATAORCLREDO03.LOG NO
- 2ONLINE /u01/app/oracle/product/11.2.0/db_1/dbs/D:ORACLEPRODUCTORADATAORCLREDO02.LOG NO
我这就只能通过事后新建几个redo日志组,然后将这几个"另类"删掉来解决问题了…
- 恢复控制文件并且mount数据库rman target /
- [oracle@oratest ~]$ rman target /
- Recovery Manager: Release 11.2.0.4.0 – Production on Wed Dec 7 14:48:47 2016
- Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
- connected to target database: ORCL (not mounted)
- RMAN> restore controlfile from '/tmp/rmanbackup/CONTROL_03RMSH55_1_1';
- Starting restore at 07-DEC-16
- using target database control file instead of recovery catalog
- allocated channel: ORA_DISK_1
- channel ORA_DISK_1: SID=20 device type=DISK
- channel ORA_DISK_1: restoring control file
- channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
- output file name=/oradata/CONTROL01.CTL
- output file name=/oradata/CONTROL02.CTL
- output file name=/oradata/CONTROL03.CTL
- Finished restore at 07-DEC-16
- RMAN> sql 'alter database mount';
- sql statement: alter database mount
- released channel: ORA_DISK_1
- 清理RMAN记录的catalog的失效记录
- RMAN> crosscheck backup;
- Starting implicit crosscheck backup at 07-DEC-16
- allocated channel: ORA_DISK_1
- channel ORA_DISK_1: SID=20 device type=DISK
- Crosschecked 2 objects
- Finished implicit crosscheck backup at 07-DEC-16
- Starting implicit crosscheck copy at 07-DEC-16
- using channel ORA_DISK_1
- Finished implicit crosscheck copy at 07-DEC-16
- searching for all files in the recovery area
- cataloging files…
- no files cataloged
- using channel ORA_DISK_1
- crosschecked backup piece: found to be 'EXPIRED'
- backup piece handle=D:RMANBACKUPFULL_01RMSH1N_1_1 RECID=1 STAMP=929973303
- crosschecked backup piece: found to be 'EXPIRED'
- backup piece handle=D:RMANBACKUPFULL_02RMSH3P_1_1 RECID=2 STAMP=929973370
- Crosschecked 2 objects
- RMAN> delete expired backup;
- using channel ORA_DISK_1
- List of Backup Pieces
- BP Key BS Key Pc# Cp# Status Device Type Piece Name
- ——- ——- — — ———– ———– ———-
- 1 1 1 1 EXPIRED DISK D:RMANBACKUPFULL_01RMSH1N_1_1
- 2 2 1 1 EXPIRED DISK D:RMANBACKUPFULL_02RMSH3P_1_1
- Do you really want to delete the above objects (enter YES or NO)? yes
- deleted backup piece
- backup piece handle=D:RMANBACKUPFULL_01RMSH1N_1_1 RECID=1 STAMP=929973303
- deleted backup piece
- backup piece handle=D:RMANBACKUPFULL_02RMSH3P_1_1 RECID=2 STAMP=929973370
- Deleted 2 EXPIRED objects
- 将RMAN备份文件加入到catalog
有几个加几个,或者假如备份文件很多,那么用下面的命令
注意假如是直接指定了一个目录,那么最后必须接/表示这是一个目录,否则会被认为是一个前缀
9.开始从catalog中恢复数据库,并且set newname来指定新的路径,switch来将新的路径写到控制文件run {set newname for database to '/oradata/orcl/datafile_%U';restore database;}
10.开启数据库,使用resetlogs upgrade参数来重建redo文件SQL> alter database open resetlogs upgrade;顺便生成一下spfileSQL> create spfile from pfile='/tmp/rmanbackup/pfile.ora';
重新编译一下无效对象(是个好习惯)@?/rdbms/admin/utlrp.sql;
NOTE:遇到了一个问题,是进行数据库迁移之后,temp数据文件因为不被RMAN所保护,需要检查tempfile:
- ERROR at line 7:
- ORA-01187: cannot read from file because it failed verification tests
- ORA-01110: data file 201: '/u01/app/oracle/product/11.2.0/db_1/dbs/D:ORACLEPRODUCTORADATAORCLTEMP01.DBF'
- col name for a50;
- select file#, ts#, name, status from v$tempfile;
- FILE# TS# NAME STATUS
- ———- ———- ————————————————– ——-
- 1 3 D:ORACLEPRODUCTORADATAORCLTEMP01.DBF ONLINE
- SQL> alter database tempfile 'D:ORACLEPRODUCTORADATAORCLTEMP01.DBF' drop;
- alter database tempfile 'D:ORACLEPRODUCTORADATAORCLTEMP01.DBF' drop
- *
- ERROR at line 1:
- ORA-01516: nonexistent log file, data file, or temporary file "D:ORACLEPRODUCTORADATAORCLTEMP01.DBF"
- SQL> drop tablespace temp;
- drop tablespace temp
- *
- ERROR at line 1:
- ORA-12906: cannot drop default temporary tablespace
检查临时表空间的数据文件
网上的资料都是说直接删除该数据文件,但是不行
直接删除,会提示不能删除默认临时表空间:
解决方案:新建一个临时表空间,将其设置为默认临时表空间,再删除原本的临时表空间(本人强迫症,所以删掉原来的temp之后,再重新建一个temp,将表空间设置回temp,看着顺眼)需要数据库open状态
新建临时表空间temp2
设置temp2为默认临时表空间
删除原来的临时表空间temp
重新建临时表空间temp
将temp设置为默认临时表空间
注意:上一步修改完之后,假如想立即删除temp2表空间,那么此操作会宕住需要shutdown immediate 退出再重新进sqlplusstartup
删除临时表空间temp2和数据文件
再次检查一遍,OK
- SQL> col name for a50;
- SQL> select file#, ts#, name, status from v$tempfile;
- FILE# TS# NAME STATUS
- ———- ———- ————————————————– ——-
- 1 3 /oradata/orcl/TEMP01.DBF ONLINE
运行@?/rdbms/admin/utlrp.sql;重新编译一下无效对象这次成功了OK,数据库迁移完成需要注意,假如两者版本不一致或者linux上打了新补丁,做完这一步之后照着README.html运行升级脚本,再次编译无效对象再次重申:对数据库做迁移,升级之类的操作后编译无效对象是个好习惯