1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

データベーステーブルのインクリメンタル同期処理を実装するシェルスクリプト

2022-01-05 06:11:07

要件

  ソースデータベースstudy_planライブラリのzxxt_classテーブルは、毎日定期的に更新されています。

  ターゲットデータベース axt_statistics の zxxt_class テーブルにインクリメントされる。

前提条件

  zxxt_classテーブルの構造は、両ライブラリとも同じです

  インクリメンタルリファレンスとしてどのフィールドを使用するか開発者に尋ねてください。

処理します。

  axt_statisticsライブラリのzxxt_classテーブルのidフィールドの最大値を取得します。

  study_planライブラリのzxxt_classテーブルのこのidより大きいデータをこのidの値でバックアップする。

  にデータをインポートします。

スクリプトです。

#! /bin/bash
 
 
#Common variables
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} ----- script starts executing -----" >> /tmp/sourcedb.log
 
#Source Database Information
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'
 
#Local Database Information
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`"
 
#Create the backup directory
mkdir ${MySql_Bak_Dir}
 
#Backup local tables
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} directory does not exist" >> /tmp/sourcedb.log
  echo "${DateTime} ----- script execution completed!!! -----" >> /tmp/sourcedb.log
  exit 1
fi
 
#Get the maximum local table 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
 
 
#Backup source tables larger than local fetch id's
if [[ ${ID_Num} -gt 0 ]];then
  if [ -d ${MySql_Bak_Dir} ];then
    echo "${DateTime} Start backup of data whose original host ${Source_MySql_DB} ${Source_MySql_Table} ID is greater than ${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} Data backup complete ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql" >> /tmp/sourcedb.log
 
    #Import data
    if [ -f ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql ];then
      echo "${DateTime} Start importing data... " >> /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} Data import complete ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql... " >> /tmp/sourcedb.log
      echo "${DateTime} ----- script execution completed!!! -----" >> /tmp/sourcedb.log
    " >> /tmp/sourcedb.log
      echo "${DateTime} ERROR: sql file ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql does not exist! "
      echo "${DateTime} ----- script execution completed!!! -----" >> /tmp/sourcedb.log
      " >> /tmp/sourcedb.log
    fi
  exit 1 fi
    echo "${DateTime} ERROR: ${MySql_Bak_Dir} directory does not exist" >> /tmp/sourcedb.log
    echo "${DateTime} ----- script execution completed!!! -----" >> /tmp/sourcedb.log
    exit 1
  fi
exit 1 fi
  echo "${DateTime} ERROR: ID equal to NULL" >> /tmp/sourcedb.log
  echo "${DateTime} ----- script execution completed!!! -----" >> /tmp/sourcedb.log
  exit 1
fi

注意! ソースライブラリからmysqldumpを使用する場合、パラメータ-tを追加する必要があることにスクリプト内で注意してください。-tはバックアップ挿入データを意味し、-tがない場合、ターゲットライブラリにインポートされたデータはソースデータを置き換えることになります。 

テスト

上の2つの図からわかるように、ソーステーブルの方がターゲットテーブルよりもデータが1つ多くなっています

スクリプト実行後

データが同期されました

ログを表示します。

そして、インポートされたSQLスクリプトを見てください。

画像  できます

新しく追加されたデータだけがバックアップされ、インポートされたことがわかります

今回は、データベーステーブルの増分同期を実現するシェルスクリプトについて紹介します。もっと関連するシェルデータベーステーブルの増分同期の内容は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。