一、基于Rman的不停机迁移和基于数据泵的不停机迁移方案比较
oracle-kes不停机迁移的现有方案是,通过oracle数据泵(expdp/impdp)指定scn备份,再将备份还原到oracle中间库,目标端KES使用KDTS工具从oracle中间库迁移存量数据,之后使用KFS从oracle源端的指定scn开始解析,进行无缝的增量同步,从而实现oracle-kes的不停机迁移。
- 该方案优点: 1、操作简单,可以实现部分用户或模式的备份还原 2、在存量数据比较小(数据量小于1T)的时候,指定scn备份还原中间库不会存在问题。
- 该方案缺点: 1、在数据存大的情况下(数据量大于1T),比如气象局卫星中心,存量数据6T,在使用数据泵从指定scn备份时,很容易出现ora-01555的错误。出现该错误的原因在于,oracle存量数据量大,备份时间长,很容易导致undo表空间的数据被覆盖掉,即使配置了足够大的undo表空间和足够长的undo_retention的撤销保证时间。可以通过配置undo表空间gurantee保证数据不被覆盖,但这可能会对业务运行造成影响。 2、即使配置了gurantee,如果表里面有大对象,仍然会出现大对象被覆盖而导致的ora-01555的错误。 使用Rman方式实施不停机迁移,就是将上述方案中,备份还原到中间库的这一步骤从数据泵(expdp/impdp)替换为rman的异机不完全恢复。 3、备份还原速度慢
- 此方案优点: 1、备份数据文件和归档,不会使用到undo表空间,大数据量也不会产生ora-01555的错误。 2、不用指定scn备份,只要在恢复时,查询一下rman中所备份归档日志的scn号,即可实现基于scn的不完全恢复。 3、备份还原速度快。
- 此方案缺点: 1、操作复杂 2、只能整库备份还原,不能实现单用户、单表的备份还原。
二、基于Rman不停机迁移的操作步骤
(一)、通过Rman方式迁移存量数据到中间库
1、源端RMAN备份
rmant target /
run {
allocate channel ch1 type disk maxpiecesize 10g;
allocate channel ch2 type disk maxpiecesize 10g;
allocate channel ch3 type disk maxpiecesize 10g;
allocate channel ch4 type disk maxpiecesize 10g;
sql 'alter system archive log current';
backup as compressed backupset database format '/data/orabak/tms_sy_%T_%U.bkp';
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '/data/orabak/tms_sy_arc_%T_%U.bkp';
backup current controlfile format '/data/orabak/orclcon_%T_%U.bkp';
backup spfile format '/data/orabak/%d.%s.%p.%T.SPFILE';
crosscheck backup;
delete noprompt expired backup;
release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
}
2、备份文件传输到目标端
rsync -P -e "ssh -p 20222 -o StrictHostKeyChecking=no" 121.46.6.236:/data/orabak/* /data/orabak
3、目标库还原spfile文件
rman target /
startup nomount; --这里会报错,主要是没有静态参数文件,可以先忽略
restore spfile from '/data/orabak/ORCL.107.1.20230422.SPFILE';
4、利用spfile生成pfile,然后编辑pfile修改对应路径:
sqlplus / as sysdba
create pfile='/home/oracle/initorcl.ora' from spfile;
exit;
vi $ORACLE_HOME/dbs/initorcl.ora
initorcl.ora中所配置的目录需要手工在操作系统上创建
mkdir -p /media/app/oracle/admin/orcl/adump
mkdir -p /media/app/oracle/oradata/orcl
mkdir -p /media/app/oracle/flashback
mkdir -p /media/app/oracle/archivelog
--从pfile创建spfile
sqlplus / as sysdba
shutdown immediate --先关闭数据库,否则rman会进入DUMMY模式
create spfile from pfile='$ORACLE_HOME/dbs/initorcl.ora'; --利用修改过的pfile重新生成spfile
startup nomount;
5、还原控制文件
rman target /
restore controlfile from '/data/orabak/orclcon_20230422_3a1q8oit_1_1.bkp';
alter database mount;
6、注册备份集到新库的控制文件(如果目标库的备份文件位置与源库的文件位置一致的话,这一步可以忽略)
rman target /
rman>crosscheck backup;
rman>delete noprompt expired backup;
--注册单个备份片:
catalog backuppiece '/u01/rmanbak/testarc_20210716_36043ij8_1_1';
--注册整个目录
---ASM:
CATALOG START WITH '+disk'; # catalog allfiles from an ASM disk group
--本地目录:最后一定要加/
CATALOG START WITH '/data/orabak'; #catalog all files in directory
--有多个目录,注册多次:
RMAN> catalog start with '/data01/';
RMAN> catalog start with '/data02/';
RMAN> catalog start with '/data03/';
7、确定要还原的scn
RMAN> list backup of archivelog all;
找到最大seq的lowscn
最大的scn:17383296735847
注意:这个SCN也是KFS源端解析开始的scn
8、如果数据文件路径改变,需要重新定义文件路径。
查找数据文件号和对应的数据文件
RMAN> report schema;
9、恢复数据库
run {
set until scn 17383296735847;
set newname for datafile 1 to '/data/oradata/orcl/system01.dbf';
set newname for datafile 2 to '/data/oradata/orcl/ogg_01.dbf';
set newname for datafile 3 to '/data/oradata/orcl/sysaux01.dbf';
set newname for datafile 4 to '/data/oradata/orcl/undotbs01.dbf';
set newname for datafile 5 to '/data/oradata/orcl/undotbs02.dbf';
set newname for datafile 7 to '/data/oradata/orcl/users01.dbf';
set newname for datafile 8 to '/data/oradata/orcl/tms.dbf';
set newname for datafile 9 to '/data/oradata/orcl/tmslog.dbf';
set newname for datafile 10 to '/data/oradata/orcl/gps_idx.dbf';
set newname for datafile 11 to '/data/oradata/orcl/gps.dbf';
set newname for datafile 12 to '/data/oradata/orcl/undotbs03.dbf';
restore database;
switch datafile all;
recover database;
}
恢复完成 最后alter database open resetlogs; RMAN>alter database open resetlogs; ps:如果数据库前后版本不一致的,需要重新编译一下无效对象
SQL> startup upgrade
SQL>@?/rdbms/admin/catupgrd.sql
---Creates data dictionary views.重新编译一下一些无效的对象
SQL>@?/rdbms/admin/utlrp.sql
SQL>shutdown immediate
SQL>startup
备注:如果不是作为中间库,而是直接迁移到oracle的话,在增量同步之前,关闭目标库需要同步用户的触发器和job。
(二)、利用KDTS将数据从oracle中间库迁移至KES数据库(步骤略)
(三)、使用KFS将增量数据从源库同步到KES数据库
1、安装replicator(步骤略) 2、源端服务: replicator start offline
fsrepctl -service 源端服务名 online -from-event ora:17383296735847:17383296735847
#此处的SCN号就是上面 rman命令list backup of archivelog all查到的scn号。为防止数据漏解析,建议第一个scn号比第二个scn号小10000。
3、目标端服务: replicator start
#如果目标端服务和源端服务在同一个replicator中,直接服务online:
fsrepctl -service 目标端服务名 online