目录
- 一、环境准备
- 二、Linux源库备份
- 三、Linux目标数据库还原
- 1、安装新的数据库,并且数据库名称要和源库的一致
- 2、启动数据库到nomount状态
- 3、对当前库的参数文件做备份(备份为pfile)
- 4、因为是异机,从rman备份文件进行spfile恢复。
- 5、rman还原控制文件(可以在当前pfile模式下还原,前提是sid等一样)
- 我们使用密码加密,进行解密即可:
- 6、查看当前控制文件记录的内容
- 7、查看当前控制文件加载的备份片信息
- 8、核对备份文件
- 9、删除失效的备份文件
- 10、更新备份文件(指向新的备份片)-如果有必要,一般还原了控制文件后就不需要了
- 11、查看重新加载的备份片信息
- 12、还原数据库
- 13、还原归档日志(备份的归档日志也需要还原)
- 14、恢复数据库(这里是重点)
- 15、如果可以在源库还可以正常使用
- 四、数据库日志文件调整(如果需要调整)
- 五、创建临时文件(如果不存在临时文件)
- 六、升级数据字典
- 七、测试数据库
Linux—Linux—RMAN实现Linux平台迁移到另一台Linux(方法:重新载入备份位置方法)—不完全恢复,但可以通过归档追到最新数据
一、环境准备
1、源库环境
操作系统:Redhat/Oracle/CentOS Linux 7.9 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0
2、目标库环境
操作系统:Redhat/Oracle/CentOS Linux 7.9 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0
3、迁移方法
源库进行RMAN备份,新库进行RMAN还原
4、注意事项:
源库和目标库的字符集一定要一致,否则会出现乱码。目标库在dbca的时候,要根据源库的字符集设置。
二、Linux源库备份
1、切换归档日志和检查点,让所有在redolog的数据落盘
SQL>alter system switch logfile; SQL>alter system switch logfile; SQL>alter system switch logfile; SQL>alter system switch logfile; SQL>alter system switch logfile; SQL>alter system switch logfile; SQL>alter system checkpoint;
2、rman备份数据库
这个过程会自动备份数据文件,控制文件和参数文件。
[oracle@qdmes219:/oracle]$rman target / RMAN> backup database;
3、备份传输
将上述备份的文件拷贝到linux中。
[oracle@qdmes219:/home/oracle]$scp -r /oracle/archivelog/MESORCL/archivelog/ oracle@192.168.20.220:/backup/rman/backup
三、Linux目标数据库还原
1、安装新的数据库,并且数据库名称要和源库的一致
我们此处使用mesorcl。
2、启动数据库到nomount状态
SQL> startup nomount;
3、对当前库的参数文件做备份(备份为pfile)
SQL> create pfile='/backup/rman/pfile.ora' from spfile;
4、因为是异机,从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';
--如果不用密码,直接还原即可
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;
5、rman还原控制文件(可以在当前pfile模式下还原,前提是sid等一样)
如果rman备份使用了密码,需要解密:
否则会报:
ORA-19870: error while restoring backup piece /oracle/rman/20221019/cntl_21_1_1118505195_1.ctl ORA-19913: unable to decrypt backup ORA-28365: wallet is not open
我们使用密码加密,进行解密即可:
RMAN>set decryption identified by 'mesorcl';
RMAN> restore controlfile from '/oracle/rman/20221019/cntl_21_1_1118505195_1.ctl';
SQL> alter database mount;
6、查看当前控制文件记录的内容
可以看到,当前控制文件记录的数据文件都是源库的目录信息;
SQL> set line 300 SQL> col name for a60 SQL> select file#,name,status from v$datafile; SQL> select file#,name,status from v$tempfile;
记录位置
7、查看当前控制文件加载的备份片信息
RMAN> list backup;
8、核对备份文件
CROSSCHECK 命令用于核对备份文件,以确保 RMAN 资料库与备份文件保持同步。
当执行该命令时,如果 RMAN 资料库记录的状态与实际备份文件不匹配,则会更新资料库里的状态使其与实际备份文件状态一致;若备份文件处于 expired 状态,那么说明该备份已失效,可以删除。
RMAN> crosscheck backup;
9、删除失效的备份文件
RMAN> delete expired backup;
10、更新备份文件(指向新的备份片)-如果有必要,一般还原了控制文件后就不需要了
--catalog start with '/backup/rman/backup/'; -- 注意此处的目录
--注意:如果还原过程中,备份目录有其他文件,先清理后再还原,否则会出现报错:
RMAN> catalog start with '/backup/rman/backup/';
11、查看重新加载的备份片信息
RMAN> list backup;
12、还原数据库
--如果有加密,需要先解密
RMAN>set decryption identified by 'mesorcl';
(1)如果目标端文件路径没有更改,可以直接使用
RMAN>run{ allocate channel d1 type disk; allocate channel d2 type disk; restore database; release channel d1; release channel d2; }
(2)如果目标端数据文件路径有更改,可以使用newname方式更改
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
--分析:这是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;
13、还原归档日志(备份的归档日志也需要还原)
--如果备份过程有加密,需要先解密
RMAN>set decryption identified by 'mesorcl';
(1)还原归档日志---全部还原(这个容易出现错误,可以使用scn方式还原)
RMAN> run{ set archivelog destination to '/oracle/rman/archivelog'; restore archivelog all; }
(2)还原归档日志——根据scn或seq,
在选择scn或seq范围前,可以先执行14步,查看需要哪个归档日志,然后再根据需要的scn号还原;或先在rman中根据控制文件记录内容,list backup查看对应某个归档的scn号。
--1-先执行恢复如下语句,查看需要用哪个scn号
SQL> recover database using backup controlfile until cancel;
--2-list backup,查看这个scn号在哪个备份的arc文件中,且最大是多少
502875522附近的最早的是502578757,最大是502890274。可以选择这两个点还原
--直接恢复备份的归档,scn号在502578757和502890274(502957205大一些也可以)之间。
RMAN> run{ set archivelog destination to '/oracle/rman/archivelog'; restore archivelog scn between 502578757 and 502890274; }
--发现sequence 21728在还原的归档中,执行14恢复即可。
14:21:46 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} /oracle/rman/archivelog/1_21728_1081589810.dbf
14、恢复数据库(这里是重点)
(1)使用backup和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
--此时可以resetlogs方式打开数据库了。
SQL>alter database open resetlogs; Database altered
(2)如果此时没有归档日志,可以使用隐藏参数,直接resetlogs方式(但容易丢数据,慎用):
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
--最后将源数据库关闭,关闭监听,再开启数据库
SQL> shutdown immediate; [oracle@qdmes219:/home/oracle]$lsnrctl stop SQL> startup
15、如果可以在源库还可以正常使用
可以将最新的redo数据进行归档(执行归档次数,比redo log的个数多一次)
SQL> alter system switch logfile; SQL> alter system switch logfile; SQL> alter system switch logfile; SQL> alter system switch logfile;
(4)将源库的归档拷贝到目标库
[oracle@qdmes219:/home/oracle]$scp -r /oracle/archivelog/MESORCL/archivelog/ oracle@192.168.20.220:/backup/rman/backup
(5)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 启动实例
--停库
SQL> shutdown immediate
--启动到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;
七、测试数据库
查询表数据、进行日志切换等操作。
八、如果使用非完全恢复模式(且使用隐藏参数进行强制启动数据库),一定要做这个测试
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;