目录
Windows—Linux—RMAN实现Windows平台迁移到Linux平台(方法3:重新载入备份位置方法+增量恢复(推荐))—不完全恢复,无法通过归档追到最新数据,通过增量恢复缩短停机时间
注意:Oracle使用RMAN从Windows迁移数据到Linux.
由于Windows与Linux同属于little endian平台,所以Windows平台RMAN数据库备份可以在Linux直接使用,但是Windows平台下的归档日志无法在Linux平台直接用于recover database。
但是我们可以使用增量备份解决增量问题,然后最后在源库停机下做最后备份,减少源库停机时间。
参考:https://blog.csdn.net/jycjyc/article/details/127154293
一、环境准备
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源库—Linux目标库的基础备份恢复
1、Windows源库端数据备份
RMAN> backup as compressed backupset incremental level 0 database format 'd:\rman\db0_%d_%T_%s_%p' tag 'full_level_0'; RMAN> backup current controlfile format 'F:\rman\ctl_level0.ctl' tag 'ctl_level0'; RMAN> backup spfile format 'F:\rman\spf_level0.spfile' tag 'spf_level0';
2、传输数据文件到Linux
(1)目标端创建备份转移目录
mkdir -p /backup/rman/level0 mkdir -p /backup/rman/level1-1 mkdir -p /backup/rman/level1-2 .... #中间由几次增量,就需要创建几个目录 mkdir -p /backup/rman/level1-final
(2)将本次备份数据传至/backup/rman/level0
nfs/ftp/xftp等方式皆可。
3、Linux端恢复0级备份
(1)安装新的数据库,并且数据库名称要和源库的一致
我们此处使用mesorcl。
(2)启动数据库到nomount状态
startup nomount;
(3)rman还原控制文件
restore controlfile from '/backup/rman/level0/ctl_level0.ctl'; alter database mount;
(4)查看控制文件中记录源数据库中的数据文件号及位置
set line 300 col name for a60 select file#,name,status from v$datafile;
(5)清理控制文件记录的原来备份信息记录
crosscheck backup; delete noprompt expired backup;
(6)重新将备份片注册到控制文件记录中
catalog start with '/backup/rman/level0';
(7)restore数据库0级备份
根据(5)中记录的控制文件对应的文件号,进行下述路径更改。
RMAN> run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; allocate channel d4 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; release channel d3; release channel d4; }
三、Windows源库—Linux目标库的增量备份恢复1
1、源端Windows做1级备份
RMAN> backup as compressed backupset incremental level 1 database format 'F:\rmanbak\incr_level0_%d_%T_%s_%p.dbf' tag 'incr_level_1';
2、传输增量备份1数据文件到Linux
nfs/ftp/xftp等方式皆可。
cp * /backup/rman/level1-1
3、Linux端恢复1级备份
(1)注册新的增量数据文件
RMAN> catalog start with '/backup/rman/level1-1';
(2)增量恢复,只应用增量备份即可
RMAN> run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; allocate channel d4 type disk; recover database; release channel d1; release channel d2; release channel d3; release channel d4; }
如果中途由多次增量备份,根据三步骤重复进行。
四、Windows源库—Linux目标库的增量备份恢复n(停机窗口Windows最后一次1级备份)
停机窗口前,可以根据需要,每天,每隔几小时定时重复执行上述三步骤,可以大幅度减少最后一次增量备份以及恢复的时间,缩短停机时间。
1、Windos端做最后停机处理(注意此处一定要停机才可以,否则无法正常恢复)
(1)由于Linux无法直接应用Windows平台下归档,所以需要在停机窗口干净关闭数据库,启动到mount状态
SQL> create table test as select * from dba_users; # 创建测试表,以便最后验证数据是否完全恢复 RMAN> shutdown immediate; #使用正常关闭,让所有内存或redolog中有效的数据全部落到磁盘上,此时redolog中没有有效数据了。 RMAN> startup mount;
(2)由于Linux无法直接应用Windows平台下归档,所以需要在停机窗口干净关闭数据库,启动到mount状态
RMAN>run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; allocate channel d4 type disk; backup as compressed backupset incremental level 1 database format 'F:\rman\incr_level0_%d_%T_%s_%p.dbf' tag 'incr_level_1'; release channel d1; release channel d2; release channel d3; release channel d4; }
(3) 需要在mount下重新备份最新的控制文件,以便最后保证最后恢复的数据文件头以及控制文件SCN保持一致。
RMAN> backup current controlfile format 'F:\rman\ctl_level1_final.ctl' tag 'ctl_bak_final';
2、传输文件到Linux
cp * /backup/rman/level1-final
3、Linux端恢复1级备份(最后一次)
(1)直接恢复最后一次增量
RMAN> catalog start with '/backup/rman/level1-final';
RMAN> run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; allocate channel d4 type disk; recover database; release channel d1; release channel d2; release channel d3; release channel d4; }
# datafile应用完最后一次增量之后,重新恢复最新控制文件,保证数据文件与控制文件记录SCN保持一致。
# 这步是保证数据库能一致性打开的关键,如果不恢复mount后备份的控制文件,则无法打开数据库。
RMAN> shutdown immediate; RMAN> startup nomount; RMAN> restore controlfile from '/backup/rman/ctl_level1_final.ctl'; RMAN> alter database mount;
(2)由于新恢复的源端控制文件,清理控制文件中记录的原先备份片信息
RMAN> crosscheck backup; RMAN> delete noprompt expired backup;
(3)由于控制文件新恢复,所以原先restore的数据文件路径需要重新catalog注册到控制文件,然后switch
RMAN> catalog start with '/oracle/app/oracle/oradata/mesorcl';
RMAN> switch database to copy;
注:swtich database to copy;
当数据库的数据文件实际存放位置与控制文件中定义的数据文件的路径不一致时,我们经常通过ALTER DATABASE RENAME FILE ...... to ...... 来改变控制文件定义的路径。 如果数据文件比较多,人工去校验,容易出错,则可以使用switch database to copy。 switch database to copy所做的正是把数据库中所有的文件都做了上面的这个步骤的操作,相当于若干个ALTER DATABASE RENAME FILE, 其实就是重命名control file中的文件地址。
--如果出现报错,可能和incarnation有关。
RMAN> switch database to copy;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of switch to copy command at 03/31/2023 10:54:10
RMAN-06571: datafile 1 does not have recoverable copy
--分析:这是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 2023-02-02 09:20:40 3 3 MESORCL 3048150118 CURRENT 948244 2023-03-31 10:20:17 RMAN> reset database to incarnation 2; database reset to incarnation 2 RMAN> list incarnation;
--重新进行switch copy
RMAN> switch database to copy;
(4) open read only,验证测试表
SQL> alter database open read only; SQL> desc test;
如果此处可以read only,则说明可以正常打开数据库,我们可以进行下一步处理。
五、处理redo日志
1、关闭并打开数据库并重新启动到mount状态
SQL>shutdown immediate; SQL> startup mount; SQL>alter database open resetlogs; (为了自动产生redolog文件并进行后续修改) SQL>shutdown immediate; SQL>startup mount;
2、配置redolog
(1)查看控制文件中的redo位置
SQL> set line 300 SQL> col member for a100 SQL>select * from v$logfile;
(2)将系统路径中的redo位置移动到mesorcl的位置。
mv /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO01.LOG /oracle/app/oracle/oradata/mesorcl/redo01.log mv /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO02.LOG /oracle/app/oracle/oradata/mesorcl/redo02.log mv /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO03.LOG /oracle/app/oracle/oradata/mesorcl/redo03.log
(3)修改控制文件中的redo位置
alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO01.LOG' to '/oracle/app/oracle/oradata/mesorcl/redo01.log'; alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO02.LOG' to '/oracle/app/oracle/oradata/mesorcl/redo02.log'; alter database rename file '/oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLREDO03.LOG' to '/oracle/app/oracle/oradata/mesorcl/redo03.log';
3、再次打开数据库
alter database open;
六、创建临时文件(如果不存在临时文件)
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、创建其他临时表空间,并设置为默认
create temporary tablespace temp2 tempfile '/oracle/app/oracle/oradata/mesorcl/temp02.dbf' size 100m autoextend on; alter database default temporary tablespace temp2;
3、删除原来的临时表空间temp
drop tablespace temp including contents and datafiles; rm -rf /oracle/app/oracle/product/11.2.0/db_1/dbs/D:APPADMINISTRATORORADATAMESORCLTEMP01.DBF rm -rf /oracle/app/oracle/oradata/mesorcl/temp01.dbf
4、创建新的临时表空间temp,并设为默认
create temporary tablespace temp tempfile '/oracle/app/oracle/oradata/mesorcl/temp01.dbf' size 100m autoextend on; alter database default temporary tablespace temp;
5、删除temp2临时表空间
drop tablespace temp2 including contents and datafiles; rm -rf /oracle/app/oracle/oradata/mesorcl/temp02.dbf
如果此时卡住,则退出SQL,重新执行删除操作即可,因为当前SQL可能在使用这个临时表空间。
6、重建其他临时文件
(1)删除其他临时表空间
drop tablespace MES_PRD_TEMP including contents and datafiles; drop tablespace MES_MM_TEMP including contents and datafiles; drop tablespace MES_TEMP including contents and datafiles;
(2)重建其他临时表空间
create temporary tablespace MES_PRD_TEMP TEMPFILE '/oracle/app/oracle/oradata/mesorcl/MES_PRD_TEMP.dbf' size 1000M reuse autoextend on next 200M maxsize unlimited;
create temporary tablespace MES_MM_TEMP TEMPFILE '/oracle/app/oracle/oradata/mesorcl/MES_MM_TEMP.dbf' size 4000M autoextend on next 500M maxsize unlimited logging extent management local autoallocate segment space management auto; create temporary tablespace MES_TEMP TEMPFILE '/oracle/app/oracle/oradata/mesorcl/MES_TEMP.dbf' size 4000M autoextend on next 500M maxsize unlimited logging extent management local autoallocate segment space management auto;
七、清理归档日志
因控制文件中保留了原归档日志的目录信息,在进行crosscheck archivelog和备份时会报错,所以需要进行清理。
1、清理日志(正常情况只进行此步骤即可)
rman>delete archivelog all;
2、如果不清理,或报如下错误:
ORA-19633: control file record 58407 is out of sync with recovery catalog
3、查看归档信息
SQL> select FIRST_TIME,name,sequence#,status,thread# from v$archived_log
4、操作(此种方式无法通过强制删除方式删除)
RMAN> delete force archivelog sequence 71542; using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=8 device type=DISK specification does not match any archived log in the repository catalog archivelog 'D:\APP\ADMINISTRATOR\ARCH\RBCHECKIN\ARC0000071542_0853518879.0001'; 通过查询,可以发现,使用force,catalog 无法强制删除归档或者重新注册归档(归档文件已不存在)
5、问题处理
(1)清理控制文件中的归档信息
SQL>execute sys.dbms_backup_restore.resetCfileSection( 11);
(2)使用catalog重新注册
SQL> select name from v$archived_log; no rows selected RMAN> catalog start with '/oracle/archivlog/'; Removing entries in v$archived_log referencing a particluar DEST_ID (Doc ID 845361.1) 原理是清空控制文件中的归档日志信息,重新使用catalog进行注册 由于本次控制文件记录该日志是有效的,但实际文件不存在,通过crosscheck archive过程报错,因此无法常规手段进行处理;
八、升级数据字典
1、通过 startup upgrade 启动实例
--停库
SQL> shutdown immediate
--启动到upgrage模式
SQL> startup upgrade;
2、升级数据字典
大约5-10分钟,如果数据量大,可能得20分钟
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)将周一到周五的信息统计设置为中午11点30,周六-周日是早上7点50开始
SQL>select * from dba_autotask_client;
begin dbms_scheduler.set_attribute ( name => 'MONDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=MON;byhour=11;byminute=30; bysecond=0' ); end; / begin dbms_scheduler.set_attribute ( name => 'TUESDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=TUE;byhour=11;byminute=30; bysecond=0' ); end; / begin dbms_scheduler.set_attribute ( name => 'WEDNESDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=WED;byhour=11;byminute=30; bysecond=0' ); end; / begin dbms_scheduler.set_attribute ( name => 'THURSDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=THU;byhour=11;byminute=30; bysecond=0' ); end; / begin dbms_scheduler.set_attribute ( name => 'FRIDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=FRI;byhour=11;byminute=30; bysecond=0' ); end; /
begin dbms_scheduler.set_attribute ( name => 'SATURDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=SAT;byhour=7;byminute=50; bysecond=0' ); end; / begin dbms_scheduler.set_attribute ( name => 'SUNDAY_WINDOW', attribute => 'REPEAT_INTERVAL', value => 'freq=daily;byday=SUN;byhour=7;byminute=50; bysecond=0' ); end; /
(2)关于整个SQL Tuning advisor优化建议
SQL>select client_name,status,window_group from dba_autotask_client;
BEGIN dbms_auto_task_admin.disable( client_name => 'sql tuning advisor', operation => NULL, window_name => NULL); END; /
十、测试数据库
查询表数据、进行日志切换等操作。
对Linux数据库进行全量备份。
检查数据库db link、diretory等对环境有强依赖对象是否无效,如有必要,进行重建修正。
十一、数据库日志文件在线调整(如果需要调整)
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#;
2、添加日志组和文件
alter database add logfile group 4 '/oracle/app/oracle/oradata/mesorcl/redo04.log' size 200m; alter database add logfile group 5 '/oracle/app/oracle/oradata/mesorcl/redo05.log' size 200m;
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#;
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
rm -rf /oracle/app/oracle/oradata/mesorcl/redo01.log rm -rf /oracle/app/oracle/oradata/mesorcl/redo02.log rm -rf /oracle/app/oracle/oradata/mesorcl/redo03.log
--重新添加
alter database add logfile group 1 '/oracle/app/oracle/oradata/mesorcl/redo01.log' size 200m; alter database add logfile group 2 '/oracle/app/oracle/oradata/mesorcl/redo02.log' size 200m; alter database add logfile group 3 '/oracle/app/oracle/oradata/mesorcl/redo03.log' size 200m;
十、执行一遍rman备份
脚本见:https://www.topunix.com/post-6082.html
SELECT VERSION_NO FROM PREPRESS_MES_VERSION_NO WHERE FACTORYID IS NULL GROUP BY VERSION_NO HAVING COUNT(1) > 1