问题描述
巡检KFS反向链路时发现一条反向链路宕掉,具体表现为:MySQL5.7向KES中插入了一个不可见字符导致编码为UTF8的MySQL库中同步插入数据报错:Incorrect string value: '\xF0\xAC\xBi\x96'for column。

分析过程
查看同步服务运行状态
fsrepctl services 目标端显示offline:error
查看报错事务的解析


查看源和目标对象中列类型
源端和目标端表中对应的列长度一样。
源端

目标端

查看源端中字符长度
正常字符长度应该是2,而报错的字符长度是3,推测是一个不可见字符导致



查看目标端字符集
-- 一键检查所有关键编码设置
SELECT
@@character_set_server AS '服务器字符集',
@@collation_server AS '服务器排序规则',
@@character_set_database AS '数据库字符集',
@@collation_database AS '数据库排序规则',
@@character_set_client AS '客户端字符集',
@@character_set_connection AS '连接字符集',
@@character_set_results AS '返回字符集';
--查看报错表的字符集
show create table t_cs_interview_personnel_info;分别输出如下:



解决办法
目标端中更改表字符集编码
-- 查看表当前字符集
SHOW CREATE TABLE 表名;
-- 查看所有列的字符集详情
SHOW FULL COLUMNS FROM 表名;
-- 修改表字符集
ALTER TABLE 表名 CHANGE 列名 数据类型 SET utf8mb4;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 确认表结构
SHOW CREATE TABLE 表名;
-- 确认数据正常(抽查包含中文/特殊字符的字段)
SELECT 列名 FROM 表名 LIMIT 10;KEF同步服务配置文件中增加字符集配置
- 法一:适用于不确定安装目录位置
- 法二:适用于明确知道安装目录位置
法一:static-mysql_target.properties文件中urlOptions选项追加参数后重启同步服务
1、更改static-mysql_target.properties文件中urlOptions后追加参数&useUnicode=true&characterEncoding=UTF-8
cd /data/kingbase/kfs/flykn/kfsrep/flysync/flysyno-replicator/conf
vim static-mysql_target.properties
2、重启同步服务:replicator restart

法二:flysync.ini文件中增加参数进行更新后重启同步服务
--查看static-mysql_source.properties 中 urlOptions 参数值
[flymk@localhost]cd /data/kingbase/kfs/flykn/kfsrep/flysync/flysyno-replicator/conf
[flymk@localhost conf]$ cat static-mysql_source.properties | grep urlOptions
replicator.datasource.global.connectionSpec.urlOptions=noPrepStmtCache=true&allowPublicKeyRetrieval=true
--flysync.ini中增肌参数
property=noPrepStmtCache=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8
--停止同步服务
replicator stop
--更新 必须是在安装目录下
cd /data/kingbase/kfs/flymk/KingbaseFlySync-V002R002C004PS003-replicator/tools
fspm update
--启动同步服务
replicator start
--查看同步服务并观察同步情况
fsrepctl services注意:
修改urlOptions这种方案主要是处理数据库系统字符编码是utf8但是表字符编码是utf8mb4这种场景。因为默认情况下jdbc会根据数据默认系统字符编码插数据,系统编码是utf8的话,jdbc插特殊字符就识别不了,所以要指定。如果目标端本身就是MB4编码或者改成MB4之后,在mysql目标端的urlOptions后面追加一个&useUnicode=true&characterEncoding=UTF-8(static中查参数,然后复制到ini中配置,记得加property=)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




