中电金信:技术实践|异构数据库迁移之“痛”

news2024/11/24 3:58:28

导语:

近几年,国产化创新潮流席卷全国,异构数据库迁移成了不少同行、客户争相讨论的话题,大家或争论方案、或求解答疑、或讨论产品,总之问题林林总总,涉及的面还很多,笔者也在近期的几个项目中做了几个异构数据库迁移的项目,项目过后感觉大家最感兴趣的还是异构数据库迁移有哪些注意事项,所以闲暇期间把自己做的一些项目中遇到的问题总结下来,供大家参考借鉴。

一、字符集转换问题

目前做字符集转换的工具不少,有操作系统自带的,也有各种脚本语言、高级语言自带的函数库,然而在进行跨字符集转换过程中其实有很多陷阱。通常,常用的字符集转换多数是GBK、GB2312、CP936、UTF8、UNICODE、LATIN等常用字符集之间的互相转换。因此,遇到不同字符集迁移的项目,建议还是要以实际项目情况出发合理选择方案。以下是笔者在处理不同字符集转换的几点建议:

■中文字段值域范围问题

中文不同的字符集按其编码规范占用的字节数并不一致,如GBK字符集下中文一个汉字占2字节,而UTF8字符集为3字节(少数占用4个字节)。此种情况下需要在模型设计过程中做好值域范围的调整,防止数据加工时报错。

■中文乱码问题

中文乱码是大家经常碰到的问题,多数是因为不同字符集覆盖范围不同,不同字符集在做转换时,因源和目标映射不对称,转码程序通常采用舍去不能转换的字符,或将其转换为预先指定的字符,此种情况下导致转换后的部分结果是乱码。以下为常用字符集范围及编码规范:

GB2312字符集   

作用:国家简体中文字符集,兼容ASCII

位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,涵盖所有常用汉字

范围:高字节从A1到F7, 低字节从A1到FE

BIG5字符集

作用:统一繁体字编码

位数:使用2个字节表示,总计13053个汉字

范围:高字节从A1到F9,低字节从40到7E,A1到FE

GBK字符集

作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312

位数:使用2个字节表示,可表示21886个字符

范围:高字节从81到FE,低字节从40到FE (7F 除外)

GB18030字符集
作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK

位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字

范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39

UNICODE字符集
作用:为世界650种语言进行统一编码,兼容ISO-8859-1

位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32

范围:UNICODE中文字符范围是[U+4E00-U+9FBF],常用范围是[U+4E00-U+9FA5]

▲上下滑动查看

■ 转码处理策略

转码处理策略主要是指转码过程中对于异常字符的处理方式,通常在指定完目标字符集后对于异常字符的处理方式有3种:

🔹报错退出

🔹不报错,将不识别的舍去(对内容有影响)

🔹不报错,将不识别的指定为特殊字符

通常会将不识别的内容转换为?、空格、“ ”或其他指定字符。

具体采用哪种处理策略笔者建议按实际情况出发合理即可。

■ 字符集选择问题

字符集选择问题主要是指知道源字符集后,向目标字符集转换时,源字符集该如何选择。假设我们已经知道原来用的是GBK,那么具体做转换时我们应该采用BIG5、CP936、GB2312、GB18030哪种进行转换比较合适呢?此时建议选择转码处理策略中可以最大力度保留源内容的方式为主。

二、隐式转换问题

异构数据库迁移、数据类型转换工作主要涉及“精度”“效率”以及“兼容性”等方面。部分数据同步软件确实具备自动转换的功能,但是仅对于管理规范的数据库适用,对于不规范的数据库在进行转换时则需要耗费较大精力,下面举几个典型的例子说明这个问题:

■ 以Teradata到GaussDB(DWS)的同步为例

整型的值固然可以通过number类型(不设定精度和小数位)存放到源端DWS数据库中,然而此时会遇到一个问题,DWS中应该用啥字段对应呢?安全起见,为了避免精度丢失,肯定是选择numeric类型,但是选择numeric类型会存在性能损失。这时,选择Bigint等类型似乎更为合适,但这又会牵涉到下游应用是否报错的问题。

■ 再以Teradata到DWS的日常加工为例

这里我们要注意中间过程的计算,防止精度溢出,导致数值不一致的情况出现。如在DWS库下目标字段为decimal(38,5)中间加工结果的精度和目标字段精度不一致,通常需要在计算过程种转换精度保证最后数据的一致性。

不处理时精度保留10位

SELECT  1.00000/2.13
1.00000/2.13
-------------------
0.4694835681

处理后结果数据符合需求

SELECT  cast(1.00000/2.13 as decimal(18,5)
1.00000/2.13
-------------------
0.46948

三、同名函数的困惑

日常迁移过程中,客户通常都会要求我们:要原逻辑迁移,不能修改脚本逻辑。但是经常会出现一种情况,明明我们所用的函数都一致,结果却大相径庭。这是为什么呢?其实是因为异构数据库函数同名不同意造成的。下面我们举例说明:

Teradata数据库函数有length函数,GaussDB(DWS)也有length,但是在日常使用过程中,需要特别注意的一点是在TD Latin字符集下length函数中每个汉字是2个字节的长度,而在DWS UTF8字符集下length函数中每个汉字是1 个字节的长度。

源端:TD(Latin)

SELECT length(‘中国’);

length
----------------------------------------
4

接下来看GaussDB(DWS) ‘UTF8’字符集

SELECT length(‘中国’);

length
----------------------------------------
2

因此,在异构数据库日常开发过程中,一定要擦亮眼睛,即便是同名函数也要仔细查看手册。

四、特殊字符问题  

对于数据库异构同步而言,一些特殊的字符诸如:单引号、双引号、换行、斜杠、反斜杠等等也是一个困扰项,这一点在数据全量同步阶段尤其明显。建议注意以下几点:

🔹避免字段中含有分隔符,分隔符最好用不可见控制符。如:0x1b、0x01、0x03等或双字节或多字节分隔符。

🔹卸载前对于特殊字符做好清洗工作,如回车换行,避免卸载下来的文件有折行现象。

🔹对于转义字符建议采用包围符进行处理。

五、数据库特性差异

不同数据库对于一些特殊的处理,它们的处理方式也是不同的,遇到此类问题需要特别注意。下图为其他数据库迁移GaussDB(DWS)时需要注意的事项。

图片

六、数据同步问题

对迁移项目来说,数据同步是其中非常重要的一个环节,尤其是全量数据的铺底工作。通常大家关注的重点是是否有同步工具,笔者就此问题也深有感触。

通常数据同步有以下3种形式:

■ 同步工具解决

当前流行的同步工具多数是封装JDBC的通用接口采用多进程进行处理,此种场景对于小数据量的表还值得一试,但是当我们的数据量一旦达到TB级,且客户预留的同步窗口比较少时就会令人挠头了。此种方式不仅会消耗数据库资源,而且效率还很慢,同时还要避开业务繁忙期。

■ 离线文件抽取加载模式

也有人建议采用离线卸载文件的方式进行处理,在没有同步工具处理异构数据迁移时,这种方法不失为一种解决方案。但是从源端卸载落地成文件,然后再进行清洗转换,再入库多次的IO也是需要花费不少精力去应对各种问题的,笔者暂且认为这是一种备用方案吧。

■ 端到端批量模式

技术能力可行的情况下建议采用封装源和目标端的批量卸载和加载模式,通过管道方式减少中间落地,进行端到端的数据同步。当然这种方式需要有较高的技术能力进行支撑。

七、一致性校验问题

一致性校验问题是迁移环节实现数据一致性的重要保障,能够避免迁移过程中出现数据不一致的情况。在迁移过程中,我们首先要保证的就是数据的完整性、准确性和一致性。

那么如何才能做到呢?因为一致性校验是个十分复杂的问题,因此需要结合实际业务场景分别设计和校验。在次提出个人的几点建议供大家参考:

■ 完整性校验

建议通过记录数+ERR表监控做到记录不丢。ERR表会对关系型数据库加载中非法格式的数据或不完整的记录进行记录,在日常迁移过程中,我们通过以上监控基本就能保证数据的完整性。

■ 准确性校验

所谓准确性校验主要是验证数据在加工逻辑上是否正确。对于此类校验,建议通过关键汇总字段如KPI字段做汇总比对,以此来保障数据的加工逻辑正确。同时监控重要维度的汇总数据。

■ 一致性校验

一致性校验是保障数据准确性的进一步校验,它不仅要求数值型一致,对于字符型数据内容也要求一致。对于此类问题,常用的解决办法是通过MD5函数或Checksum函数分别对字段进行处理转换为数值然后比对两端。通常这种方式会比较消耗数据库资源,建议视情况而定。同时如果是字符集有差异的话,对于长字符串内容通常校验难度更大(有些情况下,两端长度不一致)。

以上校验逻辑多数为事后校验,建议采用自动化程序比对通知,以此来减少后期二次处理的问题。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/754553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java正则表达式简介及Jar包

Java提供了java.util.regex包,用于与正则表达式进行模式匹配。 Java正则表达式与Perl编程语言非常相似,非常容易学习。 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在…

低代码技术:提高效率降低成本的全新选择

一、前言 企业想要独立的应用程序,开发者在寻求更快速、更高效、更灵活的开发方法,以适应快速变化的市场需求。在这个背景下,低代码技术以提高效率降低成本的方式走进人们视野,成为了一种全新的应用程序开发方式。 二、相比传统的…

刚体三维运动学【旋转矩阵】【欧拉角】【四元素】

一些概念 轴角法、旋转矩阵、欧拉角、四元数主要用于:向量的旋转、坐标系之间的转换、角位移的计算、方位的平滑插值计算。坐标系的旋转一共有三种表示方法:旋转矩阵、欧拉角和四元数。一般指地面系(世界系)和机体系之间的旋转关…

UE4.27 编译及打包HTML5相关资料

UE4.27 编译及打包HTML5相关资料 UE官方资料 https://docs.unrealengine.com/4.27/zh-CN/SharingAndReleasing/HTML5/GettingStarted/ B站视频资料 UE4.27可以打包HTML5啦 Github 中文文档 https://github.com/Xi3Chen/UE4.27PackingH5DDoc emsdk 交叉编译环境安装 Emscripte…

零售数字化转型如何破局?这篇文章全说清了!

“数字化转型”,一个老生常谈的话题。自19世纪互联网崭露头角,亚马逊和eBay等电商平台崛起,引领电子商务的发展。传统零售业开始意识到在线渠道的重要性,并纷纷推出自己的电子商务网站,从自此进入数字化转型的赛道当中…

【UniApp开发小程序】请求包创建+登录功能实现

文章目录 请求包创建创建文件夹请求工具request.js 登录功能实现请求方法页面涉及知识点错误提示前端校验设置token到客户端缓存中路由跳转 请求包创建 小程序的数据需要向后端发请求进行获取,为了简化后续的开发,需要创建一个包专门存放所有发请求的js…

Kong 自定义插件安装和调试

文件格式 官方文档 ├── kong-plugin-mepjwt-0.1.0-1.all.rock # luarocks安装依赖 luarocks pack生成的文件 ├── kong-plugin-mepjwt-0.1.0-1.rockspec # luarocks的安装依赖 └── mepjwt├── handler.lua # 主要处理业务逻辑的文件├── jwt_parser.lua # 依…

Android Framework岗位面试真题分享

Handler是Android中的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们在主线程创建一个队列,队列中的消息顺序就是我们设置的延迟的时间,如果你想在Android中实现一个队列的功能,不妨第一时…

【量化课程】02_1.宏观经济学基础概念

2.1_宏观经济学基础概念 文章目录 2.1_宏观经济学基础概念1. 宏观经济简单背景1.1 微观经济学时期1.2 宏观经济学开端1.3 宏观经济学研究的问题1.4 宏观经济与理财的联系 2. 宏观经济分析及关键指标2.1 教材中的宏观经济分析框架和指标2.1.1 国内生产总值GDP2.1.2 边际消费倾向…

vcruntime140.dll重新安装方法,vcruntime140.dll修复教程

vcruntime140.dll是Microsoft Visual C Redistributable的一部分,它是Windows操作系统上非常重要的一个动态链接库文件。这个文件包含了一些运行时库函数,用于支持运行在Windows上使用了Microsoft Visual C开发的软件。如果电脑系统中缺失vcruntime140.d…

【Unity面试篇】Unity 面试题总结甄选 |Unity性能优化 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新…

SOEM_1(笔记,从别的博客文章学的笔记)

目录介绍: doc:帮助文档、 osal:主要是用于符合OSADL和实时进程创建。也就是说:发送EtherCAT数据包不能抖动太大,如果直接使用linux提供的原生线程,可能实时性无法满足。需要对Linux内核打上实时补丁&…

高等数学❤️第一章~第二节~极限❤️极限的概念与性质~数列极限详解

【精讲】高等数学中的数列极限解析 博主:命运之光的主页 专栏:高等数学 目录 导言 一、数列极限的定义 二、数列极限的判定方法 三、数列极限的性质 必需记忆知识点 例题(用于熟悉数列极限) 例题1 例题2 例题3 结论 导言…

【QQ好友列表展示-设置HeaderView Objective-C语言】

一、好,看一下,刚才我们这个btnGroupTitle的frame为什么是0 现在我们首先知道,当你程序一运行起来以后,你这里的self,就是 当你程序运行起来以后,这个headerView 的frame,默认应该是0的 就是我们看到的效果,它应该都是0 的 一开始都是0 的 那么其实也就是说,是这样…

Pruning 系列 (十)Pruning VGG 实战

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117流程 一、 VGG 模型代码 # -*- coding: utf-8 -*- import torch import torch.nn as nndefault_cfg = {11: [64, M, 128, M, 256, 256, M, 512, 512, M, 512, 512],13: [64, 64, M, 128, 128, M, 256, 256, M, 512, 512, M, …

认识企业级定时任务Quartz

文章目录 前言一、实现一个Quartz的小案例1.创建一个maven项目2.添加Quartz依赖3.创建一个配置文件配置Quartz信息4.创建一个Job类继承Job接口5.编写主方法逻辑进行测试6.测试运行结果 二、Job和JobDetail总结 前言 目前仍有大部分企业仍在使用Quartz这种定时任务框架&#xf…

【分布式应用】ceph分布式存储

目录 一、存储基础1.1单机存储设备1.2单机存储的问题1.3分布式存储的类型 二、Ceph简介2.1Ceph 优势2.2Ceph 架构2.3Ceph核心组件OSD(Object Storage Daemon,守护进程 ceph-osd)PG(Placement Group 归置组)PoolMonitor…

【运维】第03讲(上):Nginx 负载均衡常见架构及问题解析

实际上 Nginx 除了承担代理网关角色外还会应用于 7 层应用上的负载均衡,本课时重点讲解 Nginx 的负载均衡应用架构,及最常见的问题。 学前提示 Nginx 作为负载均衡是基于代理模式的基础之上,所以在学习本课时前,你需要对 Nginx …

Codeforces Round 884 (Div. 1 + Div. 2)(视频讲解A--D)

[TOC](Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09;) 视频链接&#xff1a;Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09; A Subtraction Game 1、 板书&#xff1a; 2、代码 #include<bits/stdc.h> #…

网络协议与攻击模拟-19-FTP协议

FTP 协议 1、了解 FTP 协议 2、使用在 Windows 操作系统上使用 serv - U 软件搭建 FTP 服务器 3、分析 FTP 流量 一、 FTP 协议 1、概念 FTP &#xff08;文件传输协议&#xff09;&#xff0c;由两部分组成&#xff1a;客户端&#xff0f;服务器 C / S 架构&#xff0c;应…