壳脚本实现数据库表增量同步的流程是怎么样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
需求:
每天定时将源数据库学习计划库的zxxt_class表
增量同步到目标数据库axt _统计信息库的zxxt_class表中
前提条件:
两个库中的zxxt_class表结构一致
询问开发根据哪个字段作为增量参考,这里开发给的是编号字段
流程:
获取axt _统计信息库的zxxt_class表中编号字段的最大编号值
通过这个编号值备份学习计划库的zxxt_class表中大于此编号的数据
将数据导入
脚本:
#!/bin/bash
#通用变量
MySQL _ Comm='/usr/local/MySQL/bin/MySQL '
MySQL dump _ Comm='/usr/local/MySQL/bin/MySQL dump '
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/`日期% Y-% m-% d-% H-% m ` '
#创建备份目录
mkdir${MySql_Bak_Dir}
#备份本机表
if[-d $ { MySQL _ Bak _ Dir }];然后
${MySqldump_Comm}\
-u${Mysql_User}\
-p${MySql_Pass}\
-h127.0.0.1\
-P${MySql_Port}\
$ { MySQL _ DB } $ { MySQL _ Table } $ { MySQL _ Bak _ Dir }/$ { MySQL _ DB }-$ { MySQL _ Table } .结构化查询语言
其他
echo ' $ { DateTime } ERROR : $ { MySQL _ Bak _ Dir }目录不存在/tmp/sourcedb.log
echo'${DateTime} -脚本执行完成!- '/tmp/sourcedb.log
exit1
船方不负担装货费用
#获取本机表最大身份
${MySql_Comm}\
-u${Mysql_User}\
-p${MySql_Pass}\
-h127.0.0.1\
-P${MySql_Port}\
-压缩${MySql_DB}-e'selectmax(id)来自${MySql_Table}'/tmp/tmp.txt
ID_Num=`tail-1/tmp/tmp.txt `
回声$ID_Num
#备份源表大于本机获取编号的数据
if[$ { ID _ Num } nbs
p;-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脚本实现数据库表增量同步的流程是怎么样的问题的解答就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/37090.html