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數據庫表增量同步內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: