shell腳本實現(xiàn)數(shù)據(jù)庫表增量同步的流程
需求:
每天定時將 源數(shù)據(jù)庫 study_plan 庫的 zxxt_class 表
增量同步到 目標(biāo)數(shù)據(jù)庫 axt_statistics 庫的 zxxt_class 表中
前提條件:
兩個庫中的 zxxt_class 表結(jié)構(gòu)一致
詢問開發(fā)根據(jù)哪個字段作為增量參考,這里開發(fā)給的是id字段
流程:
獲取 axt_statistics 庫的 zxxt_class 表中id字段的最大id值
通過這個id值備份study_plan 庫的 zxxt_class 表中大于此id的數(shù)據(jù)
將數(shù)據(jù)導(dǎo)入
腳本:
#!/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} -----腳本開始執(zhí)行-----" >> /tmp/sourcedb.log
#源數(shù)據(jù)庫信息
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'
#本機數(shù)據(jù)庫信息
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`"
#創(chuàng)建備份目錄
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} -----腳本執(zhí)行完成!??!-----" >> /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的數(shù)據(jù)
if [[ ${ID_Num} -gt 0 ]];then
if [ -d ${MySql_Bak_Dir} ];then
echo "${DateTime} 開始備份原主機${Source_MySql_DB} ${Source_MySql_Table} ID大于${ID_Num}的數(shù)據(jù)..." >> /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} 數(shù)據(jù)備份完成 ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql" >> /tmp/sourcedb.log
#導(dǎo)入數(shù)據(jù)
if [ -f ${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql ];then
echo "${DateTime} 開始導(dǎo)入數(shù)據(jù)..." >> /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} 數(shù)據(jù)導(dǎo)入完成${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql..." >> /tmp/sourcedb.log
echo "${DateTime} -----腳本執(zhí)行完成?。?!-----" >> /tmp/sourcedb.log
else
echo "${DateTime} ERROR: sql文件${MySql_Bak_Dir}/${Source_MySql_DB}-${Source_MySql_Table}.sql不存在!"
echo "${DateTime} -----腳本執(zhí)行完成!??!-----" >> /tmp/sourcedb.log
exit 1
fi
else
echo "${DateTime} ERROR: ${MySql_Bak_Dir} 目錄不存在" >> /tmp/sourcedb.log
echo "${DateTime} -----腳本執(zhí)行完成!??!-----" >> /tmp/sourcedb.log
exit 1
fi
else
echo "${DateTime} ERROR: ID 等于 NULL" >> /tmp/sourcedb.log
echo "${DateTime} -----腳本執(zhí)行完成?。?!-----" >> /tmp/sourcedb.log
exit 1
fi
注意!腳本中需要注意的是,從源庫中使用mysqldump時必須加參數(shù) -t ,-t 表示備份插入數(shù)據(jù),如果不加 -t ,那么導(dǎo)入到目標(biāo)庫的數(shù)據(jù)將替換源有數(shù)據(jù)。
測試:

上面兩圖可以看到,源表中比目標(biāo)表多了一個數(shù)據(jù)
執(zhí)行腳本后
數(shù)據(jù)已同步過來
日志:

再看看導(dǎo)入的sql腳本
可
以看到只備份并導(dǎo)入了自己新加的那一條數(shù)據(jù)
到此這篇關(guān)于shell腳本實現(xiàn)數(shù)據(jù)庫表增量同步的文章就介紹到這了,更多相關(guān)shell數(shù)據(jù)庫表增量同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
expect實現(xiàn)單臺、多臺服務(wù)器批量scp傳輸文件
這篇文章主要介紹了expect實現(xiàn)單臺、多臺服務(wù)器批量scp傳輸文件,本文提供了單臺傳輸腳本、多臺傳輸腳本及服務(wù)器信息配置文件,需要的朋友可以參考下2014-12-12
Linux在shell中自動生成1到100的數(shù)組方法(兩種方法)
之前自己在寫shell腳本的時候,需要自動創(chuàng)建1-100的文本確不知道該如何去創(chuàng)建。今天小編給大家分享兩種方法,需要的朋友參考下2017-02-02
jenkins?pipeline中獲取shell命令的標(biāo)準(zhǔn)輸出或者狀態(tài)的方法小結(jié)
這篇文章主要介紹了jenkins?pipeline中獲取shell命令的標(biāo)準(zhǔn)輸出或者狀態(tài),工作中需要獲取shell?命令的執(zhí)行狀態(tài),返回0或者非0,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02
shell腳本定時備份MySQL數(shù)據(jù)庫數(shù)據(jù)并保留指定時間
這篇文章主要介紹了shell腳本定時備份MySQL數(shù)據(jù)庫數(shù)據(jù)并保留指定時間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

