当前位置: 首页 > news >正文

数据增量推送技术方案文档

数据增量推送技术方案文档

1. 项目背景

  • 需求:将本地 MySQL 数据库中的烟感数据(三张核心表)增量推送到远程 MySQL 数据库。
  • 环境:本地 MySQL 8.0.42,远程 MySQL 环境相同。
  • 策略:基于 create_time 时间戳的增量提取,采用 REPLACE INTO 模式保证数据幂等性(防重复),分批次推送防止数据库过载。

2. 数据库信息对照表

项目 本地数据库 (源) 远程数据库 (目标)
IP地址 192.168.. 219...*
端口 1000* 30
数据库名 bfm yangan_*
用户名 ro* yangan*
同步表名 a*_device, a*_event_inst, a*_unit 同左

3. 核心脚本逻辑 (push_yangan_data.sh)

脚本采用了 mysqldump 提取数据配合 mysql 客户端导入。

关键技术亮点:

  • 断点续传:记录最后一次成功推送的 create_time.txt 文件,下次运行自动衔接。
  • 特殊字符处理:通过 export MYSQL_PWD 环境变量处理含 #@! 等符号的强密码,规避 Shell 转义错误。
  • 分批控制:设置 BATCH_SIZE=500sleep,确保百万级数据推送时不会导致数据库连接堆积或锁表。
# 核心同步指令示例
#!/bin/bash# ========================================================
# 1. 基础配置
# ========================================================
LOCAL_BIN="/usr/local/mysql/bin/mysql"
LOCAL_SOCK="/mnt/sdc/mysql/mysql.sock"
LOCAL_USER="*****"
LOCAL_PWD='********'
LOCAL_DB="***"REMOTE_HOST="************"
REMOTE_PORT="******"
REMOTE_USER="*****"
REMOTE_PWD='*******'
REMOTE_DB="******"# 运行参数
LOG_FILE="/var/log/yangan_push.log"
LAST_TIME_FILE="/var/log/yangan_last_sync_time.txt"
BATCH_SIZE=500  # INSERT模式建议每批500条,防止SQL语句超长或卡死
SLEEP_TIME=1    # 批次间停顿TABLES=("*_device" "*_event_inst" "*_unit")# ========================================================
# 2. 初始检查
# ========================================================
if [ ! -f "$LAST_TIME_FILE" ]; thenecho "2026-01-26 00:00:00" > "$LAST_TIME_FILE"
fiLAST_TIME=$(cat "$LAST_TIME_FILE")
START_RUN_TIME=$(date "+%Y-%m-%d %H:%M:%S")echo "--------------------------------------------------" >> $LOG_FILE
echo "[$START_RUN_TIME] 开始同步任务 (INSERT模式)" >> $LOG_FILE# 导出远程密码变量,避免命令行显示密码和特殊字符报错
export MYSQL_PWD=$REMOTE_PWD# ========================================================
# 3. 核心同步循环
# ========================================================
for TABLE in "${TABLES[@]}"; doecho "[$(date "+%H:%M:%S")] 正在同步表: $TABLE" >> $LOG_FILE# 获取待同步的总数TOTAL_COUNT=$($LOCAL_BIN -u$LOCAL_USER -p"$LOCAL_PWD" -S $LOCAL_SOCK $LOCAL_DB -N -s -e "SELECT COUNT(*) FROM $TABLE WHERE create_time > '$LAST_TIME';")echo "表 $TABLE 待推送增量: $TOTAL_COUNT 条" >> $LOG_FILEif [ "$TOTAL_COUNT" -eq 0 ]; thencontinuefiOFFSET=0while [ $OFFSET -lt $TOTAL_COUNT ]; do# 生成带 REPLACE INTO 的增量数据 SQL 脚本# --skip-comments: 不输出注释# --no-create-info: 不输出建表语句# --replace: 使用 REPLACE INTO 代替 INSERT,防止主键冲突# --extended-insert: 批量插入模式,提高效率# --hex-blob: 处理二进制字段(如果有)TMP_SQL="/tmp/${TABLE}_push.sql"/usr/local/mysql/bin/mysqldump -u$LOCAL_USER -p"$LOCAL_PWD" -S $LOCAL_SOCK \$LOCAL_DB $TABLE \--no-create-info \--replace \--skip-comments \--extended-insert \--hex-blob \--where="create_time > '$LAST_TIME' ORDER BY create_time ASC LIMIT $OFFSET, $BATCH_SIZE" > "$TMP_SQL"# 推送到远程政数局数据库$LOCAL_BIN -h$REMOTE_HOST -P$REMOTE_PORT -u$REMOTE_USER $REMOTE_DB < "$TMP_SQL" 2>>$LOG_FILEif [ $? -eq 0 ]; thenecho "进度: $TABLE 已推送前 $((OFFSET + BATCH_SIZE > TOTAL_COUNT ? TOTAL_COUNT : OFFSET + BATCH_SIZE)) 条" >> $LOG_FILEelseecho "错误: 表 $TABLE 在 OFFSET $OFFSET 处推送失败" >> $LOG_FILEfiOFFSET=$((OFFSET + BATCH_SIZE))rm -f "$TMP_SQL"sleep $SLEEP_TIMEdone
done# 更新最后同步时间点
echo "$START_RUN_TIME" > "$LAST_TIME_FILE"
echo "[$START_RUN_TIME] 同步任务结束。" >> $LOG_FILE

4. 部署与维护手册

A. 初始环境准备

  1. 创建路径mkdir -p /root/scripts
  2. 建立日志文件
  • touch /var/log/yangan_push.log(记录详细推送进度)
  • touch /var/log/yangan_last_sync_time.txt(存储同步时间戳)
  1. 设定起始时间
  • echo "2026-01-26 00:00:00" > /var/log/yangan_last_sync_time.txt

B. 定时任务配置

通过 crontab -e 配置每日凌晨自动运行:

# 每天凌晨 01:30 执行增量推送,并将系统级报错记录到专门日志中
30 01 * * * /bin/bash /root/scripts/push_yangan_data.sh >> /var/log/yangan_cron_error.log 2>&1

C. 日志巡检指令

  • 检查昨晚同步了多少条tail -n 50 /var/log/yangan_push.log
  • 确认当前同步到的时间点cat /var/log/yangan_last_sync_time.txt
  • 检查异常报错cat /var/log/yangan_cron_error.log

5. 常见问题 (FAQ)

  • Q: 为什么日志里有 unknown variable 'local-infile=1'

  • A: 这是因为本地 my.cnf 配置了客户端参数,而 mysqldump 工具不识别该参数。此报错不影响数据导出和推送结果,可直接忽略。

  • Q: 如果某天服务器宕机,数据会丢吗?

  • A: 不会。脚本会读取 last_sync_time.txt。只要该文件记录的是宕机前的时间,下次启动后脚本会自动补推从该时间点至今的所有数据。

  • Q: 为什么有些表在日志里没有出现?

  • A: 说明该表在上次同步到本次运行之间没有 create_time 的新增记录,脚本会自动跳过无增量的表。


文档说明结束

http://www.jsqmd.com/news/334209/

相关文章:

  • 【VMware】VMware 安装kali 相关问题
  • <span class=“js_title_inner“>Orval 中存在严重的代码注入漏洞,存在供应链安全风险</span>
  • 【开发工具】Windows 11 安装 Miniforge,配置国内源
  • RocketMQ Hook 实现
  • 2026春节送健康才是真心意!精选8大高端滋补礼盒品牌推荐,看这篇就够 - 资讯焦点
  • 【VMware】VMware安装Ubuntu虚拟机教程,图文详细
  • AI玩具市场2026全景报告:351 亿赛道爆发,三大人群需求定义未来
  • 出题记录
  • 智能体来了(西南总部):Agent失序下的AI Agent指挥官与AI调度官
  • [todo]try catch no | result yes
  • <span class=“js_title_inner“>城市发展中心:2026年英国城市经济展望</span>
  • 黄金暴跌启示录:是牛回头还是拐点将至?
  • 阿里云携手模思智能构建一站式多模态数据处理平台
  • 票号
  • 智能装备工厂研发部门10个SolidWorks画图人员如何共享一套服务器的资源和算力
  • 网安毕设新颖的课题建议
  • 人才库与招聘绩效联动:3 步搞定招聘渠道效果精准分析
  • YOLO26原创自研 | 自研独家创新BSAM注意力 ,基于CBAM升级
  • 相场法模拟水力压裂 一共6个案例,附带参考文献 COMSOL 相场法与水力压裂 案例一:单一裂...
  • 墓碑密码 FWT 复习
  • STL 大学习
  • 从 0 到 1 搭建战略性人才库:长期人才储备的关键路径
  • 上市公司“并购”毫米波雷达标的,未来四年营收12亿元对赌
  • 2026 贵阳养老优选指南 贵阳市云岩区康祥养老院 —— 让银龄生活有尊严更有温度 - 深度智识库
  • AVIF 转 JPG 的真实需求:不是格式落后,而是兼容更重要
  • 哪个执业医师培训机构性价比高?这家最值得推荐 - 医考机构品牌测评专家
  • Windows 11、10 电脑关机故障的原因找到了,微软已经开始准备修复补丁
  • YOLO26优化:Transformer创新 | 卷积化自注意力,共享大卷积核和动态卷积核,引入Flash Attention高效涨点| ICCV2025
  • 我会容斥
  • 2026年长春/宜昌/芜湖/义乌/昆山植发机构推荐榜 - 极欧测评