#!/bin/bash
#A环境数据库信息
MYSQLH_ZT='IP'
MYSQLU_ZT='账号'
MYSQLP_ZT='密码'
PORT_ZT='端口'
#公共信息
MYSQLD='库名'
TABLE='表名'
SH_DIR=/root
DUMP_SH=/usr/local/mysql/bin/mysqldump
MYSQL_SH=/usr/local/mysql/bin/mysql
DATAF_ZT=${SH_DIR}/xxx/xxx.sql #需要备份的表生成的sql数据
LOG_FILE=${SH_DIR}/xxx/xxx.log #脚本执行日志
#B环境数据库信息
MYSQLH_HW='ip'
MYSQLU_HW='账号'
MYSQLP_HW='密码'
PORT_HW='端口'
DATENOW=`date +%Y-%m-%d`
DATEDAY=$(date -d"$DATENOW -1 days" +"%F")
#返回昨天的日期,可以正常返回2月28或31号等时间
${DUMP_SH} -h$MYSQLH_ZT -P$PORT_ZT -u$MYSQLU_ZT -p$MYSQLP_ZT --no-create-db --no-create-info $MYSQLD $TABLE --skip-triggers --skip-extended-insert --set-gtid-purged=OFF -w "XXTIME >= '${DATEDAY} 00:00:00' and XXTIME <= '${DATEDAY} 23:59:59' and status in (3,4,6)" --result-file=${DATAF_ZT}
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------A环境-MYSQL检测xxx任务是否有新增数据----------------" >> $LOG_FILE
grep -i "insert" ${DATAF_ZT} >> $LOG_FILE
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------xxxxx任务开始同步数据----------------" >> $LOG_FILE
${MYSQL_SH} -h$MYSQLH_HW -P$PORT_HW -u$MYSQLU_HW -p$MYSQLP_HW $MYSQLD < ${DATAF_ZT}
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B环境-MYSQL同步数据成功" >> $LOG_FILE
rm -rf ${DATAF_ZT}
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:B环境-MYSQL同步数据失败,程序退出" >> $LOG_FILE
exit 1
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 xxxxx任务没有新增数据,执行结束" >> $LOG_FILE
rm -rf ${DATAF_ZT}
exit 0
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:A环境-MYSQL数据库连接失败,程序退出" >> $LOG_FILE
exit 1
fi
脚本思路:
把A环境新增的数据通过mysqldump的形式备份成insert语句,再同步导入到B环境。如何判断是否有新增?不进行判断,定时每天晚上的凌晨两点执行,同步前一天的00:00:00-23:59:59时间段内新增数据
注意点:
如果是多张未关联的表,和上述脚本一样,只需要导出多个表的新增数据即可
#!/bin/bash
#A环境数据库信息
MYSQLH_ZT='ip'
MYSQLU_ZT='账号'
MYSQLP_ZT='密码'
PORT_ZT='端口'
#公共信息
MYSQLD='库名'
TABLE1='表名'
TABLE2='表名'
SH_DIR=/root/
DUMP_SH=/usr/local/mysql/bin/mysqldump
MYSQL_SH=/usr/local/mysql/bin/mysql
DATAF_ZT=${SH_DIR}/xxx/xxx1.sql
DATAF_TEM=${SH_DIR}/xxx/xxx2.sql
LOG_FILE=${SH_DIR}/xxx/xxx.log
ID_TXT=${SH_DIR}/xxx/xx.txt
TEM_TXT=${SH_DIR}/xxx/xx.txt
#B环境数据库信息
MYSQLH_HW='ip'
MYSQLU_HW='账号'
MYSQLP_HW='密码'
PORT_HW='端口'
DATENOW=`date +%Y-%m-%d`
DATEDAY=$(date -d"$DATENOW -1 days" +"%F")
#同步表1
table1(){
${DUMP_SH} -h$MYSQLH_ZT -P$PORT_ZT -u$MYSQLU_ZT -p$MYSQLP_ZT --no-create-db --no-create-info $MYSQLD $TABLE1 --skip-triggers --skip-extended-insert --set-gtid-purged=OFF -w "xxtime >= '${DATEDAY} 00:00:00' and xxtime <= '${DATEDAY} 23:59:59' and state in (1,2)" --result-file=${DATAF_ZT}
#满足时间的同时也需要判断状态
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------A环境-MYSQL检测XXXXX是否有新增数据----------------" >> $LOG_FILE
grep -i "insert" ${DATAF_ZT} >> $LOG_FILE
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------XXXXX开始同步新增数据----------------" >> $LOG_FILE
${MYSQL_SH} -h$MYSQLH_HW -P$PORT_HW -u$MYSQLU_HW -p$MYSQLP_HW $MYSQLD < ${DATAF_ZT}
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B环境-MYSQLXXX数据同步成功" >> $LOG_FILE
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:B环境-MYSQLXXX数据同步失败,程序退出" >> $LOG_FILE
exit 1
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 XXXXX没有新增数据,执行结束" >> $LOG_FILE
rm -rf $DATAF_ZT
exit 0
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:A-MYSQL数据库连接失败,程序退出" >> $LOG_FILE
exit 1
fi
}
#同步表2
table2(){
grep -i "insert" ${DATAF_ZT} > $ID_TXT
sed -i 's/(/ /g' $ID_TXT
sed -i 's/,/ /g' $ID_TXT
sed -i "s/'//g" $ID_TXT
awk '{print $5}' $ID_TXT > $TEM_TXT
rm -rf $ID_TXT
for i in `cat $TEM_TXT`;do
${DUMP_SH} -h$MYSQLH_ZT -P$PORT_ZT -u$MYSQLU_ZT -p$MYSQLP_ZT --no-create-db --no-create-info $MYSQLD $TABLE2 --skip-triggers --skip-extended-insert --set-gtid-purged=OFF -w "id='$i'" --result-file=${DATAF_TEM}
if [ $? -ne 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:A-MYSQL-XXX数据导出失败,程序退出" >> $LOG_FILE
exit 1
fi
${MYSQL_SH} -h$MYSQLH_HW -P$PORT_HW -u$MYSQLU_HW -p$MYSQLP_HW $MYSQLD < ${DATAF_TEM}
if [ $? -ne 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:B环境-MYSQL-XXX数据同步失败,程序退出" >> $LOG_FILE
exit 1
fi
done
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B环境-MYSQL-XXX数据同步成功" >> $LOG_FILE
rm -rf $TEM_TXT
rm -rf ${DATAF_TEM}
rm -rf ${DATAF_ZT}
}
#开始执行
table1
table2
脚本思路:
主体思路和上面一样,凌晨同步前一天的所有数据,因为的表有关联,所以写两个函数,通过把表1里的某个id取出来放到文件里,同步表2时再把这个id值循环取出来进行同步
注意点:
表2的那个id值需要提前通过sed、awk等命令处理好
#!/bin/bash
#A数据库信息
MYSQLH_ZT='IP'
MYSQLU_ZT='账号'
MYSQLP_ZT='密码'
PORT_ZT='端口'
#公共信息
MYSQLD='库名'
HOME_DIR=/root
TABLE='表名'
SH_DIR=${HOME_DIR}/xxx
DUMP_SH=/usr/local/mysql/bin/mysqldump
MYSQL_SH=/usr/local/mysql/bin/mysql
DATAF_ZT=${SH_DIR}/zt_data.sql
WTIME_ZT=${SH_DIR}/zt_wtime.txt #时间戳文件
REDIS_FILE=${SH_DIR}/redis.txt
LOG_FILE=${SH_DIR}/xxx.log
#B数据库信息
MYSQLH_HW='IP'
MYSQLU_HW='账号'
MYSQLP_HW='密码'
PORT_HW='端口'
#数据准备
data_pre(){
cd $SH_DIR
#赋值初始时间
if [ -f ${WTIME_ZT} ];then
base_wtime=`cat ${WTIME_ZT}`
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 --------A-MYSQLXXX数据开始同步---------------" >> ${LOG_FILE}
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:时间文件不存在,程序退出" >> ${LOG_FILE}
exit 1
fi
#时间更新
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 赋值的初始时间是: $base_wtime" >> $LOG_FILE
}
#数据处理
data_man(){
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------开始同步数据----------------" >> $LOG_FILE
${DUMP_SH} -h$MYSQLH_ZT -P$PORT_ZT -u$MYSQLU_ZT -p$MYSQLP_ZT --no-create-db --no-create-info $MYSQLD $TABLE --skip-triggers --skip-extended-insert --set-gtid-purged=OFF -w "xxtime > '$base_wtime' and xxtime <= '$new_wtime'" --result-file=${DATAF_ZT}
if [ $? -eq 0 ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ---------------数据内容是----------------" >> $LOG_FILE
grep -i "insert" ${DATAF_ZT} >> $LOG_FILE
${MYSQL_SH} -h$MYSQLH_HW -P$PORT_HW -u$MYSQLU_HW -p$MYSQLP_HW $MYSQLD < ${DATAF_ZT}
if [ $? -eq 0 ];then
#重置时间
echo -e $new_wtime > ${WTIME_ZT}
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 B环境-同步MYSQL数据成功" >> $LOG_FILE
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 最新时间是: $new_wtime" >> $LOG_FILE
grep -i "insert" ${DATAF_ZT} > $REDIS_FILE
rm -rf ${DATAF_ZT}
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:B环境-同步MYSQL数据失败,程序退出" >> $LOG_FILE
exit 1
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:A-备份数据失败,程序退出" >> $LOG_FILE
exit 1
fi
}
#分块查询
data_pre
new_wtime=`${MYSQL_SH} -h$MYSQLH_ZT -P$PORT_ZT -u$MYSQLU_ZT -p$MYSQLP_ZT $MYSQLD -se "SELECT MAX(wtime) FROM $TABLE WHERE wtime > '$base_wtime'"` #查询最新时间,也就是判断有没有新数据插入
if [ $? -eq 0 ];then
if [ "$new_wtime" = "NULL" ];then
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 XXX没有数据更新,执行结束" >> $LOG_FILE
exit 0
else
data_man
fi
else
echo -e "【`date +'%Y-%m-%d %H:%M:%S'`】 ERROR:A连接数据库失败,程序退出" >> $LOG_FILE
exit 1
fi
注意点:
这个脚本的同步和前两个的不同是在于可以同步自定义时间的数据,比较灵活。前面的同步固定只能同步前一天的全天数据,该脚本可以同步1小时内新增数据。要求是表内必须有写入数据时的时间字段