KFS同步工具介绍
术语解释
• CDC :即 Changed Data Capture,增量数据获取。
• Logminer :基于 Oracle 自带 Logminer 形式的增量数据解析
• Redo :基于 Oracle 日志硬解析的增量数据解析
• xlogical :Kingbase ES V7 增量日志解析模块
• xlog :Kingbase ES V8 的 Redo 日志
• KUFL :Kingbase FlySync 的中间数据交换文件
KFS同步工具解释
金仓异构数据同步软件Kingbase Flysync(简称KFS)是一种能够在异构数据平台间实现实时、增量数据同步的产品。
KFS整体由源端同步服务、目标端同步服务、KFS同步程序组成。
同步程序(即replicator)
作为同步服务(service)的容器,向物理机申请CPU,内存、端口等资源,其中要申请的内存大小可以通过参数进行配置
replicator本身没有源端和目标端的概念,只是一个容纳同步服务的容器。
每个replicator都需要配置自身的环境变量。
KFS同步服务
运行在replicator容器中,通过replicator分配资源,同一个容器内的服务数量越多,单个服务获得的资源就越少。
同一个同步链路上的源端和目标端服务通过KUFL监听通信,和所处的replicator的容器无关。
同一个replicator中的同步服务,共用一份错误日志。
KFS的同步服务(即service)分两种角色,一种是master角色(负责解析增量数据),一种是slave角色(负责接收指定master解析的增量数据并加载到目标端数据库),一个slave服务只能指定接受一个master服务解析的增量数据;一个服务有且只能具有一个角色,因此实现端到端的增量数据同步,至少需要部署两个服务(一个master角色和一个slave角色的服务)。
同步服务模式
1-1模式:最常用的拓扑类型,主要面向数据库容灾备份场景,用于单个数据源之间的数据同步。
1-N模式:主要面向数据分发场景,用于多个数据库的数据向多个目标端数据源进行数据同步的场景。
N-1模式:面向数据集中场景,用于多个数据库的数据向一个数据库中汇集。
双轨模式:主要用于国产数据库的替代。一个数据库作为主库对外承载业务,另一个作为备库,随时应对所需的业务切换,因业务驱动需要对数据库进行切换时,原作为备库的数据库,可以快速接管。
双向模式:主要面向数据库容灾备份场景,用于单个数据源之间相互的数据同步。
补充:
比如说oracle-kes同步,双向就是oracle-kes,kes-oracle两条链路,同时在跑,正向反向一起同步,双轨是同一时间只跑一条链路,什么时候需要跑反向的时候用命令切换方向
KFS同步服务与数据库的关系
在一个KFS同步服务(即service)的配置文件中,需要指定数据库的连接信息。其中MYSQL数据库需要指定IP地址、端口号,其他数据库需要指定IP地址、端口号、以及dbname(数据库名称),以上参数均只能指定一个值, 如果存在多个值就需要多个服务分别指定。例如:服务器上运行有源端Kingbase ES数据库,同一个实例(数据库端口)下面有2个不同名称的逻辑数据库(database)都会产生增量数据且需要同步数据,那么就需要2个master角色的KFS同步服务,分别解析2个数据库的增量数据。同样的也需要2个slave角色的KFS同步服务分别接收2个master服务的数据。
KFS同步服务与安装节点的关系
在硬件资源充足的情况下,我们所有的KFS同步服务都独立部署(安装在不同的节点上),在硬件资源有限的情况下,我们建议:
1)考虑到环境变量和端口的问题,通常一台物理机上仅部署一个replicator程序。
2)若物理机的配置较为出色,可以在一个replicator中配置多个同步服务。
3)若单个物理机的配置一般,可以在多个物理机上部署多个replicator程序,每个replicator配置少数的同步服务。
部署方式
Kingbase FlySync 部署方式灵活,可满足用户多种需求。主要提供下面两种部署方式:
• Kingbase FlySync 与数据库部署在同一机器上。
• Kingbase FlySync 与数据库分离部署,即不部署在同一机器上。
备注:
- 一般推荐部署方式为分离部署,以保证同步程序与其他应用程序或数据库间不会产生资源竞争。
- 由于 Oracle 提供 redo 及 logminer 两种方式进行增量日志的获取,因受 redo 实现方式所限,若采
- 用 redo 方式进行数据同步,则需要采用集中部署的方式。
- ESV7 兼容模式,也需要采取集中部署的方式。
本文档采用Oracle 提供 logminer方式进行增量日志的获取,Kingbase FlySync 与数据库分离部署,即不部署在同一机器上。
部署拓扑
• 一对一拓扑结构 :从一个源端节点同步数据到一个目标端节点。
• 一对多拓扑结构 :从一个源端节点同步数据到多个目标端节点。
• 多对一拓扑结构 :从多个源端节点同步数据到一个目标端节点。
• 多对多拓扑结构 :从多个源端节点同步数据到多个目标端节点。
• 级联 :从一个源端节点同步数据到中间节点,再继续同步给下一个目标节点。
环境要求
支持的操作系统
支持的数据库
内存要求
内存要求:2GB
磁盘要求
• 软件包的磁盘空间要求:2GB
• 安装路径中的磁盘空间要求:2GB
• KUFL 文件(KFS的中间数据交换文件)的磁盘空间要求:实际和具体的运行压力有关,建议:> 20GB
Java 环境要求
• Oracle JVM/JDK8
• Open JDK8
依赖软件
以下软件可能在使用 Kingbase FlySync 时用到,若不具备可以按以下地址自行下载。
名称 |
安装及下载地址 |
sqlplus |
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html |
jdk |
1.8版本下载地址 https://www.oracle.com/java/technologies/downloads/#java8 |
mysql |
5.7版本下载地址MySQL :: Download MySQL Community Server https://dev.mysql.com/downloads/mysql/5.7.html#downloads 8.0版本下载地址MySQL :: Download MySQL Community Server https://dev.mysql.com/downloads/mysql/ |
ruby |
建议使用系统自带版本,不单独提供下载链接 |
备注:
- sqlplus 主要用于进行数据的授权操作,为非必须依赖;
- mysql 可作为管控平台后台元信息库使用,可根据实际情况选择元数据类型采用 mysql 或者 KingbaseESV8;
- ruby 及 jdk 默认情况通过安装包自带,若通过手动安装则需要进行该依赖的安装及配置;
ruby 编程语言
同步需求
操作系统均为Centos7.9 x86_64
源端 |
Oracle11.2.0.4 单点 |
192.168.3.112 |
实例:ORCL2 |
端口1521 |
用户密码:portal/oracle |
KFS |
192.168.3.132 |
||||
目标端 |
KingbaseV8R6单点 |
192.168.19.220 |
端口54321 |
用户密码:syxk/syxk |
安装前准备
源端Oracle库信息统计
检查数据库配置
查看字符集
col value for a30 set linesize 999 SELECT PARAMETER , VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET'; PARAMETER VALUE ------------------------------------------------------------------------------------------ ------------------------------ NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET UTF8
查看归档模式
必须开启归档
--查看数据库归档模式 archive log list; 或 select log_mode from v$database; --ARCHIVELOG为归档模式
如果未开启归档,将数据库启动到mount状态,查看当前归档模式状态,打开归档模式、启动数据库
--开启 archive log list 1.操作系统上创建归档目录 mkdir -p /archivelog chown -R oracle:oinstall /archivelog chmod -R 755 /archivelog 2.更改数据库参数 shutdown immediate; startup mount; alter system set log_archive_dest_1='location=/archivelog' scope=spfile; alter database archivelog; alter database open; archive log list
检查并开启补全日志
检查补全日志的状态
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;
开启补全日志(建议在MOUNT模式下执行)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; --supplemental_log_data_min ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS; --supplemental_log_data_pk alter database add supplemental log data (all) columns; --supplemental_log_data_all
权限
本文档采用拥有dba角色的业务用户,若采用新用户按以下步骤配置。
Oracle 数据库支持两种类型的解析方式
- Redo (需要和数据库部署在同一台机器上,直接解析数据库物理日志,性能高)
- Logminer (可以和数据库分离部署,依赖数据库本身自带的Logminer,性能稍低)
redo 方式
当配置为 redo 方式时,仅需要保证当前数据库账号可以查询系统字典表
-- 资源使用 GRANT CONNECT TO KFS_USER; GRANT CREATE SESSION TO KFS_USER; GRANT UNLIMITED TABLESPACE TO KFS_USER; -- 创建断点记录中间表 GRANT CREATE TABLE TO KFS_USER; -- 查询系统表权限 GRANT EXECUTE_CATALOG_ROLE TO KFS_USER; GRANT SELECT ANY DICTIONARY TO KFS_USER; GRANT SELECT ON V_$PARAMETER TO KFS_USER; GRANT SELECT ANY TABLE TO KFS_USER; GRANT SELECT ANY TRANSACTION TO KFS_USER;
Logminer 方式
当配置为 Logminer 方式时,需要以下的额外权限
-- 资源使用 GRANT CONNECT TO KFS_USER; GRANT CREATE SESSION TO KFS_USER; GRANT UNLIMITED TABLESPACE TO KFS_USER; -- 创建断点记录中间表 GRANT CREATE TABLE TO KFS_USER; -- 调用Logminer所需权限 GRANT CREATE MINING MODEL TO KFS_USER; GRANT LOGMINING TO KFS_USER; GRANT EXECUTE ON DBMS_FLASHBACK TO KFS_USER; GRANT EXECUTE ON DBMS_LOGMNR TO KFS_USER; GRANT EXECUTE ON DBMS_LOGMNR_D TO KFS_USER; GRANT EXECUTE ON SYS.DBMS_LOGMNR TO KFS_USER; GRANT EXECUTE ON SYS.DBMS_LOGMNR_D TO KFS_USER; GRANT EXECUTE ON SYS.DBMS_LOGMNR_INTERNAL TO KFS_USER; GRANT EXECUTE ON SYS.DBMS_LOGMNR_LOGREP_DICT TO KFS_USER; GRANT EXECUTE ON SYS.DBMS_LOGMNR_SESSION TO KFS_USER; GRANT EXECUTE_CATALOG_ROLE TO KFS_USER; GRANT SELECT ANY DICTIONARY TO KFS_USER; GRANT SELECT ANY TABLE TO KFS_USER; GRANT SELECT ANY TRANSACTION TO KFS_USER; GRANT SELECT ON SYS.V_$ARCHIVED_LOG TO KFS_USER; GRANT SELECT ON SYS.V_$DATABASE TO KFS_USER; GRANT SELECT ON SYS.V_$LOGMNR_CONTENTS TO KFS_USER; GRANT SELECT ON V_$ARCHIVED_LOG TO KFS_USER; GRANT SELECT ON V_$DATABASE TO KFS_USER; GRANT SELECT ON V_$LOG TO KFS_USER; GRANT SELECT ON V_$LOGFILE TO KFS_USER; GRANT SELECT ON V_$LOGMNR_CONTENTS TO KFS_USER; GRANT SELECT ON V_$LOGMNR_DICTIONARY TO KFS_USER; GRANT SELECT ON V_$LOGMNR_LOGS TO KFS_USER; GRANT SELECT ON V_$LOGMNR_PARAMETERS TO KFS_USER; GRANT SELECT ON V_$PARAMETER TO KFS_USER;
如果有条件,可以考虑使用DBA权限
GRANT CONNECT, RESOURCE TO KFS_USER; GRANT EXECUTE_CATALOG_ROLE TO KFS_USER; GRANT CREATE SESSION TO KFS_USER; GRANT SELECT ANY TRANSACTION TO KFS_USER; GRANT SELECT ANY TABLE TO KFS_USER; GRANT UNLIMITED TABLESPACE TO KFS_USER; GRANT dba TO KFS_USER;
注:当源端oracle使用logminer方式解析时,由于logminer自身限制,不支持GIS相关类型数据的解析,如不可避免,可改用redo方式解析
统计要迁移业务用户的现有数据量
如果源端Oracle库数据库大于500G,建议先使用KDTS迁移工具进行一次全量迁移,然后再使用KFS同步工具进行增量同步。
--统计要迁移用户的数据量 select round(sum(bytes) / 1024 / 1024 / 1024, 2) || 'G' from dba_segments where owner in ('PORTAL') ; 输出: ROUND(SUM(BYTES)/1024/1024/1024,2)||'G' 4.43G
统计各类对象数量
--根据指定用户统计用户下的各对象类型和数目 select object_type,count(*) from all_objects where owner='PORTAL' group by object_type order by 1; OBJECT_TYPE COUNT(*) FUNCTION 1 INDEX 192 LOB 17 PROCEDURE 3 SEQUENCE 2 TABLE 155 VIEW 4
数据类型和主键信息
查询待同步表包含的所有数据类型
SELECT DATA_TYPE, COUNT(0) FROM ALL_TAB_COLUMNS WHERE OWNER = 'PORTAL' -- 待同步模式的模式名 GROUP BY DATA_TYPE ORDER BY COUNT(0) DESC; DATA_TYPE COUNT(0) VARCHAR2 1936 TIMESTAMP(6) 270 NUMBER 118 TIMESTAMP(9) 52 CHAR 33 DATE 24 CLOB 10 BLOB 4 NVARCHAR2 4 LONG 1
查询数据库中不存在主键信息表
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'PORTAL' -- 待同步模式的模式名 AND TABLE_NAME NOT IN ( SELECT TABLE_NAME FROM ALL_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P' AND OWNER = 'PORTAL' -- 待同步模式的模式名 );
查询数据库中含有大字段类型表
SELECT TABLE_NAME, WM_CONCAT( DATA_TYPE) AS DATA_TYPE FROM ALL_TAB_COLUMNS WHERE OWNER = 'PORTAL' -- 待同步模式的模式名 AND DATA_TYPE IN ( 'BLOB' , 'TINYBLOB' , 'MEDIUMBLOB' , 'LONGBLOB' , 'CLOB' , 'NCLOB' , 'XML' , 'RAW' , 'LONG RAW' , 'LONG' , 'BFILE' , 'BINARY' , 'VARBINARY' , 'LONGVARBINARY' , 'BYTEA' , 'IMAGE' , 'TEXT' , 'NTEXT' , 'TINYTEXT' , 'MEDIUMTEXT' , 'LONGTEXT' , 'NTEXT' , 'LONGTEXT' , 'NCLOB' ) GROUP BY TABLE_NAME;
查询数据库中不存在主键,并且含有大字段类型表
SELECT DISTINCT TABLE_NAME FROM ALL_TAB_COLUMNS WHERE OWNER = 'PORTAL' -- 待同步模式的模式名 AND DATA_TYPE IN ( 'BLOB' , 'TINYBLOB' , 'MEDIUMBLOB' , 'LONGBLOB' , 'CLOB' , 'NCLOB' , 'XML' , 'RAW' , 'LONG RAW' , 'LONG' , 'BFILE' , 'BINARY' , 'VARBINARY' , 'LONGVARBINARY' , 'BYTEA' , 'IMAGE' , 'TEXT' , 'NTEXT' , 'TINYTEXT' , 'MEDIUMTEXT' , 'LONGTEXT' , 'NTEXT' , 'LONGTEXT' , 'NCLOB' ) AND TABLE_NAME NOT IN ( SELECT TABLE_NAME FROM ALL_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P' AND OWNER = 'PORTAL' -- 待同步模式的模式名 );
查询数据库中主键列数据类型
SELECT tc.DATA_TYPE, COUNT(0) FROM ALL_CONS_COLUMNS cc LEFT JOIN ALL_CONSTRAINTS c ON cc.CONSTRAINT_NAME = c.CONSTRAINT_NAME LEFT JOIN ALL_OBJECTS o ON o.owner = c.owner AND o.OBJECT_NAME = c.table_name LEFT JOIN ALL_TAB_COLS tc ON tc.TABLE_NAME = o.OBJECT_NAME AND tc.COLUMN_NAME = cc.COLUMN_NAME WHERE C.CONSTRAINT_TYPE = 'P' AND o.owner = 'PORTAL' -- 待同步模式的模式名 GROUP BY DATA_TYPE ORDER BY COUNT(0) DESC;
查询无主键表数据类型
SELECT TABLE_NAME, WM_CONCAT(DATA_TYPE) AS DATA_TYPE FROM ( SELECT DISTINCT TABLE_NAME, DATA_TYPE FROM ALL_TAB_COLUMNS WHERE OWNER = 'PORTAL' --待同步模式的模式名 AND TABLE_NAME NOT IN( SELECT TABLE_NAME FROM ALL_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P' AND OWNER = 'PORTAL' --待同步模式的模式名 ) ) GROUP BY TABLE_NAME;
查看归档保留天数
要根据日增数据量调整归档保留天数,避免kfs增量迁移过程中归档被删除。
--查看定时任务 crontab -l --查看归档清理脚本内容 cat /data/oracle/scripts/clear_archive.sh
查看当前scn
select current_scn from v$database; CURRENT_SCN 13013087410
目标端金仓库部署
金仓数据库部署
Oracle是区分大小即大小写敏感,如果应用存入数据库中的数据都是小写那么可以初始化成大小写不敏感的实例,如果应用存入数据库中的数据中有大小写敏感的数据,那么就需创建一个大小写敏感的实例不然同步过程中会报错。
部署过程省略
参数注意:
初始化字符集是UTF8
兼容模式Oracle的实例
连接数至少500
--查看版本 [kingbase@localhost ~]$ ksql -V ksql (Kingbase) V008R006C008B0020 --查数据库兼容模式 test=# show database_mode; database_mode --------------- oracle (1 row) --查大小写敏感 V8R3 SHOW case_sensitive; on:表示大小写敏感。 off:表示大小写不敏感。 V8R6 enable_ci=off 大小写敏感 on:大小写不敏感 test=# show enable_ci; enable_ci ----------- off (1 row) test=# show enable_ci; enable_ci ----------- off --查连接数 考虑到kfs会占用一些会话数 test=# show max_connections; max_connections ----------------- 1000
创建业务用户和数据
create user syxk with password 'syxk'; create database syxk owner syxk; grant all privileges on database syxk to syxk;
KFS同步工具服务器准备工作
安装包获取并上传
检查要部署KFS同步工具的服务器是否在支持的操作系统列表项中。
安装包有Windows和Linux分类,视情况且要根据操作系统和cpu类型联系厂家技术人员获取对应操作系统的最新版的安装包和授权文件,KFS同步工具是收费工具非免费,有授权文件控制有效期。
本文档是基于Linux操作系统:
KingbaseFlySync-V002R002B20240114_21-mc-Linux-x86_64.tar.gz
license_KFS-90天.zip
上传至KFS服务器192.168.3.175的/opt/kfs目录下
检查网络环境和网络端口
Kingbase FlySync 默认使用的端口:
端口 |
备注 |
11000、11001 |
Kingbase FlySync 后台节点默认jmx监听端口 |
3112 |
Kingbase FlySync 中间文件交换默认监听端口(KUFL :Kingbase FlySync 的中间数据交换文件) |
8089 |
Kingbsae FlySync 管控平台默认监听端口 |
8090 |
Kingbsae FlySync 服务中心默认监听端口 |
8091 |
Kingbsae FlySync 比对服务默认监听端口 |
为了使需要进行同步的两端设备可以保持正常通信,请确认以上端口检查配置打开,若同步环境存在防火
墙配置,需要确保以上端口通信的畅通。同时需要确保本地 localhost 端到端回环通信连接未受到限制。
即:KFS上面的这些端口都能和源端目标端通畅。
检查服务器当前编码
在安装前需要检查当前系统的编码类型设置当前系统的编码为 UTF-8。由于replicator 的相关配置和日志生成是默认选择的是当前平台的编码类型, 而在存储是 UTF-8 进行编码。
[root@top132:/opt/kfs]$ echo $LANG en_US.UTF-8
创建部署KFS的用户
--创建部署KFS的用户 adduser flysync passwd flysync --切换到部署KFS的用户 su - flysync
如果必要,可以将 Oracle、MySQL、Kingbase 的属组赋予 Kingbase FlySync 帐号:
sudo usermod -G mysql,kingbase,oracle flysync
部署元数据库
元数据库类型支持Kingbase MySQL PostgreSQL,安装一个单点作为元数据库即可。本文档采用PG14.2单点作为元数据库。
部署数据库步骤省略
--初始化postgres用户密码 alter user postgres with password 'postgres';
创建管控平台元数据库(可选)
KFS同步工具新版本不需要管控平台库,已集成在derby里。如果是老版本需要该步骤。本文档是基于KingbaseFlySync-V002R002B20240114_21版本,所以不需要管控平台元数据库。
--创建数据库 create database console owner postgres; grant all privileges on database console to postgres;
创建比对服务元数据库
--创建数据库 create database compare owner postgres; grant all privileges on database compare to postgres;
系统环境配置
用户资源检查与配置
KFS同步工具服务器上操作
ulimit 用于限制 shell 启动进程所占用的资源。因 Kingbase FlySync 在运行时,会需要打开大量的文件
句柄。Kingbase FlySync 进程涉及的几个限制包括最大文件句柄数(open files)、允许创建的最大进程数量 (max user processes),若参数值不符合运营配置要求,可通过修改 /etc/security/limits.conf 配置文件进行调整。
--检查当前配置 ulimit -a --增加用户资源参数 vi /etc/security/limits.conf #add by kfs flysync soft nofile 65535 flysync hard nofile 65535 flysync soft nproc 8096 flysync hard nproc 8096 mysql soft nofile 65535 mysql hard nofile 65535 mysql soft nproc 8096 mysql hard nproc 8096 参数说明: 第 1 列表示配置的 OS 用户名(根据实际用户修改) 第 3 列表示配置的属性(nofile 表示打开文件数,nproc 表示打开的进程数) 第 4 列表示配置的数值 --配置生效 sysctl -p --检查配置是否生效 ulimit -a
所以需要检查一下系统相关的 ulimit 属性参数是否能够满足要求。
hosts 文件配置
参与同步操作的每个服务器都需要配置,以132为例:
--增加同步节点主机名至/etc/hosts [root@top132:/root]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 top132 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.3.132 top132 192.168.19.220 kes 192.168.3.191 db191 --/etc/sysconfig/network中增加NETWORKING = yes HOSTNAME = top132 [root@top132:/root]$ cat /etc/sysconfig/network # Created by anaconda NOZEROCONF=yes NETWORKING = yes HOSTNAME = top132 --检查主机名 uname -n --确认ip地址 hostname --ip-address nslookup top132 ping top132 nslookup db191 ping db191 nslookup kes ping kes
时钟同步检查
参与同步操作的每个服务器都需要配置,以132为例:
查看参与数据同步的两端所在物理机器的当前系统时间,需要保证时间彼此一致,否则可能会造成同步程
序工作异常。
如果服务器时间不是最新的
--修改系统时间 [root@localhost ~]# date -s "2024-11-19 13:51:00" [root@localhost ~]# hwclock -w
依赖软件检查
系统安装部署依赖软件检查表(根据实际情况参照):
软件 |
版本 |
备注 |
ruby |
1.8.7, 1.9.3, 2.0 |
必须,建议使用 Kingbase FlySync 安装包自带版本 |
sqlplus |
涉及Oracle数据库的同步部署时,需要具备 |
|
jdk |
1.8及以上 |
必须 |
MySQL |
5.7, 8.0 |
Kingbase FlySync 管控平台运行所需依赖(视情况检查) |
Kingbase |
V8R2, V8R3, V8R6 |
Kingbase FlySync 管控平台运行所需依赖(视情况检查) |
Derby |
Kingbase FlySync 管控平台运行所需依赖(视情况检查) |
KDTS存量数据迁移
先使用KDTS迁移工具进行一次基于SCN的全量迁移,然后再使用KFS同步工具进行增量数据迁移及实时增量同步。也可通过KDTS迁移工具进行数据结构迁移,继而使用KFS同步工具同步数据,该方式存在一个弊端:后边有更新这些操作的话,同步到目标端因为缺少原始数据,就会更新一个空值。如果不通过KDTS迁移存量数据直接用KFS同步工具全量同步会提示目标端对象不存在。
新建源库数据源
新建目标库数据源
新建基于scn的迁移任务
选择数据源
选择模式
排除指定对象
SYS_EXPORT_SCHEMA_开头的表
备份表 --需和现场同事沟通
不同步的部分业务表 --需和开发确认
特别大的表--拆分迁移场景考虑
迁移参数配置
源库参数配置
用于指定scn存量数据迁移和大库的迁移优化
目标库参数配置
开启迁移
查看迁移结果
必须得夸下,KDTS迁移工具通过多次迭代更新,迁移效果还是很理想。
处理迁移报错
ERROR: syntax error at or near "IF"
问题描述
错误报告中显示如下报错:
PORTAL.V_DATAQUALITY_ORGAN fail: com.kingbase.kdts.h.b: sql=IF EXISTS(select * from sys.views v left join sys_namespace n on n.oid = v.schema_id and nspname = 'public' where NAME='V_DATAQUALITY_ORGAN') DROP VIEW "public"."V_DATAQUALITY_ORGAN" at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:327) at com.kingbase.kdts.dboperator.a.execute(AbstractDbOperator.java:293) at com.kingbase.kdts.job.migration.at.bf(ViewWriteJob.java:57) at com.kingbase.kdts.job.migration.at.call(ViewWriteJob.java:25) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: com.kingbase8.util.KSQLException: ERROR: syntax error at or near "IF" Position: 1 At Line: 1, Line Position: 1 at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3675) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3101) at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:806) at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:698) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:601) at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:575) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:536) at com.kingbase8.jdbc.KbStatement.executeUpdate(KbStatement.java:478) at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:119) at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java) at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:317) ... 7 common frames omitted PORTAL.VIEW_SYS_MENU_ORGAN fail: com.kingbase.kdts.h.b: sql=IF EXISTS(select * from sys.views v left join sys_namespace n on n.oid = v.schema_id and nspname = 'public' where NAME='VIEW_SYS_MENU_ORGAN') DROP VIEW "public"."VIEW_SYS_MENU_ORGAN" at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:327) at com.kingbase.kdts.dboperator.a.execute(AbstractDbOperator.java:293) at com.kingbase.kdts.job.migration.at.bf(ViewWriteJob.java:57) at com.kingbase.kdts.job.migration.at.call(ViewWriteJob.java:25) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: com.kingbase8.util.KSQLException: ERROR: syntax error at or near "IF" Position: 1 At Line: 1, Line Position: 1 at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3675) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3101) at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:806) at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:698) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:601) at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:575) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:536) at com.kingbase8.jdbc.KbStatement.executeUpdate(KbStatement.java:478) at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:119) at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java) at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:317) ... 7 common frames omitted PORTAL.V_SZ_DM_JG fail: com.kingbase.kdts.h.b: sql=IF EXISTS(select * from sys.views v left join sys_namespace n on n.oid = v.schema_id and nspname = 'public' where NAME='V_SZ_DM_JG') DROP VIEW "public"."V_SZ_DM_JG" at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:327) at com.kingbase.kdts.dboperator.a.execute(AbstractDbOperator.java:293) at com.kingbase.kdts.job.migration.at.bf(ViewWriteJob.java:57) at com.kingbase.kdts.job.migration.at.call(ViewWriteJob.java:25) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: com.kingbase8.util.KSQLException: ERROR: syntax error at or near "IF" Position: 1 At Line: 1, Line Position: 1 at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3675) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3101) at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:806) at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:698) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:601) at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:575) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:536) at com.kingbase8.jdbc.KbStatement.executeUpdate(KbStatement.java:478) at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:119) at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java) at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:317) ... 7 common frames omitted PORTAL.V_DATAQUALITY_USER fail: com.kingbase.kdts.h.b: sql=IF EXISTS(select * from sys.views v left join sys_namespace n on n.oid = v.schema_id and nspname = 'public' where NAME='V_DATAQUALITY_USER') DROP VIEW "public"."V_DATAQUALITY_USER" at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:327) at com.kingbase.kdts.dboperator.a.execute(AbstractDbOperator.java:293) at com.kingbase.kdts.job.migration.at.bf(ViewWriteJob.java:57) at com.kingbase.kdts.job.migration.at.call(ViewWriteJob.java:25) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:842) Caused by: com.kingbase8.util.KSQLException: ERROR: syntax error at or near "IF" Position: 1 At Line: 1, Line Position: 1 at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3675) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3101) at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407) at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:806) at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:698) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:601) at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:575) at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:536) at com.kingbase8.jdbc.KbStatement.executeUpdate(KbStatement.java:478) at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:119) at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java) at com.kingbase.kdts.dboperator.a.aQ(AbstractDbOperator.java:317) ... 7 common frames omitted
选中某个视图提示如下报错
-- ERROR: syntax error at or near "IF" Position: 1 At Line: 1, Line Position: 1 而KDTS详情中源库Oracle中视图sql显示为空
解决办法
Oracle源库中生成视图sql,如下:
CREATE VIEW PORTAL.V_DATAQUALITY_ORGAN ( ID, VALID, NAME, CODE, GRADE, PARENT, SHORTNAME, ORGANTYPECODE, PRINTTEXT ) AS SELECT ID --主键ID , TO_NUMBER(STATE,'999') AS VALID --状态:01:正常;02:注销 ; 03: 删除; 04 不可用 , NAME --名称 , CODE --代码 , GRADE --级次 , PARENT_ID AS PARENT --父机构ID , NULLIF(SHORT_NAME, CODE) AS SHORTNAME --简称 , ORGAN_TYPE_CODE AS ORGANTYPECODE --机构类型 , PRINT_TEXT AS PRINTTEXT --局轨 FROM AAF_ORGAN GO
将PORTAL.去掉,直接在目标库KES中创建
KFS单点实施过程
注意最后部署完成不会自动启动,需手动启动
管控平台部署(图形化)
启动安装程序
提前运行C:\Users\Public\Desktop\Xmanager Power Suite 7\Tools\Xmanager - Passive
--解压安装包 cd /opt/kfs tar -xvf KingbaseFlySync-V002R002B20240114_21-mc-Linux-x86_64.tar.gz su - flysync cd /opt/kfs export DISPLAY=192.168.19.74.0.0 --图形界面安装 sh setup.sh 或 sh setup.sh -i swing --命令行安装 sh setup.sh -i console
本文档采用图形化部署
简介
许可协议
该步骤显示北京人大金仓信息技术股份有限公司许可协议。
授权文件
试用期90天,通过Mac地址绑定
选择安装集
安装程序提供“完全安装”和“管控平台”、“比对服务”三种安装集,默认选择“完全安装”。
1. “完全安装”——系统将安装管控平台及比对服务功能部件。建议大多数用户采用此选项。。
2. “管控平台”——只安装管控平台功能部件。管控平台为系统主服务,提供同步工具的常规管理功能。
3. “比对服务”——只安比对服务功能部件。比对服务为管控平台增强功能,提供同步数据的比对及比对结果查看功能。
选择安装目录
管控平台元数据库配置(可选)
KFS同步工具新版本不需要管控平台库,已集成在derby里。如果是老版本需要该步骤。本文档是基于KingbaseFlySync-V002R002B20240114_21版本,所以不需要管控平台元数据库。
支持Kingbase MySQL PostgreSQL
比对服务元数据库配置
服务元信息配置
此步骤用于配置“管控平台”及“比对服务”的服务元信息:
admin密码admin
8089 |
Kingbsae FlySync 管控平台默认监听端口 |
8090 |
Kingbsae FlySync 服务中心默认监听端口 |
8091 |
Kingbsae FlySync 比对服务默认监听端口 |
预安装摘要
此步骤用于在安装前显示即将安装产品的摘要信息。包括:
1. 产品名;
2. 安装文件夹;
3. 磁盘空间信息;
正在安装
此步骤用于显示安装进度。
安装完成
此步骤用于显示安装结果,及后续操作
执行 Root.sh
此步骤为 Linux 特有步骤。
1. 打开新终端;
2. 切换到 root 用户;
3. 运行 < 安装目录 >/scripts/Root.sh;
/home/flysync/scripts/Root.sh
注意: Linux 中执行 Root.sh 成功后,安装过程完整结束并且启动相关服务。执行过程中会创建以下系统服务:
systemctl status fsmanager
systemctl status fsconsole
systemctl status fscompare
输出如下:
[root@top132:/opt]$ /home/flysync/scripts/Root.sh Detected RHEL or Fedora: Installing the FlySync Web Manager Service daemon using systemd... creating default service file... Created symlink from /etc/systemd/system/multi-user.target.wants/fsmanager.service to /etc/systemd/system/fsmanager.service. Detected RHEL or Fedora: Installing the FlySync Web Console Service daemon using systemd... creating default service file... Created symlink from /etc/systemd/system/multi-user.target.wants/fsconsole.service to /etc/systemd/system/fsconsole.service. Detected RHEL or Fedora: Installing the FlySync Compare Service daemon using systemd... creating default service file... Created symlink from /etc/systemd/system/multi-user.target.wants/fscompare.service to /etc/systemd/system/fscompare.service. Starting FlySync Web Manager Service with systemd... Waiting for FlySync Web Manager Service... running: PID:32389 Starting FlySync Web Console Service with systemd... Waiting for FlySync Web Console Service... running: PID:32591 Starting FlySync Compare Service with systemd... Waiting for FlySync Compare Service... running: PID:361 SUCCESS [root@top132:/opt
启动与停止
启动
Kingbase FlySync 服务的启动与停止可通过命令行方式操作
启动管控平台
1. 打开新终端;
2. 切换到 root 用户;
3. cd 到 < 安装目录 >,执行如下操作;
./manager/bin/fsmanager start ./console/bin/fsconsole start ./compare/bin/fscompare start
注意:启动顺序请按上述顺序启动。
停止
停止管控平台
1. 打开新终端;
2. 切换到 root 用户;
3. cd 到 < 安装目录 >,执行如下操作;
./manager/bin/fsmanager stop ./console/bin/fsconsole stop ./compare/bin/fscompare stop
服务状态查看
• 管控平台状态查看
1. 打开新终端;
2. cd 到 < 安装目录 >,执行如下操作;
./manager/bin/fsmanager status ./console/bin/fsconsole status ./compare/bin/fscompare status
访问管控平台
启动管控平台后,默认登录地址为:
http://管控平台所在机器 IP 地址:8089/ 即http://192.168.3.132:8089/
注若安装过程修改了管控平台端口,请以实际为准。
默认帐号密码为 admin/admin
相关文件位置说明
安装日志位置
安装目录/Logs
组件日志位置
cd 安装目录
./manager/log
./console/log
./compare/log
配置文件位置
cd 安装目录
./manager/conf
./console/conf
./compare/conf
配置同步链路
配置同步有拓扑和向导两种模式,该文档采用向导模式配置。
向导模式是一个简化部署流程,填写少量的配置参数,低成本的快速安装同步服务的模块,达到简化配置,快速安装的目的。向导模式包含5种同步服务模式(1-1模式,1-N模式,N-1模式,双轨模式,双向模式);
本文档采用1-1模式。
选择同步程序的模式
选择同步程序的模式(1-1模式,1-N模式,N-1模式,双轨模式,双向模式)
配置源端同步程序所在服务器信息
注意是源端同步程序所在服务器的信息
如果是集中部署,需在源库所在服务器上创建安装用户,本文档源库是单点采用KFS同步程序分离部署
配置源端数据库及同步服务信息
配置源端数据库及同步服务信息(选择相关的数据源类型配置数据源相关参数)
Oracle 数据库支持两种类型的解析方式
- Redo (需要和数据库部署在同一台机器上,直接解析数据库物理日志,性能高)
- Logminer (可以和数据库分离部署,依赖数据库本身自带的Logminer,性能稍低)
源端评估
源端评估(评估同步程序安装机器、数据库配置等)
如果服务器配置高则评估会快,不然时长相对较长
配置源端高级参数
配置源端高级参数(重试重连,过滤器,健壮性增强,事务拆分等。参数有基本的默认值,按需修改)
跨隔离装置模式
跨隔离装置模式有:正常模式和隔离模式(隔离模式即网闸场景)
检查
检查:检查项内容安装部署时会检查环境版本等信息,在此处配置可选择跳过不检查
重连重试参数
- max_attempts:自动恢复尝试次数,系统 OFFLINE时,尝试将系统重新置于 ONLNE 状态的次数
- delay_interval:系统 OFFLINE 时,尝试 ONLNE 之前的等待时间,s(秒)、m(分钟)、h(小时)
- reset_interval:系统自动恢复次数重置时间,8(秒)、m(分钟)、h(小时)
资源配额配置
资源配额可进行开启和关闭
过滤器参数
过滤器含以下选项:
- dropstatementdata 源端过滤器,作用:不同步ddl语句
- ddlsupport 源端过滤器,作用:同步指定ddl操作
- skipeventbytype 源端过滤器,作用:过滤指定dmmI操作
- custompkey 源端过滤器,作用:配置表主键
- bic 源端过滤器,作用:源端获取前项值
健壮性增强参数
健壮性增强参数:
- replicator.store.kufl.enableKuflRWControl:KUFL存储一致性增强,开启后对性能存在
部分影响,强制要求源端 KUFL 落盘后才发送给目标端,默认false
- replicator.store.kufl.fsyncOnFlush:KUFL存储时启用fsync机制,强制将内存中的数据刷盘,默认false
- replicator.store.kufl.ignoreCheckEpochNumber:忽略检查KUFL时间线,Kingbase FlySync 启动时不检查 EpochNumber,默认false
事务拆分参数
- replicator.extractor.dbms.minRowsPerBlock:KUFL事务的每个分片中数据条数(单位:条)
将事务拆分为指定条数的分片,防止内存溢出
- replicator.extractor.dbms.maxTransactionCapacity:设置最大长事务内存(单位:MB)
其他参数
- replicator.privileged.master:是否开启源端数据库超级权限,默认false
- replicator.extractor.dbms.scnSegmentationThreshold:logminer 查询数据的阈值,默认值为5000
- replicator.extractor.dbms.maxLobSize:允许同步的单个大对象大小(单位:字节),默认值为5000000
- replicator.datasource.global.catalogPrefix:多服务部署时的中间表前缀,默认false
- replicator.store.kuf.dataSource:设置支持本地文件记录断点信息,默认global
- replicator.filter.bic.includeAlCols:是否获取表中所有列前项,默认false
- replicator.extractor.dbms.appendHiddenColumns:是否解析隐藏列
- replicator.extractor.dbms.tableLevelSupLog:开启需要解析表的附加日志,默认false
- replicator.extractor.dbms.appendRowIds:源端是否需要开启ROVID的表,示例:模式1表1,模式2表2
- replicator.filter.replicate.filePrefix:是否将replicate.do、replicate ignore配置生成到单独文件,默认false
配置目标端同步程序所在服务器信息
配置目标端同步程序所在服务器信息(类似源端)
配置目标端数据库及同步服务信息
配置目标端数据库及同步服务信息(类似源端)
目标端评估
目标端评估(类似源端)
配置目标端高级参数
配置目标端高级参数(类似源端)
省略
链路同步范围
链路同步范围(选择需要同步的表、设置需要过滤的列)
不录入关键字,点击搜索,可事新获取表
从库里往出来查表,所以要是表很多的话,就是会慢,然后内存小的话页面就是会卡住,得等
是否开启table Partterm过滤:底层过滤,就是在解析开始前就过滤不需要的表,不开启这个,金仓过滤是把事务都解析出来,然后再去过滤
链路同步映射
链路同步映射(设置源端、目标端模式名,表名,列名映射关系,包括大小写转换或设置映射)
确认配置
确认配置(确认相关配置信息是否正确,保存配置或者立即安装)
问题处理
问题描述
金仓KFS同步工具立即安装最后阶段提示如下报错:
2024/11/21 15:07:01 INFO : 登录服务器: 192.168.3.132, 登录用户为: flysync 2024/11/21 15:07:01 INFO : 检测JDK环境... 2024/11/21 15:07:01 INFO : JDK运行环境正常 2024/11/21 15:07:01 INFO : 检测RUBY环境... 2024/11/21 15:07:01 INFO : 安装RUBY运行环境, 配置环境信息... 2024/11/21 15:07:03 INFO : 检测RUBY环境... 2024/11/21 15:07:04 INFO : RUBY运行环境正常 2024/11/21 15:07:04 INFO : 检测SBIN环境... 2024/11/21 15:07:04 INFO : SBIN运行环境正常 2024/11/21 15:07:04 INFO : 检测数据库环境... 2024/11/21 15:07:04 INFO : 数据库运行环境正常 2024/11/21 15:07:04 INFO : 登录服务器: 192.168.3.132, 登录用户为: flysync 2024/11/21 15:07:04 INFO : 上传同步包... 2024/11/21 15:07:07 INFO : 上传同步包成功 2024/11/21 15:07:07 INFO : 解压同步包... 2024/11/21 15:07:09 INFO : 解压同步包成功 2024/11/21 15:07:11 INFO : 登录服务器: 192.168.3.132, 登录用户为: flysync 2024/11/21 15:07:11 INFO : 开始上传ini文件 2024/11/21 15:07:12 INFO : 上传ini文件成功 2024/11/21 15:07:12 INFO : 登录服务器: 192.168.3.132, 登录用户为: flysync 2024/11/21 15:07:12 INFO : 开始安装... 请稍等 2024/11/21 15:07:29 ERROR : ...... ERROR >> top132 >> There are multiple entries for top132 in the /etc/hosts file ERROR >> top132 >> There are multiple entries for top132 in the /etc/hosts file WARN >> top132 >> ntpd is not running. It is important that configured hosts have time synchronised. (NtpdRunningCheck) . ##################################################################### # Validation failed ##################################################################### ##################################################################### # Errors for top132 ##################################################################### ERROR >> top132 >> There are multiple entries for top132 in the /etc/hosts file (HostsFileCheck) ERROR >> top132 >> There are multiple entries for top132 in the /etc/hosts file (HostsFileCheck) Clean up the file to have one entry for top132 Clean up the file to have one entry for top132
分析过程
检查/etc/hosts文件,发现127.0.0.1最后多了个top132。ntp不是致错点。
[flysync@top132 tools]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 top132 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.3.130 top130 192.168.3.126 registry.sun.com 192.168.3.132 top132 192.168.19.220 kes 192.168.3.191 db191
解决办法
去掉/etc/hosts文件中127.0.0.1后面的top132,再次进行安装。再次安装步骤如下:
启动节点实例中的同步服务
节点即一个同步程序的实例,一个同步程序的实例里边可以包含多个同步服务。
查看节点服务状态
注意:启动节点实例中的同步服务后会自动拉起源端解析服务和目标端入库服务
指定SCN进行增量同步
断点启动源端解析服务
源端解析服务负责把源端的增量数据解析出来,源端解析的内容会转换成一个统一的中间文件KUFL(KUFL文件存放目录:/home/flysync/replicator/kufl/s_kes_3113),然后目标端会连接源端请求这个KUFL文件,然后把KUFL文件反向解析成sql语句入库
重置源端解析服务
主从都需要操作,只重置一边的话,两端服务的一致性就对不上了,会直接报错
下线
若服务运行状态是正常则先进行下线操作
重置
重置目标端入库服务
主从都需要操作,只重置一边的话,两端服务的一致性就对不上了,会直接报错
操作下拉框中选择重置
断点启动源端解析服务
不同数据库的事件ID输入格式如下:
启动目标端入库服务
目标端入库服务是负责把解析的数据入库到目标端数据库
每次主同步服务进行断点同步,备同步服务都要重置,因为本身自己会记录断点,但是手动指定断点同步相当于把整个服务都重置了,整条链路都要重置。
实时监控
查看实时监控
实时监控界面显示的是默认监控项展示效果
配置告警信息
实时监控界面显示的是默认监控项展示效果,可根据需要进行告警信息配置
邮件设置
用户订阅
同步失败问题处理
目标库表不存在
问题描述
查看控制台发现目标端入库服务运行失败
实时监控界面显示同步失败
分析过程
系统故障信息报错的全部信息还是要去日志里确认,日志位置:安装目录/flysync/flysync-replicator/log下的fsrepsvc.log文件
查看系统故障信息
查看同步日志
查看日志,日志位置:/home/flysync/replicator/flysync/flysync-replicator/log下的fsrepsvc.log文件
查看目标库表是否存在
结论
由于未进行KDTS进行存留数据迁移导致。KFS同步工具是基于增量数据同步的,务必进行存量数据或数据结构创建后再进行KFS同步工具同步增量数据,不能因为数据量小直接用KFS同步工具进行全量数据同步。
先使用KDTS迁移工具进行一次基于SCN的全量迁移,然后再使用KFS同步工具进行增量数据迁移及实时增量同步。也可通过KDTS迁移工具进行数据结构迁移,继而使用KFS同步工具同步数据,该方式存在一个弊端:后边有更新这些操作的话,同步到目标端因为缺少原始数据,就会更新一个空值。如果不通过KDTS迁移存量数据直接用KFS同步工具全量同步会提示目标端对象不存在。
解决办法
KDTS迁移工具进行存留数据迁移
过程详见上述步骤
KFS同步工具中下线服务
主从都需要操作,对应命令:replicator restart offline
KFS同步工具中重置服务
主从都需要操作,只重置一边的话,两端服务的一致性就对不上了,会直接报错
KFS同步工具中服务上线
注意有顺序要求,先上线源端服务、指定scn同步,最后再上线目标端服务
上线源端服务
指定scn同步
fsrepctl -service oracle online -from-event ora:13013087410:13013087410 参数说明: 13013087410即Oracle中current_scn即KDTS存量迁移的scn
上线目标端服务
再次查看监控
同步状态正常。
ERROR: duplicate key value violates unique constraint "sys_c00190936_e680df2b"
问题描述
巡检发现KFS同步日志中有如下报错:
[flysync@top132 ~]$ cd /home/flysync/replicator/flysync/flysync-replicator/log [flysync@top132 log]$ ls -l total 7072 -rw-rw-r-- 1 flysync flysync 0 Nov 21 17:12 discard.index -rw-rw-r-- 1 flysync flysync 53763 Nov 22 13:14 failure_record_file.log -rw-rw-r-- 1 flysync flysync 7057433 Nov 22 13:15 fsrepsvc.log -rw-rw-r-- 1 flysync flysync 107731 Nov 22 13:14 replicator-user.log [flysync@top132 log]$ tail -300f fsrepsvc.log
输出如下:
Caused by: com.kingbase.flysync.replicator.applier.ApplierException: Batch update failed: statement=INSERT INTO "PUBLIC"."AUTH_LOG" ( "ID" , "CREATE_TIME" , "UPDATE_TIME" , "CREATE_USER_ID" , "UPDATE_USER_ID" , "DELETED" , "ROW_STATE" , "USER_NAME" , "TYPE" , "RESULT" , "EXCEPTION" , "IP" , "OS" , "BROWSER" , "REQUEST_URL" , "DESCRIPTION" ) VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) at com.kingbase.flysync.replicator.applier.KingbaseApplier.executePendingBatch(KingbaseApplier.java:1320) at com.kingbase.flysync.replicator.applier.JdbcApplier.apply(JdbcApplier.java:2471) ... 5 more Caused by: java.sql.BatchUpdateException: Batch entry 0 INSERT INTO "PUBLIC"."AUTH_LOG" ( "ID" , "CREATE_TIME" , "UPDATE_TIME" , "CREATE_USER_ID" , "UPDATE_USER_ID" , "DELETED" , "ROW_STATE" , "USER_NAME" , "TYPE" , "RESULT" , "EXCEPTION" , "IP" , "OS" , "BROWSER" , "REQUEST_URL" , "DESCRIPTION" ) VALUES ( 'ff80808192b7015601935194ddb60298' , '2024-11-22 09:55:30.87+08' , '2024-11-22 09:55:30.87+08' , NULL , NULL , '0' , '01' , 'cyqcg' , '1'::numeric ,'1'::numeric , NULL , '192.168.29.52' , 'Windows 10 or Windows Server 2016:10.0' , 'MSEdge:131.0.0.0' , '/auth/j_spring_security_check' , NULL )was aborted: ERROR: duplicate key value violates unique constraint "sys_c00190936_e680df2b" Detail: Key (id)=(ff80808192b7015601935194ddb60298) already exists. Call getNextException to see other errors in the batch. at com.kingbase8.jdbc.BatchResultHandler.handleError(BatchResultHandler.java:159) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2312) at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:533) at com.kingbase8.jdbc.KbStatement.internalExecuteBatch(KbStatement.java:875) at com.kingbase8.jdbc.KbStatement.executeBatch(KbStatement.java:898) at com.kingbase8.jdbc.KbPreparedStatement.executeBatch(KbPreparedStatement.java:1806) at com.kingbase.flysync.replicator.applier.KingbaseApplier.executePendingBatch(KingbaseApplier.java:1223) ... 6 more Caused by: com.kingbase8.util.KSQLException: ERROR: duplicate key value violates unique constraint "sys_c00190936_e680df2b" Detail: Key (id)=(ff80808192b7015601935194ddb60298) already exists. at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2575) at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2311) ... 11 more
违反唯一约束
解决办法
删除目标库中重复记录或者目标端跳过这个报错的同步
方法1:删除目标库中重复记录
[kingbase@kes ~]$ ksql -Usyxk syxk Password for user syxk: Type "help" for help. syxk=> select * from AUTH_LOG where id='ff80808192b7015601935194ddb60298'; id | create_time | update_time | create_user_id | update_user_id | deleted | row_state | user_name | type | result | exc ption | ip | os | browser | request_url | description ----------------------------------+----------------------------+----------------------------+----------------+----------------+---------+-----------+-----------+------+--------+---- ------+---------------+----------------------------------------+------------------+-------------------------------+------------- ff80808192b7015601935194ddb60298 | 2024-11-22 09:55:30.870000 | 2024-11-22 09:55:30.870000 | | | 0 | 01 | cyqcg | 1 | 1 | | 192.168.29.52 | Windows 10 or Windows Server 2016:10.0 | MSEdge:131.0.0.0 | /auth/j_spring_security_check | (1 row) syxk=> delete from AUTH_LOG where id='ff80808192b7015601935194ddb60298'; DELETE 1
方法2:目标端跳过这个报错的同步
忽略:控制台不显示这个报错
作者:董小姐yyds
Oracle 11g OCM,KCP,PGCE,墨天轮技术专家,青学会成员
擅长主流Oracle、MySQL、PG安装部署、故障定位处理、性能优化,
金仓、达梦、openGauss系等各种商用和开源国产数据库
微信:margaretdy
公众号:董小姐yyds
视频号:DongxiaojieYYDS
墨天轮:https://www.modb.pro/u/3121