千家信息网

shell脚本实现数据库表增量同步的流程是怎么样的

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,shell脚本实现数据库表增量同步的流程是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。需求:每天定时将 源数据库 stud
千家信息网最后更新 2024年09月22日shell脚本实现数据库表增量同步的流程是怎么样的

shell脚本实现数据库表增量同步的流程是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

需求:

每天定时将 源数据库 study_plan 库的 zxxt_class 表

增量同步到 目标数据库 axt_statistics 库的 zxxt_class 表中

前提条件:

两个库中的 zxxt_class 表结构一致

询问开发根据哪个字段作为增量参考,这里开发给的是id字段

流程:

获取 axt_statistics 库的 zxxt_class 表中id字段的最大id值

通过这个id值备份study_plan 库的 zxxt_class 表中大于此id的数据

将数据导入

脚本:

#!/bin/bash  #通用变量MySql_Comm='/usr/local/mysql/bin/mysql'MySqldump_Comm='/usr/local/mysql/bin/mysqldump'DateTime=`date +%Y-%m-%d-%H:%M:%S` echo -e "\n\n${DateTime} -----脚本开始执行-----" >> /tmp/sourcedb.log #源数据库信息Source_MySql_User='root'Source_MySql_Pass='123456'Source_MySql_Port='3306'Source_MySql_DB='study_plan'Source_MySql_Table='zxxt_class'Source_Host_IP='192.168.0.100' #本机数据库信息Mysql_User='root'MySql_Pass='12345678'MySql_Port='3306'MySql_DB='axt_statistics'MySql_Table='zxxt_class'MySql_Bak_Dir="/tmp/`date +%Y-%m-%d-%H-%M`" #创建备份目录mkdir ${MySql_Bak_Dir} #备份本机表if [ -d ${MySql_Bak_Dir} ];then  ${MySqldump_Comm} \  -u${Mysql_User} \  -p${MySql_Pass} \  -h 127.0.0.1 \  -P${MySql_Port} \  ${MySql_DB} ${MySql_Table} > ${MySql_Bak_Dir}/${MySql_DB}-${MySql_Table}.sqlelse  echo "${DateTime} ERROR: ${MySql_Bak_Dir} 目录不存在" >> /tmp/sourcedb.log  echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log  exit 1fi #获取本机表最大ID${MySql_Comm} \-u${Mysql_User} \-p${MySql_Pass} \-h 127.0.0.1 \-P${MySql_Port} \--compress ${MySql_DB} -e "select max(id) from ${MySql_Table}" > /tmp/tmp.txt ID_Num=`tail -1 /tmp/tmp.txt`echo $ID_Num  #备份源表大于本机获取id的数据if [[ ${ID_Num} -gt 0 ]];then  if [ -d ${MySql_Bak_Dir} ];then    echo "${DateTime} 开始备份原主机${Source_MySql_DB} ${Source_MySql_Table} ID大于${ID_Num}的数据..." >> /tmp/sourcedb.log    ${MySqldump_Comm} -t \    -u${Source_MySql_User} \    -p${Source_MySql_Pass} \    -h${Source_Host_IP} \    -P${Source_MySql_Port} \    --single-transaction --compress ${Source_MySql_DB} ${Source_MySql_Table} --where="id > '`tail -1 /tmp/tmp.txt`'" > ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql    echo "${DateTime} 数据备份完成 ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql" >> /tmp/sourcedb.log     #导入数据    if [ -f ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql ];then      echo "${DateTime} 开始导入数据..." >> /tmp/sourcedb.log      ${MySql_Comm} \      -u${Mysql_User} \      -p${MySql_Pass} \      -h 127.0.0.1 \      -P${MySql_Port} \      ${MySql_DB} -e "source ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql"      echo "${DateTime} 数据导入完成${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql..." >> /tmp/sourcedb.log      echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log    else      echo "${DateTime} ERROR: sql文件${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql不存在!"      echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log      exit 1    fi  else    echo "${DateTime} ERROR: ${MySql_Bak_Dir} 目录不存在" >> /tmp/sourcedb.log    echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log    exit 1  fielse  echo "${DateTime} ERROR: ID 等于 NULL" >> /tmp/sourcedb.log  echo "${DateTime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log  exit 1fi

注意!脚本中需要注意的是,从源库中使用mysqldump时必须加参数 -t ,-t 表示备份插入数据,如果不加 -t ,那么导入到目标库的数据将替换源有数据。

测试:

上面两图可以看到,源表中比目标表多了一个数据

执行脚本后

数据已同步过来

日志:

再看看导入的sql脚本

可以看到只备份并导入了自己新加的那一条数据

关于shell脚本实现数据库表增量同步的流程是怎么样的问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0