自动同步增量的mysql数据脚本示例

#!/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小时内新增数据。要求是表内必须有写入数据时的时间字段

 

posted @ 2023-10-19 15:21  菜菜陈  阅读(483)  评论(0)    收藏  举报