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数据库表增量同步内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用shell检查并修复mysql数据库表的脚本

    复制代码 代码如下: #!/bin/sh#code by scpman#功能:检查并修复mysql数据库表#将此脚本加到定时中,脚本执行时,等会读库,列出要修复的所有表,然后计时,开始修复#修复过程中将损坏的表记录下来,修复完成后,将损坏的表,发邮件通知.fix_logs='/tmp/fix.log'user=''pass=''check_fix(){dblist=`/usr/bin/find /usr/dlm_db/mysql/ -type d | grep -vE "logs|_[1-9]|

  • shell脚本实现数据库表增量同步的流程

    需求: 每天定时将 源数据库 study_plan 库的 zxxt_class 表 增量同步到 目标数据库 axt_statistics 库的 zxxt_class 表中 前提条件: 两个库中的 zxxt_class 表结构一致 询问开发根据哪个字段作为增量参考,这里开发给的是id字段 流程: 获取 axt_statistics 库的 zxxt_class 表中id字段的最大id值 通过这个id值备份study_plan 库的 zxxt_class 表中大于此id的数据 将数据导入 脚本: #!

  • python实现MySQL指定表增量同步数据到clickhouse的脚本

    python实现MySQL指定表增量同步数据到clickhouse,脚本如下: #!/usr/bin/env python3 # _*_ coding:utf8 _*_ from pymysqlreplication import BinLogStreamReader from pymysqlreplication.row_event import (DeleteRowsEvent,UpdateRowsEvent,WriteRowsEvent,) import clickhouse_driver

  • Python 如何实现数据库表结构同步

    近日,某个QQ 群里的一个朋友提出一个问题,如何将一个DB 的表结构同步给另一个DB. 针对这个问题,我进行了思考与实践,具体的实现代码如下所示: # coding:utf-8 import pymysql dbDict = {"test1":"l-beta.test1"} dbUser = "test" dbPassword = "123456" class DBUtils(): def __init__(self): se

  • shell脚本检查域名证书是否过期的流程分析

    最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的.(一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下提示,这时候如果还是要访问只能通过点击"高级",忽略风险继续访问) 我们这里有些域名是直接解析到自己的业务机器上的,并没有经过运维管理的nginx再来做转发,所以针对这部分域名,就需要的单独到业务机器上下载最新的域名证书,然后替换了一下证书,并重启一下nginx (nginx -s relo

  • 用shell脚本在mysql表中批量插入数据的方法

    很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

  • Shell脚本实现监控MySQL主从同步

    代码如下: 复制代码 代码如下: #!/bin/bash #check MySQL_Slave Status #crontab time 00:10 MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'` MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "

  • 根据sql脚本修改数据库表结构的几种解决方案

    最近由于项目需要要做一个小工具. 需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改.这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类型,添加字段. 然后我们自己更新并测试好软件后,需要改动客户那边的老库,老库的数据是要保存的. 解决方案一:很快我就想到用SQL SERVER 08 R2 自带的功能,生成新库脚本.把老库改个名字,跑新库脚本,然后通过数据库自带功能把老库数据导入到新库数据.测试的时候,数据量不大,速度还比较理想.

  • sql脚本查询数据库表,数据,结构,约束等操作的方法

    1.查询当前数据库所有表 复制代码 代码如下: SELECT     O.object_id AS TableId,    TableName=O.name  ,    TableDesc= O.type FROM sys.columns C    INNER JOIN sys.objects O        ON C.[object_id]=O.[object_id]            AND O.type='U'            AND O.is_ms_shipped=0   

  • Shell脚本实战之DNS主从同步脚本实例

    DNS主从同步脚本实例 PS:两个服务器起好后最好两个服务都重启一下 主服务器配置 #!/bin/bash #DNS主从同步--主服务器 rpm -q bind if [ $? -ne 0 ];then yum install bind -y systemctl start named fi #判断DNS服务是否安装 read -p "请输入主服务器地址:" zhu read -p "请输入从服务器地址:" cong read -p "域名(请带后缀):&

随机推荐