データベーステーブルのインクリメンタル同期処理を実装するシェルスクリプト
要件
ソースデータベース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の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。
関連
-
bash:/root/.bashrc:Permission deniedを解決する。
-
bashスクリプトがカップ/メモリ/ディスクの使用量を監視する方法
-
シェルプログラミングにおけるShiftの使い方まとめ
-
シェルプログラミング。変数の高度な使い方
-
Shell 空白を含むテキストを詳細にトラバースする方法
-
シェルのPATH変数の使用方法について
-
Rsyncはすべてのバックアップツールを殺す、あなたは手動で特定のディレクトリをブロックすることができますか?
-
NCバウンスシェルのいくつかの方式を説明
-
シェルでスクリプトのパラメータを渡す2つの方法について説明します。
-
シェルフィルタの具体的な使用方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux用カスタムアンチテロスクリプトのアイデアとテスト
-
シェルスクリプトのパラメータと相互作用、よくある問題点
-
[解決済み】Bash スクリプトと /bin/bash^M: bad interpreter: そのようなファイルまたはディレクトリがない [重複] [重複
-
Linux で jar パッケージを起動するためのカスタムシェルスクリプト
-
シェルevalの環境変数を変数で取得する方法
-
シェルでsedコマンドを使用して特定の行を削除する方法
-
シェル文字列インターセプトエラー。不正な置換ソリューション
-
シェルプロセスコントロール入門
-
Linuxで科学的記数法(e)を数値に変換する。
-
シェル言語の日付の使用例