Windows—Linux—RMAN实现Windows平台迁移到Linux平台(方法1:dbms_backup_restore指定备份位置)—不完全恢复,无法通过归档追到最新数据,只能还原数据文件中的数据
一、环境准备
1、源库环境
操作系统:Windows 2012 R2 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0
2、目标库环境
操作系统:Redhat/Oracle/CentOS Linux 7.9 字 符 集:AL32UTF8 数据库版本:11.2.0.4.0
3、迁移方法
源库进行RMAN备份,新库进行RMAN还原
4、注意事项:
源库和目标库的字符集一定要一致,否则会出现乱码。目标库在dbca的时候,要根据源库的字符集设置。
二、Windows源库
1、源库备份
(1)数据库关闭,监听关闭
为了切断所有连接,不让数据库进行更新操作。
SQL>shutdown immediate; C:\Users\Administrator>lsnrctl stop
(2)数据库开启
开启数据库,但不开启监听,禁止所有外部写入动作。
SQL>startup
(3)切换归档日志和检查点,让所有在redolog的数据落盘
因为windows的路径和linux的路径不一致,后续需要通过重建控制文件进行更改,需要使用不完全恢复,那么redo log的数据则无法使用,需要提前将里面的数据落到数据文件中。
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;
(4)rman备份数据库
这个过程会自动备份数据文件,控制文件和参数文件。
C:\Users\Administrator>rman target / RMAN> backup database; 启动 backup 于 02-9月-22 使用通道 ORA_DISK_1 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 输入数据文件: 文件号=00001 名称=D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSTEM01.DBF 输入数据文件: 文件号=00002 名称=D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSAUX01.DBF 输入数据文件: 文件号=00003 名称=D:\APP\ADMINISTRATOR\ORADATA\MESORCL\UNDOTBS01.DBF 输入数据文件: 文件号=00005 名称=D:\MES800\TEST01.DBF 输入数据文件: 文件号=00004 名称=D:\APP\ADMINISTRATOR\ORADATA\MESORCL\USERS01.DBF 通道 ORA_DISK_1: 正在启动段 1 于 02-9月 -22 通道 ORA_DISK_1: 已完成段 1 于 02-9月 -22 段句柄=D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NNNDF_TAG20220902T151435_KK3CBVDQ_.BKP 标记=TAG20220902T151435 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:07 通道 ORA_DISK_1: 正在启动全部数据文件备份集 通道 ORA_DISK_1: 正在指定备份集内的数据文件 备份集内包括当前控制文件 备份集内包括当前的 SPFILE 通道 ORA_DISK_1: 正在启动段 1 于 02-9月 -22 通道 ORA_DISK_1: 已完成段 1 于 02-9月 -22 段句柄=D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NCSNF_TAG20220902T151435_KK3CC3HG_.BKP 标记=TAG20220902T151435 注释=NONE 通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01 完成 backup 于 02-9月-22
2、备份传输
将上述备份的文件拷贝到linux中。
D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NNNDF_TAG20220902T093859_KK2QOMJS_.BKP D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NCSNF_TAG20220902T093859_KK2QOVMF_.BKP
三、Linux目标数据库
1、安装新的数据库,并且数据库名称要和源库的一致
我们此处使用mesorcl。
2、启动数据库到nomount状态
SQL> startup nomount;
3、对当前库的参数文件做备份(备份为pfile)
SQL> create pfile='/backup/rman/pfile.ora' from spfile;
4、rman还原控制文件
RMAN> restore controlfile from '/backup/rman/BACKUPSET/2022_09_02/O1_MF_NCSNF_TAG20220902T093859_KK2QOVMF_.BKP';
SQL> alter database mount;
5、查看当前控制文件记录的内容
可以看到,当前控制文件记录的数据文件都是windows的目录信息;
SQL> set line 300 SQL> col name for a60 SQL> select file#,name,status from v$datafile; FILE# NAME STATUS ---------- ------------------------------------------------------------ ------- 1 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSTEM01.DBF SYSTEM 2 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSAUX01.DBF ONLINE 3 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\UNDOTBS01.DBF ONLINE 4 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\USERS01.DBF ONLINE 5 D:\MES800\TEST01.DBF ONLINE
6、查看当前控制文件记录的备份信息
可以看到备份集的备份片在这里“ D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NNNDF_TAG20220902T093859_KK2QOMJS_.BKP”;
所以后面我们使用restore database的时候,默认是找这个路径:
“ D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NNNDF_TAG20220902T093859_KK2QOMJS_.BKP”;
但这个路径在linux中是不存在的,也无法指定的,所以我们需要用dbms_backup_restore进行转换。
RMAN> list backup; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ ------------------- 1 Full 1.05G DISK 00:00:05 2022-09-02 09:39:04 BP Key: 1 Status: EXPIRED Compressed: NO Tag: TAG20220902T093859 Piece Name: D:\ARCHIVELOG\MESORCL\BACKUPSET\2022_09_02\O1_MF_NNNDF_TAG20220902T093859_KK2QOMJS_.BKP List of Datafiles in backup set 1 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- ------------------- ------------------------------------------------- 1 Full 935784 2022-09-02 09:38:59 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSTEM01.DBF 2 Full 935784 2022-09-02 09:38:59 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\SYSAUX01.DBF 3 Full 935784 2022-09-02 09:38:59 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\UNDOTBS01.DBF 4 Full 935784 2022-09-02 09:38:59 D:\APP\ADMINISTRATOR\ORADATA\MESORCL\USERS01.DBF 5 Full 935784 2022-09-02 09:38:59 D:\MES800\TEST01.DBF
7、将控制文件输出到trace,并查看
trace里面包含重建控制文件的命令,同时因为windows的redologs和linux的redo logs不一致,所以需要使用resetlogs方式进行重建;
SQL> alter database backup controlfile to trace as '/backup/rman/controlfile.trace'; [oracle@qdmes219:/backup/rman]$cat controlfile.trace
8、重建控制文件
SQL>
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "MESORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/restore4/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/oracle/restore4/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/oracle/restore4/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/oracle/restore4/system01.dbf',
'/oracle/restore4/sysaux01.dbf',
'/oracle/restore4/undotbs01.dbf',
'/oracle/restore4/users01.dbf',
'/oracle/restore4/test01.dbf'
CHARACTER SET AL32UTF8
;
9、查看重建控制文件后的数据信息
SQL> set line 300 SQL> col name for a60 SQL> select file#,name,status from v$datafile; FILE# NAME STATUS ---------- ------------------------------------------------------------ --------- 1 /oracle/restore4/system01.dbf SYSTEM 2 /oracle/restore4/sysaux01.dbf RECOVER 3 /oracle/restore4/undotbs01.dbf RECOVER 4 /oracle/restore4/users01.dbf RECOVER 5 /oracle/restore4/test01.dbf RECOVER
10、还原数据库(restore),通过dbms_backup_restore(可以指定备份集的位置)
这一段是利用dbms_backup_restore,将windows下控制文件中备份文件的路径修改为linux下的文件目录;代替了rman>restore database过程,因为restore database后面无法跟备份文件目录。
SQL>declare devtype varchar2(256); done boolean; begin devtype:=sys.dbms_backup_restore.DeviceAllocate(type=>'',ident=>'t1'); sys.dbms_backup_restore.RestoreSetDatafile; sys.dbms_backup_restore.RestoreDatafileto(dfnumber=>01,toname=>'/oracle/restore4/system01.dbf'); sys.dbms_backup_restore.RestoreDatafileto(dfnumber=>02,toname=>'/oracle/restore4/sysaux01.dbf'); sys.dbms_backup_restore.RestoreDatafileto(dfnumber=>03,toname=>'/oracle/restore4/undotbs01.dbf'); sys.dbms_backup_restore.RestoreDatafileto(dfnumber=>04,toname=>'/oracle/restore4/users01.dbf'); sys.dbms_backup_restore.RestoreDatafileto(dfnumber=>05,toname=>'/oracle/restore4/test01.dbf'); sys.dbms_backup_restore.RestoreBackupPiece(done=>done,handle=>'/backup/rman/BACKUPSET/2022_09_02/O1_MF_NNNDF_TAG20220902T093859_KK2QOMJS_.BKP',params=>null); sys.dbms_backup_restore.DeviceDeallocate; end; /
11、恢复数据库(recover)
SQL> recover database using backup controlfile until cancel;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
12、打开数据库(resetlogs)
SQL> alter database open resetlogs;
13、创建临时文件
SQL> create temporary tablespace temp2 tempfile '/oracle/restore4/temp02.dbf' size 20m autoextend on; SQL> alter database default temporary tablespace temp2; SQL> drop tablespace temp1 including contents and datafiles; SQL> create temporary tablespace temp1 tempfile '/oracle/restore4/temp01.dbf' size 20m autoextend on; SQL> alter database default temporary tablespace temp1;
14、测试数据库
查询表数据、进行日志切换等操作。