shell腳本實(shí)現(xiàn)數(shù)據(jù)庫表增量同步的流程
需求:
每天定時(shí)將 源數(shù)據(jù)庫 study_plan 庫的 zxxt_class 表
增量同步到 目標(biāo)數(shù)據(jù)庫 axt_statistics 庫的 zxxt_class 表中
前提條件:
兩個(gè)庫中的 zxxt_class 表結(jié)構(gòu)一致
詢問開發(fā)根據(jù)哪個(gè)字段作為增量參考,這里開發(fā)給的是id字段
流程:
獲取 axt_statistics 庫的 zxxt_class 表中id字段的最大id值
通過這個(gè)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' #本機(jī)數(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} #備份本機(jī)表 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 #獲取本機(jī)表最大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 #備份源表大于本機(jī)獲取id的數(shù)據(jù) if [[ ${ID_Num} -gt 0 ]];then if [ -d ${MySql_Bak_Dir} ];then echo "${DateTime} 開始備份原主機(jī)${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í)必須加參數(shù) -t ,-t 表示備份插入數(shù)據(jù),如果不加 -t ,那么導(dǎo)入到目標(biāo)庫的數(shù)據(jù)將替換源有數(shù)據(jù)。
測(cè)試:
上面兩圖可以看到,源表中比目標(biāo)表多了一個(gè)數(shù)據(jù)
執(zhí)行腳本后
數(shù)據(jù)已同步過來
日志:
再看看導(dǎo)入的sql腳本
可
以看到只備份并導(dǎo)入了自己新加的那一條數(shù)據(jù)
到此這篇關(guān)于shell腳本實(shí)現(xiàn)數(shù)據(jù)庫表增量同步的文章就介紹到這了,更多相關(guān)shell數(shù)據(jù)庫表增量同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
expect實(shí)現(xiàn)單臺(tái)、多臺(tái)服務(wù)器批量scp傳輸文件
這篇文章主要介紹了expect實(shí)現(xiàn)單臺(tái)、多臺(tái)服務(wù)器批量scp傳輸文件,本文提供了單臺(tái)傳輸腳本、多臺(tái)傳輸腳本及服務(wù)器信息配置文件,需要的朋友可以參考下2014-12-12Linux中自定義shell腳本啟動(dòng)jar包的方法
這篇文章主要介紹了Linux中自定義shell腳本啟動(dòng)jar包的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Linux在shell中自動(dòng)生成1到100的數(shù)組方法(兩種方法)
之前自己在寫shell腳本的時(shí)候,需要自動(dòng)創(chuàng)建1-100的文本確不知道該如何去創(chuàng)建。今天小編給大家分享兩種方法,需要的朋友參考下2017-02-02jenkins?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-02shell腳本定時(shí)備份MySQL數(shù)據(jù)庫數(shù)據(jù)并保留指定時(shí)間
這篇文章主要介紹了shell腳本定時(shí)備份MySQL數(shù)據(jù)庫數(shù)據(jù)并保留指定時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09