设计一个MySQL数据库和达梦数据库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较两条两个数据库中,一个数据库有,另一个数据库没有的记录,以id是否存在作为标准,还需要比较两边都有记录的所有数据字段是否都相同,如果有不相同指出这条数据的id,以及不相同数据所在字段的名称和在两个数据库中的值,分批比较时需要考虑所有可能的情况。

下面是一个详细的MySQL与达梦数据库表数据比较的程序流程设计,支持分批处理、异步预取和差异检测:

程序流程图

开始
初始化
获取元数据
初始化参数
获取第一批数据
是否结束?
启动异步线程获取下一批
比较当前批次
记录差异
等待异步线程
更新当前批次
输出结果
结束

详细程序流程

1. 初始化阶段

# 连接数据库
mysql_conn = connect_mysql(user, pass, host, port, db)
dm_conn = connect_dm(user, pass, host, port, db)  # 达梦连接# 获取表元数据
def get_metadata(conn):cursor = conn.cursor()cursor.execute(f"DESCRIBE {table_name}")return [col[0] for col in cursor.fetchall()]  # 字段列表

2. 核心参数

BATCH_SIZE = 2000  # 每批数据量
last_id = 0  # 当前批次起始ID
current_batch = {'mysql': None, 'dm': None}  # 当前批次数据
next_batch = {'mysql': None, 'dm': None}  # 预取的下一批数据
diff_records = []  # 差异结果存储

3. 数据获取函数

def fetch_batch(conn, start_id, batch_size):cursor = conn.cursor()# MySQL语法if isinstance(conn, MySQLConnection):cursor.execute(f"SELECT * FROM {table_name} WHERE id > {start_id} ORDER BY id LIMIT {batch_size}")# 达梦语法elif isinstance(conn, DMConnection):cursor.execute(f"SELECT * FROM (SELECT t.*, ROWNUM as rn FROM "f"(SELECT * FROM {table_name} WHERE id > {start_id} ORDER BY id) t "f"WHERE ROWNUM <= {batch_size}) WHERE rn > 0")return {row[0]: row for row in cursor.fetchall()}  # {id: 完整数据}

4. 异步数据预取

import threadingdef async_fetch_next():global next_batch, last_idnext_last_id = max(max(current_batch['mysql'].keys()) if current_batch['mysql'] else last_id,max(current_batch['dm'].keys()) if current_batch['dm'] else last_id)next_batch = {'mysql': fetch_batch(mysql_conn, next_last_id, BATCH_SIZE),'dm': fetch_batch(dm_conn, next_last_id, BATCH_SIZE)}

5. 数据比较逻辑

def compare_batches(mysql_data, dm_data):# 1. 检测缺失记录mysql_ids = set(mysql_data.keys())dm_ids = set(dm_data.keys())# MySQL有而DM缺失for mid in mysql_ids - dm_ids:diff_records.append({'id': mid, 'type': 'missing_in_dm'})# DM有而MySQL缺失for did in dm_ids - mysql_ids:diff_records.append({'id': did, 'type': 'missing_in_mysql'})# 2. 比较共有记录common_ids = mysql_ids & dm_idsfor cid in common_ids:mysql_row = mysql_data[cid]dm_row = dm_data[cid]for col in metadata:  # 遍历所有字段if col == 'id': continue# 特殊处理浮点数if isinstance(mysql_row[col], float) and isinstance(dm_row[col], float):if abs(mysql_row[col] - dm_row[col]) > 1e-9:diff_records.append({'id': cid,'field': col,'mysql_val': mysql_row[col],'dm_val': dm_row[col],'type': 'value_mismatch'})# 普通类型比较elif mysql_row[col] != dm_row[col]:diff_records.append({'id': cid,'field': col,'mysql_val': mysql_row[col],'dm_val': dm_row[col],'type': 'value_mismatch'})

6. 主循环流程

# 初始化第一批
current_batch = {'mysql': fetch_batch(mysql_conn, last_id, BATCH_SIZE),'dm': fetch_batch(dm_conn, last_id, BATCH_SIZE)
}while current_batch['mysql'] or current_batch['dm']:# 启动异步线程预取下一批fetch_thread = threading.Thread(target=async_fetch_next)fetch_thread.start()# 比较当前批次compare_batches(current_batch['mysql'], current_batch['dm'])# 等待异步完成fetch_thread.join()# 切换到下一批current_batch = next_batchnext_batch = {'mysql': None, 'dm': None}  # 重置# 输出结果
print(f"发现 {len(diff_records)} 处差异")
for diff in diff_records:if diff['type'] == 'missing_in_dm':print(f"ID {diff['id']} 在达梦中缺失")elif diff['type'] == 'missing_in_mysql':print(f"ID {diff['id']} 在MySQL中缺失")else:print(f"ID {diff['id']} 字段 {diff['field']} 不匹配: "f"MySQL={diff['mysql_val']}, DM={diff['dm_val']}")

关键设计要点

  1. 分批处理机制

    • 使用last_id作为游标,按主键顺序获取
    • 每批处理2000条,避免内存溢出
  2. 异步预取优化

    • 当前批次比较时,后台线程获取下一批
    • 利用数据库查询的I/O等待时间
  3. 差异检测全面性

    记录差异
    缺失记录
    字段值不匹配
    MySQL有 DM无
    DM有 MySQL无
    普通类型直接比较
    浮点数精度处理
  4. 特殊类型处理

    • 浮点数采用精度阈值比较(1e-9)
    • 空值处理:None vs NULL
    • 日期类型统一转换为ISO格式字符串比较
  5. 达梦分页语法

    • 使用ROWNUM三层嵌套实现分页
    • 兼容达梦V7/V8版本语法
  6. 断点续传支持

    • 记录最后处理的ID
    • 异常中断后可从中断点继续

异常处理考虑

  1. 连接故障

    try:fetch_batch()
    except DatabaseError as e:reconnect_and_retry()
    
  2. 数据不一致处理

    • 记录不一致的字段路径
    • 支持生成数据修复脚本
  3. 内存控制

    • 每批处理完立即释放引用
    • 差异结果定期写入文件

此设计通过异步预取实现比较与数据加载的并行操作,充分利用I/O等待时间,在保证内存安全的前提下显著提升比较效率。实际部署时可添加进度监控、结果持久化和邮件报警等增强功能。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…

Linux 文本比较与处理工具:comm、uniq、diff、patch、sort 全解析

在类 UNIX 操作系统&#xff0c;特别是 Linux 系统中&#xff0c;命令行提供了一整套强大的文本处理工具&#xff0c;这些工具对于文件差异对比、内容筛选、文本排序以及源代码管理尤为重要。今天&#xff0c;我们将结合真实示例&#xff0c;深入介绍并实战演示 comm、uniq、di…

6月6日day46打卡

通道注意力(SE注意力) 知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力…

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…

大数据(1) 大数据概述

一、大数据时代 1.三次信息化浪潮 二、什么是大数据 1.四个特点 4V&#xff1a;数据量&#xff08;Volume&#xff09;大、数据类型&#xff08;Variety&#xff09;繁多、处理速度&#xff08;Velocity&#xff09;快、价值密度&#xff08;Value&#xff09;低 三、大数据…

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时&#xff0c;Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题&#xff0c;直接复制element官网上的的案例下来也是不得&#xff0c;经过调试和探索&#xff0c;终于找到了解决方案&#xff0c;特此记录分享…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…

开疆智能Ethernet/IP转Modbus网关连接质量流量计配置案例

首先设置modbus从站的485参数&#xff0c;确保网关和从站的485参数保持一致。 设置完成后打开网关配置软件并新建项目 先设置网关在Ethernet一侧的IP地址以及数据转换长度。 设置网关的Modbus参数如波特率9600无校验8数据位&#xff08;无校验选8&#xff0c;有校验选9&#xf…

多智能体MPE环境遇到的若干问题

最近学习MADDPG算法&#xff0c;用MPE环境来测试算法性能。于是便下载了pettingzoo包&#xff0c;运行了simple_tag_v3环境&#xff0c;此环境中有猎人、逃亡者和障碍物。 问题1: MPE中的simple_tag_v3环境&#xff0c;在渲染时看似移动的问题 由于相机视角跟随导致的视觉错觉…

[特殊字符] FFmpeg 学习笔记

一、FFmpeg 简介 FFmpeg 是一个开源跨平台的视频和音频处理工具&#xff0c;支持录制、转换、流处理等功能。 官网&#xff1a;https://ffmpeg.org 安装命令&#xff08;macOS&#xff09;&#xff1a; brew install ffmpeg二、基本命令结构 ffmpeg -i 输入文件 [参数] 输出…

leetcode Top100 238. 除自身以外数组的乘积|数组系列

题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 238. 除自身以外数组的乘积|数组系列 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 …

【Liunx专栏_6】Linux线程概念与控制

目录 1、线程是什么&#xff1f;通过一个图来理解……2、Linux进程和线程&#xff1f;2.1、之间的关系和区别2.2、线程的优缺点&#xff1f; 3、线程的创建3.1、POSIX线程库3.2、创建线程3.3、PS查看运行的线程 4、线程的终止5、线程的等待6、线程分离7、线程封装 1、线程是什么…

「Java基本语法」标识符、关键字与常量

知识点解析 1&#xff0e;标识符&#xff08;Identifiers&#xff09;&#xff1a;用于命名类、方法、变量等。 标识符命名规则&#xff1a; 标识符由字母&#xff08;A-Z&#xff0c;a-z&#xff09;、数字&#xff08;0-9&#xff09;、下划线“_”或美元符号“$”组成。标…

Nginx Stream 层连接数限流实战ngx_stream_limit_conn_module

1.为什么需要连接数限流&#xff1f; 数据库/Redis/MQ 连接耗资源&#xff1a;恶意脚本或误配可能瞬间占满连接池&#xff0c;拖垮后端。防御慢速攻击&#xff1a;层叠式限速&#xff08;连接数&#xff0b;带宽&#xff09;可阻挡「Slow Loris」之类的 TCP 低速洪水。公平接入…

LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现

LLMs之Structured Output&#xff1a;vLLM 结构化输出指南—从约束生成到自动解析与高效实现 导读&#xff1a;随着大语言模型&#xff08;LLM&#xff09;在各类任务中的广泛应用&#xff0c;如何使其输出具备可控性、结构化与可解析性&#xff0c;成为实际部署中的关键问题。…

32 C 语言字符处理函数详解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace

1 isalnum() 函数 1.1 函数原型 #include <ctype.h>int isalnum(int c); 1.2 功能说明 isalnum() 函数用于检查传入的整数参数是否为 ASCII 编码的字母或数字字符&#xff08;A - Z、a - z、0 - 9&#xff0c;对应 ASCII 值 65 - 90、97 - 122、48 - 57&#xff09;。…

在网络排错中,经常会用到的操作命令和其作用

在网络排错中&#xff0c;经常会用到的操作命令和其作用 网络排错是确保网络连接正常运行的重要环节&#xff0c;通过使用一系列工具和命令&#xff0c;可以有效诊断和解决网络问题。以下是常用的网络排错命令及其作用&#xff1a; 1.ping ping 是一个用于测试主机之间连通性…

C++中友元(friend)高级应用和使用示例

下面列出几个 高级友元应用场景 与典型设计模式&#xff0c;并配以示例&#xff0c;帮助大家在实际项目中灵活运用 friend 机制。 1. ADL 友元注入&#xff08;“注入式友元”&#xff09; 场景&#xff1a;为某个类型定义非成员操作符&#xff08;如算术、流插入等&#xff0…

TCP相关问题 第一篇

TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close&#xff0c;发送FIN时进入LAST_ACK状态&#xff0c;但未收到主动连接方的ack确认&#xff0c;需要被动连接方重新发送一个FIN&#xff0c;而为什么是2MSL&#xff0c;一般认为丢失ack在…

STM32启动文件学习(startup_stm32f40xx.s)

原代码 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40xx.s ;* Author : MCD Application Team ;* version : V1.8.0 ;* date : 09-November-2016 ;* Desc…