目录
- 一、环境准备
- 二、数据库检查
- 三、Linux目标数据库还原
- 三、数据库日志文件调整(如果需要调整)
- 四、创建临时文件(如果不存在临时文件)
- 五、升级数据字典
- 六、测试数据库
- 七、如果使用非完全恢复模式(且使用隐藏参数进行强制启动数据库),一定要做这个测试
一、环境准备
1、源库环境
操作系统:Redhat/Oracle/CentOS Linux 7.9 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0 数据库安装目录:/oracle/app
2、目标库环境
操作系统:Redhat/Oracle/CentOS Linux 7.9 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0 数据库安装目录:/u01/app
3、迁移方法
源库拷贝RMAN备份,新库进行RMAN还原
4、注意事项:
目标库和源库的字符集一定要一致,否则会出现乱码。目标库在dbca的时候,要根据源库的字符集设置。
二、数据库检查
1、查看数据库数据文件,确保是空库
SQL> set line 300 SQL> col file_name for a60 SQL> select file_name,tablespace_name,bytes from dba_data_files;
2、查看数据库字符集,确保是utf8
select userenv('language') from dual;
3、查看数据库备份文件
4、给备份文件目录授权
[root@qzmes backup]# chown oracle:oinstall -R /backup/
三、Linux目标数据库还原
1、安装新的数据库,并且数据库名称要和源库的一致。
我们此处使用和原库一致的实例名:mesorcl。
【如果新的数据库名和源数据库名不一致,后续无法正常还原。我们可以用如下思路
①配置环境变量ORACLE_SID=mesorcl和源库一致 ②生效环境变量,并登录sqlplus / as sysdba ③手动配置DB_NAME到pfile,和源库一致 ④启动到nomount状态(startup pfile='pfile文件.ora' nomoutn) ⑤还原源库参数文件到当前目标库 如果在备份中可以直接读取备份的参数文件,③④⑤这三步可以不用做 ⑥关闭数据库,根据当前目标库环境,配置编辑源库参数文件(如sga,pga,路径等),并startup nomount; ⑦还原备份的控制文件【需要考虑原库的备份路径在当前环境中是否存在,如果不存在,需要重新注册备份文件路径,见下面案例】 ⑧还原备份的归档日志文件【需要考虑原库的备份路径在当前环境中是否存在,如果不存在,需要重新注册备份文件路径,见下面案例】 ⑨还原数据文件【需要考虑原库的数据文件路径和当前环境的数据文件路径是否一致,如果不一致需要setnewname,见下面案例】 ⑩恢复数据文件(利用还原的归档日志)并以resetlogs打开数据库。
】
2、对当前库的参数文件做备份(备份为pfile)
SQL> create pfile='/oracle/pfile.ora.bak' from spfile;
3、因为是异机,从rman备份文件进行spfile恢复。
(1)先启动当前数据库到nomount状态
SQL> startup nomount;
(2)利用spfile的备份文件,进行还原
RMAN> set decryption identified by 'mesorcl'; --如果有密码,此处需要定义密码,后续可自行解密: RMAN> restore spfile to '/oracle/spfile.ora' from '/oracle/rman/20221019/spfile_20_1_1118505194_1.spf';
(3) 编辑spfile.ora为pfile.ora(使用strings spfile.ora获取到内容);
SQL> startup pfile='/oracle/pfile.ora' nomount;
--注意:目录路径,源数据库为/oracle下,目标数据库在/u01下,则pfile.ora文件中的相关目录需要进行修改。
4、rman还原控制文件并mount
(1)还原控制文件
RMAN>set decryption identified by 'mesorcl'; --如果备份中进行了加密,我们使用密码加密,进行解密即可,否则会报:ORA-28365: wallet is not open
RMAN> restore controlfile from '/oracle/rman/20221019/cntl_21_1_1118505195_1.ctl';
--注意:当前进入的sqlplus必须是登录到和控制文件中记录的db_name一致的实例名称,才可以正常还原。
(2)把数据启动到mount状态,加载控制文件中的内容
SQL> alter database mount;
5、查看当前控制文件记录的内容
SQL> set line 300 SQL> col name for a60 SQL> select file#,name,status from v$datafile;
--注意:查看控制文件,这个文件是记录的源库的数据文件的信息;mount后,v$datafile查出来的是源库的数据文件信息。
6、加载备份文件,并核对,删除失效文件
(1)查看当前控制文件加载的备份片信息
RMAN> list backup;
(2)核对备份文件
RMAN> crosscheck backup;
CROSSCHECK 命令用于核对备份文件,以确保 RMAN 资料库与备份文件保持同步。
当执行该命令时,如果 RMAN 资料库记录的状态与实际备份文件不匹配,则会更新资料库里的状态使其与实际备份文件状态一致;
若备份文件处于 expired 状态,那么说明该备份已失效,可以删除。
(3)删除失效的备份文件
RMAN> delete expired backup;
7、注册备份文件(指向新的备份片路径)—如果目标库的备份目录和源库的备份文件目录一致,就无需进行注册了。
(1)注册备份文件
catalog start with '/backup/rman/backup/'; -- 注意此处的目录
--注意:如果还原过程中,备份目录有其他非datafile,archivelog,controlfile的备份文件,可能会出现报错,无需理会。
(2)查看重新加载的备份片信息
RMAN> list backup;
8、还原数据库
(1)如果目标端文件路径没有更改,可以直接使用
RMAN>set decryption identified by 'mesorcl'; --如果有加密,需要先解密 RMAN>run{ allocate channel d1 type disk; allocate channel d2 type disk; restore database; release channel d1; release channel d2; }
(2)如果目标端数据文件路径有更改,可以使用newname方式更改
RMAN>set decryption identified by 'mesorcl'; --如果有加密,需要先解密 RMAN>run{ allocate channel d1 type disk; allocate channel d2 type disk; set newname for datafile 1 to '/oracle/app/oracle/oradata/mesorcl/system01.dbf'; set newname for datafile 2 to '/oracle/app/oracle/oradata/mesorcl/sysaux01.dbf'; set newname for datafile 3 to '/oracle/app/oracle/oradata/mesorcl/undotbs01.dbf'; set newname for datafile 4 to '/oracle/app/oracle/oradata/mesorcl/users01.dbf'; set newname for datafile 5 to '/oracle/app/oracle/oradata/mesorcl/test01.dbf'; restore database; switch datafile all; release channel d1; release channel d2; } --注意:有可能会报错:
RMAN-03002: failure of restore command at 09/03/2022 15:39:56 RMAN-06026: some targets not found - aborting restore RMAN-06023: no backup or copy of datafile 4 found to restore RMAN-06023: no backup or copy of datafile 3 found to restore RMAN-06023: no backup or copy of datafile 2 found to restore RMAN-06023: no backup or copy of datafile 1 found to restore
--分析1:这是incarnation的问题,重置后即可。
RMAN> list incarnation; List of Database Incarnations DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time ------- ------- -------- ---------------- ------- -------------- ---------------------- 1 1 MESORCL 3048150118 PARENT 1 2013-10-09 18:23:38 2 2 MESORCL 3048150118 PARENT 897124 2022-09-02 09:20:40 3 3 MESORCL 3048150118 CURRENT 948244 2022-09-03 10:20:17 RMAN> reset database to incarnation 2; database reset to incarnation 2
RMAN> list incarnation;
--分析2:也可能是加载的备份是1级或1c级备份,需要将全备备份或0级备份加载注册。
9、还原归档日志(备份的归档日志也需要还原)——三种情况解决方法
(1)还原归档日志---全部还原(这个容易出现错误,可以使用squence方式还原)
RMAN>set decryption identified by 'mesorcl'; --如果备份过程有加密,需要先解密 RMAN> run{ set archivelog destination to '/oracle/rman/archivelog'; restore archivelog from sequence <序列号>; }
<序列号>:从list backup中查询到的最开始点;根据list backup中的归档日志的开始点还原,备份的归档日志是连续的,则可以还原所有的archivelog文件。
--注意:如果 restore archivelog 过程报错:
报RMAN-20242错误:
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/22/2016 10:55:10
RMAN-06004: Oracle error from recovery catalog database: RMAN-20242: specification does not match any archived log in the repository
则使用如下方式:incarnation all
RMAN> run{
set archivelog destination to '/oracle/rman/archivelog';
restore archivelog from sequence <序列号> incarnation all;
}
(2)如果我们有03.09号的rman数据0级备份+archivelog备份,同时有03.10,03.11号的archivloge备份,我们可以直接把两天的归档备份注册,还原最新的归档日志
--注册0310,0311的归档日志备份信息到控制文件
catalog backuppiece '/oracle/20230310/archivelog/arch1c_MESORCLx_al1mo4ir_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1c_MESORCLx_am1mo4ir_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1c_MESORCLx_an1mo4ir_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1_MESORCLx_aa1mlg6s_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1_MESORCLx_ab1mlg6s_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1_MESORCLx_ac1mlg6s_1_1.arc'; catalog backuppiece '/oracle/20230310/archivelog/arch1_MESORCLx_ad1mlg6s_1_1.arc'; catalog backuppiece '/oracle/20230311/archivelog/arch1_MESORCLx_b81mtdar_1_1.arc'; catalog backuppiece '/oracle/20230311/archivelog/arch1_MESORCLx_b91mtdar_1_1.arc'; catalog backuppiece '/oracle/20230311/archivelog/arch1_MESORCLx_ba1mtdar_1_1.arc'; catalog backuppiece '/oracle/20230311/archivelog/arch1_MESORCLx_bb1mtdar_1_1.arc';
--再进行还原归档日志到/oracle/rman/archivelog'
RMAN> run{
set archivelog destination to '/oracle/rman/archivelog';
restore archivelog from sequence <序列号> incarnation all;
}
(3)如果我们使用3.09的rman备份数据+archivelog,但是控制文件是从3.17号恢复的,那么可能会存在一个问题。
因为控制文件比较新,所以,还原时,默认的sequence比较新,我们无法通过如下方式进行还原归档;
RMAN>catalog backuppiece '/oracle/20230309/archivelog/arch1c_MESORCLx_al1mo4ir_1_1.arc'; RMAN>list backup; (虽然都已经加载到list中,但是下面几种都不好用) RMAN> restore archivelog from sequence <开始的序列号>; RMAN> restore archivelog from sequence <结束的序列号>; RMAN> restore archivelog all <结束的序列号>;
--但我们可以用的方式是between,可以对某个或某几个归档的备份之间的归档进行还原。
RMAN> restore archivelog sequence between 48489 and 48511;
10、恢复数据库(这里是重点)
(1)使用using backup controlfile until cancel进行恢复
这里提示要哪个序列的归档,就到上述还原的归档目录中去查找。
【 注意:在rman不完全恢复中,restore后, 必须要执行recover database using backup controlfile until cancel, 即使只有一个archivelog或redolog日志,也必须要恢复, 否则无法resetlogs方式open数据库, 即使使用隐藏参数强制拉起数据库,也可能会出现丢失数据的情况。 】
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 502875522 generated at 10/18/2022 02:00:04 needed for thread 1 ORA-00289: suggestion : /oracle/rman/o1_mf_1_21728_knv744j5_.arc ORA-00280: change 502875522 for thread 1 is in sequence #21728 14:12:20 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /oracle/rman/archivelog/1_21728_1081589810.dbf
ORA-00279: change 502890274 generated at 10/18/2022 02:18:44 needed for thread 1 ORA-00289: suggestion : /oracle/rman/o1_mf_1_21729_knv9ygjk_.arc ORA-00280: change 502890274 for thread 1 is in sequence #21729 ORA-00278: log file '/oracle/rman/archivelog/1_21728_1081589810.dbf' no longer needed for this recovery 14:22:07 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} cancel
11、打开数据库
此时可以通过resetlogs方式打开数据库。
SQL>alter database open resetlogs; Database altered
(1)如果此处打开过程出现下列问题:
SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-00392: log 2 of thread 1 is being cleared, operation not allowed ORA-00312: online log 2 thread 1: '/oracle/app/oracle/oradata/mesorcl/redo02a.log' ORA-00312: online log 2 thread 1: '/oracle/app/oracle/oradata/mesorcl/redo02b.log'
--解决方法:
清理文件,并重建,这种情况无法drop掉;如果重建过程提示目录不存在,创建目录即可。
alter database clear logfile group 2;
(2)如果此处打开过程出现下列问题
说明在打开过程并没有此目录,并且当前redo01.log,redo02.log,redo03.log等都记录在源库的目录下。
SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-00349: failure obtaining block size for '/data/u01/app/oracle/oradata/KSSYORCLPRD/onlinelog/red01.log' ORA-27041: unable to open file Linux-x86_64 Error: 2: No such file or directory Additional information: 9
--两种方法,首先需要重建其他的redolog
SQL> alter database drop logfile group 2; SQL> alter database add logfile group 2 '/oracle/app/oracle/oradata/KSSYORCLPRD/redo02.log' size 50m; SQL> alter database drop logfile group 3; SQL> alter database add logfile group 3 '/oracle/app/oracle/oradata/KSSYORCLPRD/redo03.log' size 50m; SQL> alter database drop logfile group 4; SQL> alter database add logfile group 4 '/oracle/app/oracle/oradata/KSSYORCLPRD/redo04.log' size 50m; SQL> alter database drop logfile group 5; SQL> alter database add logfile group 5 '/oracle/app/oracle/oradata/KSSYORCLPRD/redo04.log' size 50m;
方法1:因为group 1是current状态,
创建目录/data/u01/app/oracle/oradata/KSSYORCLPRD/onlinelog/或创建/data/u01/app/oracle/oradata/KSSYORCLPRD/onlinelog/redo01.log 再进行清理删除 SQL> alter database clear logfile group 1; SQL> alter database drop logfile group 1; 再打开数据库 SQL> alter database open resetlogs;
方法2:重新恢复,然后再打开(应该会自动转到其他有效redolog下打开,可以尝试测试)
SYS@ test11g> recover database until cancel; SYS@ test11g> alter database open resetlogs;
(3)如果此时在9和10中并没有任何归档日志进行恢复,可以使用隐藏参数,直接resetlogs方式(但容易丢数据,慎用):
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
--修改完参数之后重启数据库到 mount 状态
SQL> shutdown immediate SQL> startup; ORA-01589: must use RESETLOGS or NORESETLOGS optionfor database open
--以 resetlogs 模式启动数据库
SQL> alter database open resetlogs;
SQL> alter system set"_allow_resetlogs_corruption"=FALSE scope=spfile;
--让参数关闭生效,再次启动数据库(强制启动)
SQL> shutdown immediate; SQL> startup force; ORACLE instance started.
--检查_allow_resetlogs_corruption 隐含参数是否关闭,确定已经关闭
SQL> show parameter _allow_resetlogs_corruption
12、恢复数据库2(生产库最短时间迁移)
这种方式接10,我们可以进行数据库迁移,使用最短的时间进行迁移,方法步骤:
(1)接10上的最后归档,不进行数据库的打开
(2)将原库最新的redo数据进行归档(执行归档次数,比redo log的个数多一次)
SQL> alter system switch logfile; SQL> alter system switch logfile; SQL> alter system switch logfile; SQL> alter system switch logfile;
(3)将源库的归档(从上次备份以来的所有归档拷贝到目标库
[oracle@qdmes219:/home/oracle]$scp -r /oracle/archivelog/MESORCL/archivelog/ oracle@192.168.20.220:/backup/rman/backup
(4)利用recover database using backup controlfile until cancel进行追加归档,追加到最新
(5)将原库最新的redo数据进行归档,并关闭原数据库
(6)拷贝最新产生的归档日志和redolog到目标库
归档日志拷贝到归档目录
redolog日志拷贝到数据目录
(7)利用recover database using backup controlfile until cancel进行追加归档,追加到最新
(8)使用resetlogs打开数据库
SQL> alter database open resetlogs;
三、数据库日志文件调整(如果需要调整)
1、查看日志文件信息
SQL> col member for a100
SQL> select a.group#,a.thread#,a.bytes,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#; GROUP# THREAD# BYTES STATUS MEMBER ---------- ---------- ---------- ---------------- ---------------------------------------------------------------------------------------------------- 3 1 52428800 UNUSED /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO03.LOG 2 1 52428800 UNUSED /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO02.LOG 1 1 52428800 CURRENT /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO01.LOG
2、添加日志组和文件
alter database add logfile group 5 '/oracle/app/oracle/oradata/mesorcl/redo05.log' size 50m; alter database add logfile group 6 '/oracle/app/oracle/oradata/mesorcl/redo06.log' size 50m; alter database add logfile group 7 '/oracle/app/oracle/oradata/mesorcl/redo07.log' size 50m;
3、查看当前的状态
SQL> select a.group#,a.thread#,a.bytes,a.status,b.member from v$log a,v$logfile b where a.group#=b.group#; GROUP# THREAD# BYTES STATUS MEMBER ---------- ---------- ---------- ---------------- ---------------------------------------------------------------------------------------------------- 3 1 52428800 UNUSED /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO03.LOG 2 1 52428800 UNUSED /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO02.LOG 1 1 52428800 CURRENT /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO01.LOG 5 1 52428800 UNUSED /oracle/app/oracle/oradata/mesorcl/redo05.log 6 1 52428800 UNUSED /oracle/app/oracle/oradata/mesorcl/redo06.log 7 1 52428800 UNUSED /oracle/app/oracle/oradata/mesorcl/redo07.log
4、删除组1,2,3,再创建1,2,3组
--利用语句切换删除
SQL> alter system switch logfile; SQL> alter system checkpoint; SQL> alter database drop logfile group 2; SQL> alter database drop logfile group 3; SQL> alter system switch logfile; SQL> alter system checkpoint; SQL> alter database drop logfile group 1;
--物理删除redo01.log,redo02.log,redo03.log
alter database add logfile group 1 '/oracle/app/oracle/oradata/mesorcl/redo01.log' size 50m; alter database add logfile group 2 '/oracle/app/oracle/oradata/mesorcl/redo02.log' size 50m; alter database add logfile group 3 '/oracle/app/oracle/oradata/mesorcl/redo03.log' size 50m;
四、创建临时文件(如果不存在临时文件)
1、查看当前临时文件
SQL> select * from v$tempfile; SQL> select * from dba_temp_files; SQL> select file_name,file_id,tablespace_name,bytes,status from dba_temp_files;
2、创建其他临时表空间,并设置为默认
SQL> create temporary tablespace temp2 tempfile '/oracle/app/oracle/oradata/mesorcl/temp02.dbf' size 20m autoextend on; SQL> alter database default temporary tablespace temp2;
3、删除原来的临时表空间temp
SQL> drop tablespace temp including contents and datafiles; [oracle@qdmes219:/oracle/app/oracle/oradata/mesorcl]$rm -rf temp01.dbf
4、创建新的临时表空间temp,并设为默认
SQL> create temporary tablespace temp tempfile '/oracle/app/oracle/oradata/mesorcl/temp01.dbf' size 20m autoextend on; SQL> alter database default temporary tablespace temp;
5、删除temp2临时表空间
SQL> drop tablespace temp2 including contents and datafiles;
如果此时卡住,则退出SQL,重新执行删除操作即可,因为当前SQL可能在使用这个临时表空间。
五、升级数据字典
1、通过 startup upgrade 启动实例
(1)停库
SQL> shutdown immediate
(2)启动到upgrage模式
SQL> startup upgrade;
2、升级数据字典
大约5-10分钟
SQL> @$ORACLE_HOME/rdbms/admin/catupgrd.sql ...
Final Actions . 00:00:00 Total Upgrade Time: 00:04:26 PL/SQL procedure successfully completed.
3、重启实例
--停库
SQL> shutdown immediate
--启动到正常模式
SQL> startup;
六、测试数据库
查询表数据、进行日志切换等操作。
select B.* from (select to_char(DATETIME_CREATED,'YYYY-MM-DD hh24:mi:ss'),DATETIME_ACTUAL_END from mesprd.sfc_mo order by DATETIME_CREATED desc) B where rownum<3;
七、如果使用非完全恢复模式(且使用隐藏参数进行强制启动数据库),一定要做这个测试
1、查询所有表的数据量对比
SQL>select * from test1 union all select * from test2 union all select * from test3;
2、对索引进行分析(如果可以对所有索引对比最好)是否报错
SQL> analyze index mes_prd.IX_NEIP_TASK_CBANHAO validate structure online; SQL> analyze index mes_prd.PK_NEIP_TASK_ID validate structure online; SQL> analyze index mes_prd.IX_NEIP_LOG_CMSGID validate structure online;