oracle-kes通过oracle Rman不完全恢复方式创建中间库实现不停机迁移

113 阅读5分钟

一、基于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

图片.png 最大的scn:17383296735847 注意:这个SCN也是KFS源端解析开始的scn 8、如果数据文件路径改变,需要重新定义文件路径。 查找数据文件号和对应的数据文件

RMAN> report schema;  

图片.png

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