废话不多说,直接上代码
使用命令创建一个bash文件
vim /data/mysql-sync.sh
将下边的内容粘贴进去
#!/usr/bin/env bash
set -x
# 源数据库连接信息
SOURCE_DB_HOST="host"
SOURCE_DB_PORT="port"
SOURCE_DB_USER="username"
SOURCE_DB_PASS="pass"
# 目标数据库连接信息
TARGET_DB_HOST="host"
TARGET_DB_PORT="port"
TARGET_DB_USER="username"
TARGET_DB_PASS="pass"
# 数据库和表信息
SOURCE_DATABASE="源数据库名称"
TARGET_DATABASE="目标数据库名称"
TABLE1="表1"
TABLE2="表2"
TABLE3="。。。"
# 执行时间信息
TIME_FILE_NAME="/tmp/time_file.txt"
# 最后一次的执行时间
LAST_TIME=""
# 检查文件是否存在
if [ -f "$TIME_FILE_NAME" ]
then
# 如果文件存在,使用cat命令读取文件内容
content=$(cat $TIME_FILE_NAME)
echo "文件内容为:"
echo $content
LAST_TIME = $content
else
# 如果文件不存在,输出错误消息
echo "文件不存在。"
LAST_TIME="";
fi
# 临时文件路径和名称
TMP_FILE1="/tmp/sync_${TABLE1}.sql"
TMP_FILE2="/tmp/sync_${TABLE2}.sql"
TMP_FILE3="/tmp/sync_${TABLE3}.sql"
# 生成同步SQL语句
# 最后一次执行时间为空的时候代表第一次执行,此时不加条件全量生成
condition = "CREATE_TIME >= '${LAST_TIME AND}' CREATE_TIME < DATE_FORMAT(NOW(),'%Y-%m-%d')"
if [ -z "$LAST_TIME" ]
then
# 执行同步SQL语句
echo "Syncing data from source database to target database..."
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE1}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE1}"
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE2}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE2}"
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE3}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE3}"
else
# 执行同步SQL语句
echo "Syncing data from source database to target database..."
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE1}" --where="${condition}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE1}"
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE2}" --where="${condition}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE2}"
/data/mysql/bin/mysqldump -h "${SOURCE_DB_HOST}" -P ${SOURCE_DB_PORT} -u "${SOURCE_DB_USER}" -p"${SOURCE_DB_PASS}" "${SOURCE_DATABASE}" "${TABLE3}" --where="${condition}" --skip-add-locks --no-create-info --skip-triggers --compact --complete-insert --extended-insert=FALSE > "${TMP_FILE3}"
fi
sleep 10
# 读取 SQL 文件
SQL1=$(cat $TMP_FILE1)
SQL2=$(cat $TMP_FILE2)
SQL3=$(cat $TMP_FILE3)
# 连接数据库并插入数据
mysql -u ${TARGET_DB_USER} -p${TARGET_DB_PASS} --host ${TARGET_DB_HOST} ${TARGET_DATABASE} < "${TMP_FILE1}"
mysql -u ${TARGET_DB_USER} -p${TARGET_DB_PASS} --host ${TARGET_DB_HOST} ${TARGET_DATABASE} < "${TMP_FILE2}"
mysql -u ${TARGET_DB_USER} -p${TARGET_DB_PASS} --host ${TARGET_DB_HOST} ${TARGET_DATABASE} < "${TMP_FILE3}"
# 删除之前生成的时间文件
rm ${TIME_FILE_NAME}
# 获取当前日期并将其格式化为"年-月-日"的形式
date=$(date +"%Y-%m-%d")
# 将日期输出保存到文件中
echo $date > ${TIME_FILE_NAME}
# 删除临时文件
echo "Cleaning up..."
rm ${TMP_FILE1}
rm ${TMP_FILE2}
rm ${TMP_FILE3}
set +x
执行当前文件
sh /data/mysql-sync.sh
我们可以去目标数据库看下对应数据是否插入表中,之后设置定时任务
首先,在终端中输入以下命令来打开当前用户的crontab文件
crontab -e
在打开的文件中添加一行如下的代码:
0 1 */7 * * /path/to/your/script.sh
其中,/path/to/your/script.sh
是你要执行的脚本的路径,可以根据实际情况修改。
解释一下上面的代码:
0 1
表示在凌晨1点执行脚本,0
表示分钟数为0,1
表示小时数为1。*/7
表示每7天执行一次。* *
表示每个月、每一周都执行。/path/to/your/script.sh
是你要执行的脚本的路径。
保存并退出crontab文件。
现在,每7天的凌晨1点,系统会自动执行你的脚本。