关键字:
金仓数据库、KingbaseFlySync、KFS、同步程序、replicator、数据同步、数据解析、增量同步、实时同步、KDTS、不停机迁移场景
一、方案背景
源端为Oracle数据库时,需要在不停业务的情况下,实现存量数据的搬迁和增量数据的实时同步。
二、前期准备
// 在进行下一步的详细部署工作开始前,一切需要提前准备好的内容,包括但不限于:部署设备、数据库用户权限、网络访问权限、KFS产品的部署安装等
2.1设备环境准备
名称 |
作用 |
IP |
KFS/kdts安装用户名/密码 |
root用户密码 |
时效 |
kdts工具运行设备 |
运行kdts工具 |
10.10.5.140 |
kdts/1 |
可不提供 |
临时 |
KFS源端部署设备 |
运行KFS源端服务 |
10.10.5.101 |
flysync/1 |
可不提供 |
长期使用 |
KFS目标端部署设备 |
运行KFS目标端服务 |
10.10.5.102 |
flysync/1 |
可不提供 |
长期使用 |
2.2 KFS同步服务部署
2.3 KFS控制台服务部署
三、功能原理
通过使用kdts工具进行存量数据迁移,可以实现不停机将Oracle数据库中的数据迁移到人大金仓KingbaseES数据库中,操作流程如下:
1)存量数据迁移
使用kdts工具的基于SCN的数据搬迁功能,将Oracle数据库中的存量数据搬迁到目标端。
2)增量数据同步
在完成存量数据搬迁后,再使用KFS工具的基于SCN的实时同步功能,将Oracle数据库中新增的数据同步到目标端。
四、详细部署
4.1存量数据迁移
4.1.1存量迁移前置操作
4.1.1.1源端数据库(Oracle)的环境准备-参数确认
1、确认源端数据库Oracle的下列参数情况
SQL> show parameter undo; NAME TYPE VALUE --------------- ------------------ ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace string UNDOTBS1 |
需要关注的参数说明:
undo_retention: 该参数主要用于声明还原段中的事务提交后尽量保留[^注1]的时间,默认时间为900s(15min)。
undo_tablespace:该参数主要声明了undo的表空间(还原表空间)。
注1:还原表空间的使用会优先覆盖超过保留时间的事务,当还原表空间大小不足时,处于保留时间内的事务也有可能被覆盖,即尽量保留。若要强制保留,可执行如下命令。
SQL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name = 'UNDOTBS1'; SQL> alter tablespace UNDOTBS1 retention guarantee; |
对表空间UNDOTBS1开启guarantee以后,当表空间不足且相关事务都处在保留时间时,会抛出误。
SQL> select tablespace_name,file_name,bytes/1024/1024 MB, autoextensible from dba_data_files where tablespace_name='UNDOTBS1'; TABLESPACE_NAME FILE_NAME MB AUTOEX --------------- ----------------------------------------------- ------ ------- UNDOTBS1 /home/oracle/oracle/oradata/orcl/undotbs01.dbf 330 YES |
需要关注的参数说明:
TABLESPACE_NAME:还原表空间名称
FILE_NAME“还原表空间所关联的数据文件
MB:还原表空间的数据文件大小
AUTOEX[^注2]:是否开启自动扩展
注2:在不开启自动扩展的情况下,进行后续的迁移操作,有极大概率报错:ora-01555:快照过旧:回退段号。当开启自动扩展,但是还原表空间设定较小时,也有极小的概率报错:ora-01555。此时需要保证自动扩展是开启的,并且还原表有足够的空间容纳较长时间所产生的redoLog信息。
4.1.1.2源端数据库(Oracle)的环境准备-参数修改
由于实际业务中存量数据迁移耗费的时间往往会大于undo_retention的默认值900S,因此需要根据待搬迁的数据量进行合适的时间预估,将该预估时间其作为undo_retention的新参数值。并且需要关注undo表空间的大小是否支持在修改undo_retention后能够存储相应的数据量。
1)修改undo_retention(单位:秒)
SQL> alter system set undo_retention = 5400; |
2)修改还原表空间大小(单位:MB)
SQL> alter database datafile '/home/oracle/oracle/oradata/orcl/undotbs01.dbf' resize 4096M; |
3)修改保留策略
SQL> alter tablespace UNDOTBS1 retention guarantee; |
修改完成后依次执行下述命令查看执行结果
SQL> show parameter undo; SQL> select tablespace_name,file_name,bytes/1024/1024 MB, autoextensible from dba_data_files where tablespace_name='UNDOTBS1'; SQL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name = 'UNDOTBS1'; |
4.1.2进行存量数据迁移
1、获取源端数据库(Oracle)的SCN,记为X,执行如下SQL语句获取SCN:
-- 开启输出功能 set serveroutput on -- sql示例 declare cursor start_scn_set is SELECT t.* FROM "V$TRANSACTION" t, v$session s WHERE s.saddr =t.ses_addr; v_start_scn start_scn_set%rowtype; c_scn number; begin for v_start_scn in start_scn_set loop dbms_output.put_line('start_scn: '||v_start_scn.start_scn); end loop; select current_scn into c_scn from v$database; dbms_output.put_line('current_scn: '||c_scn); end; / |
该SQL中获取了两种SCN,一个是current_scn,表示当前的SCN号;另一个是start_scn,当查询其不为空时,表示当前数据库有未提交的长事务。使用原则如下:
1) 如果start_scn为空,则使用current_scn;
2) 如果start_scn不为空,则使用最小的start_scn(可能有多个未提交的事务);
2、使用KDTS指定SCN号将存量数据进行迁移,若数据库中不存在未提交长事务就使用上一步查询的current_scn,若数据库中存在未提交的长事务就使用上一步查询的start_scn。
1)登录访问kdts工具的管理控制台
2)在kdts工具控制台的【数据源管理】中,分别在【源数据库】中新建Oracle数据库和在【目标数据库】中新建人大金仓KingbaseES数据库
3)在kdts工具控制台的【搬迁任务管理】中的【搬迁任务】页面,新建搬迁任务,源端数据库选择Oracle数据库,目标端数据库选择人大金仓KingbaseES,点击【下一步】
4)勾选对应的源端模式和选择目标端的模式名称,对搬迁对象进行勾选,点击【下一步】
5)在【选择迁移对象】页面直接点击【下一步】
6)在【配置参数】-【迁移配置】-【源数据库配置】-【其他设置】中的【系统改变号SCN】输入框中输入前面查询到的SCN号
注:SCN号是该节第一步查出的SCN号(使用上:使用KDTS指定SCN号将存量数据进行迁移,若数据库中不存在未提交长事务就使用上一步查询的current_scn,若数据库中存在未提交的长事务就使用上一步查询的start_scn)。
7)保存迁移任务,并在迁移任务管理页面点击【启动】进行数据搬迁
4.2增量数据补偿
注:若 KFS 之前已经部署运行,则源端和目标端需要先执行重置命令 fsrepctl -service XXX reset -all -y,
确认中间表、kufl 文件被清除。
4.2.1源端操作
先启动 KFS 到 offline 状态(replicator start offline)。若源端之前已经运行过 kfs 则先重置源端(fsrepctl -service oracle reset -all -y),再使用 ONLINE 命令,将源端的 KFS 完全启起来,执行 ONLINE 命令时需要指定-from-event 参数X,参数值X为数据迁移操作步骤(6.5.2 1)中查询的 scn 值。实例如下:
shell> replicator start offline shell> fsrepctl -service oracle reset -all -y shell> fsrepctl -service oracle online -from-event ora:X:X |
4.2.2目标端操作
启动目标端 KFS,等待数据追平。
shell> replicator start offline shell> fsrepctl -service oracle reset -all -y shell> fsrepctl -service oracle online |
4.2.3追平的判断方法
1、方法一:查询seqno是否相同
shell> fsrepctl services Processing services command... NAME VALUE ---- ----- appliedLastSeqno: 3 //若源端无新数据产生,则源端和目标端相同 appliedLatency : 0.297 //若源端无新数据产生,延迟时间为 0 role : master serviceName : OracleToKes serviceType : local started : true state : ONLINE Finished services command... |
由于数据解析同步受网络因素和其他外部因素影响,该seqno在一些场景下会出现永不相同的情况,此时需要通过方法二进行验证是否追平。
2、方法二:查看目标端的入库event的时间,是否已经超过源端开始迁移的时候的时间。
shell> fsrepctl status Processing status command... NAME VALUE ---- ----- appliedLastLogPos : ora:195806216:195806219 appliedLastTransno : 86338 appliedLatency : 5.158 autoRecoveryEnabled : false autoRecoveryTotal : 0 channels : 1 clusterName : oracle currentLogPos : NONE currentTimeMillis : 1679990365591 dataServerHost : flysync-2 extensions : host : flysync-2 latestEpochNumber : 86305 masterConnectUri : kufl://flysync-1:3112/ masterListenUri : kufl://flysync-2:3112/ maximumStoredTransNo : 86338 minimumStoredTransNo : 0 offlineRequests : NONE pendingError : NONE pendingErrorCode : NONE pendingErrorLogPos : NONE pendingErrorTransno : -1 pendingExceptionMessage: NONE relativeLatency : 4576.59 resourcePrecedence : 99 rmiPort : 19000 role : slave serviceName : OracleToKes serviceType : local simpleServiceName : OracleToKes siteName : default sourceHost : flysync-2 state : ONLINE timeInStateSeconds : 7547.14 timezone : GMT+08:00 transitioningTo : transnoType : java.lang.Long uptimeSeconds : 7552.701 useSSLConnection : false version : Kingbase FlySync V002R002 workflowSource : UNKNOWN Finished status command... |
关注属性currentTimeMillis,将其与搬迁开始时的时候进行比较,若其远超搬迁开始的时间,即源端目标端之间的数据均已追平。
五、功能验证
5.1数据一致性验证
通过Kingbase Flysync软件自带的数据比对功能,进行源端和目标端的数据一致性校验。
5.2业务切换
将客户的业务从oracle数据库切换到金仓Kingbase ES数据库,观察用户的业务是否运行正常。