网站首页 > 技术文章 正文
前言
随着MySQL技术发展,通过垂直或水平拆分能够支持相当大的数据量,目前很多公司把SQLServer、Oracledb或其他数据库迁移到MySQL上,迁移数据量很大(数据库已经水平拆分成很多Shard),如何比较所有数据的一致性呢?
问题剖析
- 数据库迁移步骤:双写DB -> 数据一致性保证 -> 旧DB读流量逐步迁移到新DB -> 单写新DB -> 下线旧DB。迁移过程中问题很多,本章只给出数据已经同步到Hive,怎么校验Hive数据的一致性,线上一致性会在其他章节中给出。
- 问题是:迁移地表有成百上千张,如何比较每张表的每个字段的一致性呢?
实现思路
- 思路:通过Job生成比较脚本,分发到调度系统,每天调度比较脚本,将比较不一致的结果存放到统计表中,通过报表平台将不一致日报发出,跟踪日报排查不一致问题,将问题反馈给大数据平台,让大数据平台解决不一致。
- 统计表按天分区再按表分区d='2021-01-01',h=表名。
- 大数据平台一致性校验可以校验出生产表的不一致和Hive同步的一致,前者需要开发排查解决,后者需要大数据平台解决。
- 表主键是orderid。
- 表主键不是orderid而是联合主键。
- UDF函数将所有业务字段拼接成string用于比较。
常见问题
- 时间日期类型Date、DateTime、Timestamp字段,SQL Server毫秒精度只到0,3,7结尾和MySQL不一致,需要对该类型截取处理,特别是业务字段是这样的类型是按需截取。
- Float,Double字段存在精度问题,如果两边不一致需要通过CAST函数转换后再比较。
- 对于带小数的字段,因SQL Server和MySQL报错的小数位不同,需要截取掉小数末尾的0后再比较。
- SQL Server的xml类型和MySQL的text类型存储了xml数据时前会将xml头(<?xml version="1.0"?>)去掉,要单独处理。
- 因两边数据同步时差,应排除掉当天的增量数据。
- 特殊Case处理:忽略非业务字段,非严格字段导致截取的字段。
附UDF函数
import org.apache.hadoop.hive.ql.exec.UDF;
/**
* @Description:全量字段拼接
*/
public class JointFieldsUdf extends UDF {
public String evaluate(String... fields) {
StringBuffer sb = new StringBuffer();
for (String item : fields) {
if (item != null) {
//去掉含小数点数字末尾的零
if (item.indexOf(".") > -1) {
sb.append(item.trim().replaceAll("(0)+#34;, "").replaceAll("\\.", "")).append("_");
} else {
sb.append(item.trim()).append("_");
}
} else {
sb.append(item).append("_");
}
}
return sb.toString().substring(0, sb.length() - 1);
}
}
pom
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.2.0</version>
</dependency>
好经验分享给你,关注我学知识!
猜你喜欢
- 2025-09-02 Java 中 java.util.Date 与 java.sql.Date 有什么区别?
- 2025-09-02 主流CDC工具_cd软件是做什么的
- 2024-11-10 软件测试员12小时惊魂记:数据库迁移出大事故,如何测试?
- 2024-11-10 利用Sharding-JDBC解决数据库读写分离查询延时问题
- 2024-11-10 OpenJDK 17 中的 Shenandoah:亚毫秒级 GC 停顿「译」
- 2024-11-10 毫秒级从百亿大表任意维度筛选数据,是怎么做到的……
你 发表评论:
欢迎- 最近发表
-
- Druid 1.2.4 版本发布,增强对 JDK 8 的支持
- Python设计模式 第 1 章 Python 设计模式概述
- RAD Studio 、Delphi或C++Builder设计代码编译上线缩短开发时间
- Hive如何比较两张表所有字段的一致性
- Java 中 java.util.Date 与 java.sql.Date 有什么区别?
- 主流CDC工具_cd软件是做什么的
- 19.提取HFM数据进数据库_怎么提取数据库的信息
- 将Spring Boot应用部署到 Azure_springboot部署到windows
- 这样优化Spring Boot,启动速度快到飞起
- 什么是便携式应用程序,为什么它很重要?
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)