mysql数据库增量同步

2016-07-26
数据库

同步方法

  • 将如下脚本写入sync.sh文本文件中
  • 需提前配置好源数据库与目标数据库的地址、用户名、密码、shema信息,及shema中的哪些table需同步
  • 需提前在目标数据中建好相关的表,且表结构与源数据库相同
  • 配置增量数据的本地下载地址
  • 配置好增量更新的sql where条件子句,如”createDate >= ‘2016-07-01’”
  • 从操作系统级别启动定时任务执行sync.sh

配置信息

#!/bin/sh
# 远程数据库服务器信息(从此数据库下载数据)
remoteMysqlServer="远程数据库ip"
remoteMysqlUser="远程数据库用户名"
remoteMysqlPassword="远程数据库密码"
remoteMysqlDB="远程数据库表shema"
# 本地数据库服务器信息(将数据导入到此数据库)
localMysqlServer="本地数据库ip"
localMysqlUser="本地数据库用户名"
localMysqlPassword="本地数据库密码"
localMysqlDB="本地数据库schema"
# 数据下载目录
dataDownloadPath="/usr/local/data/download/"

# 处理哪些数据库表(注意,需提前在localMysql中建好相关的表,且表结构与remoteMysql相同)
array_name=(
    table1 table2 table3 table4 table5
)

根据不同操作系统计算日期

today=$(date +%Y%m%d)

case "$OSTYPE" in
  linux*)
    echo "LINUX"
    deleteDay=$(date -d "-7 day" +%Y%m%d)
    ;;
  darwin*)
    echo "OSX"
    deleteDay=$(date -v -7d +%Y%m%d)
    ;;
  win*)
    echo "Windows"
    ;;
  cygwin*)
    echo "Cygwin"
    ;;
  bsd*)
    echo "BSD"
    ;;
  solaris*)
    echo "SOLARIS"
    ;;
  *)
    echo "unknown: $OSTYPE"
    ;;
esac

下载远程数据到本地

# 判断${dataDownloadPath}/$today目录是否存在
if [ ! -d "${dataDownloadPath}/${today}" ]; then
  mkdir -p ${dataDownloadPath}/${today}
fi
echo "下载远程数据库到本地文件${dataDownloadPath}/${today}-----------------"


for i in ${array_name[@]}
    do
        echo "        "正在下载远程数据库表 ${i} 的数据
        # 获取本地数据库最新一条记录的时间
        mysql  -h ${localMysqlServer} -P3306 -u${localMysqlUser} -p${localMysqlPassword} --compress ${localMysqlDB} -e "select max(datatime) from ${i}" > ${dataDownloadPath}/${today}/tmp.txt
        mysqldump -t -h ${remoteMysqlServer} -u${remoteMysqlUser} -p${remoteMysqlPassword} --single-transaction --compress ${remoteMysqlDB} ${i} --where="createDate > '`tail -1 ${dataDownloadPath}/${today}/tmp.txt`'">${dataDownloadPath}/${today}/${i}_${today}.sql
        echo "        "远程数据库表 ${i} 的增量数据下载成功
    done
echo "-----------------------------------------------------------------"

将文件中的数据导入到本地数据库

echo "从${dataDownloadPath}中提取数据,导入本地数据库中----------------------"
for i in ${array_name[@]}
    do
        echo "        "即将从本地 ${dataDownloadPath}/${today}/${i}_${today}.sql 提取数据并导入到 ${i} 的数据库表
        mysql  -h ${localMysqlServer} -P3306 -u${localMysqlUser} -p${localMysqlPassword} ${localMysqlDB} -e "source ${dataDownloadPath}/${today}/${i}_${today}.sql"
        echo "        "成功导入数据到数据库表 ${i}
        echo 
        echo 
    done
echo "-----------------------------------------------------------------"
echo 

删除1周前的本地旧数据

if [ -z "${deleteDay}" ]; then 
    echo "deleteDay is empty----------------------------------------------"
    exit
fi

if [ -d "${deleteDay}" ]; then
    echo "${deleteDay}文件夹即将删除-----------------------------------------"
    rm -rf ${dataDownloadPath}/${deleteDay}/
    echo "${deleteDay}文件夹删除成功-----------------------------------------"
fi

exit

Kommentare: