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}.sql
else
  echo "${datetime} error: ${mysql_bak_dir} 目录不存在" >> /tmp/sourcedb.log
  echo "${datetime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  exit 1
fi
 
#获取本机表最大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
  fi
else
  echo "${datetime} error: id 等于 null" >> /tmp/sourcedb.log
  echo "${datetime} -----脚本执行完成!!!-----" >> /tmp/sourcedb.log
  exit 1
fi

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

测试:

 

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

执行脚本后

 

数据已同步过来

日志:

再看看导入的sql脚本

 可

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

到此这篇关于shell脚本实现数据库表增量同步的文章就介绍到这了,更多相关shell数据库表增量同步内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐