因为业务需要 讲MySQL 同步到teledb 坐完这些 顺便记录一下; 建表过程 我就省略了
1.备份数据 从MySQL 每个表存一个SQL文件
脚本如下 backup_script.sh
MySQL是在docker容器内 创建脚本 非容器内 需要支持命令 mysql mysqldump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #!/bin/bash
# MySQL数据库连接信息 DB_USER="" DB_PASSWORD="" DB_NAME="" CHARACTER_SET="utf8mb4" # 设置字符集
# 创建存储SQL文件的目录 mkdir -p backup mkdir -p schema # 存放建表语句的目录
# 如果指定了表名,则备份单个表;否则备份所有表 if [ $# -eq 1 ]; then TABLES="$1" else TABLES=$(mysql -u$DB_USER -p$DB_PASSWORD -N -B -e "SHOW TABLES" $DB_NAME) fi
# 循环处理每个表 for TABLE in $TABLES; do # 导出单个表的SQL文件 mysqldump -u$DB_USER -p$DB_PASSWORD --default-character-set=$CHARACTER_SET --complete-insert --skip-comments --no-create-info --skip-add-drop-table $DB_NAME $TABLE > backup/$TABLE.sql if [ $? -eq 0 ]; then echo "表 $TABLE 备份完成" else echo "备份表 $TABLE 失败" fi # 导出单个表的建表语句并存储到对应目录 mysqldump -u$DB_USER -p$DB_PASSWORD --default-character-set=$CHARACTER_SET --no-data --skip-comments --skip-add-drop-table $DB_NAME $TABLE > schema/$TABLE.sql if [ $? -eq 0 ]; then echo "表 $TABLE 的建表语句备份完成" else echo "备份表 $TABLE 的建表语句失败" fi done
echo "备份完成!"
|
2.处理SQL文件 teledb语法不同导致直接导出SQL不识别 需要处理
创建文件 update.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/bin/bash
# 定义输入文件夹和输出文件夹 INPUT_DIR="backup" OUTPUT_DIR="backup_cleaned"
# 设置字符编码为 UTF-8 CHARACTER_SET="utf8"
# 创建输出文件夹 mkdir -p "$OUTPUT_DIR"
# 处理每个 SQL 文件 for file in "$INPUT_DIR"/*.sql; do if [ -f "$file" ]; then # 获取文件名(不包括路径) filename=$(basename -- "$file") # 构造输出文件路径(保持文件名不变) output_file="$OUTPUT_DIR/$filename" # 删除注释和不需要的内容,并保留 INSERT INTO 语句 awk '/^INSERT INTO / {print $0}' "$file" > "$output_file" echo "已清理文件: $filename" fi done
echo "清理完成!输出文件夹为 $OUTPUT_DIR"
|
3.同步到数据库
./sync.sh backup_cleaned
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #!/bin/bash
# 远程 MySQL 数据库连接信息 REMOTE_DB_HOST="" REMOTE_DB_PORT="" REMOTE_DB_NAME="" REMOTE_DB_USER="" REMOTE_DB_PASSWORD=""
# 设置字符集 CHARACTER_SET="utf8mb4"
# 本地备份文件夹路径 BACKUP_DIR="backup"
# 默认备份文件夹路径 DEFAULT_BACKUP_DIR="backup"
# 检查备份文件夹路径参数是否提供,如果没有则使用默认路径 if [ -z "$1" ]; then BACKUP_DIR="$DEFAULT_BACKUP_DIR" else BACKUP_DIR="$1" fi
# 检查备份文件夹是否存在 if [ ! -d "$BACKUP_DIR" ]; then echo "备份文件夹 $BACKUP_DIR 不存在" exit 1 fi
# 获取备份文件列表 SQL_FILES=$(ls $BACKUP_DIR/*.sql)
# 循环处理每个备份文件 for SQL_FILE in $SQL_FILES; do # 提取文件名(不包括路径和扩展名) FILENAME=$(basename -- "$SQL_FILE") TABLE="${FILENAME%.*}"
echo "正在处理表 $TABLE"
# 清空远程表内容并设置字符集 mysql -u$REMOTE_DB_USER -p$REMOTE_DB_PASSWORD -h $REMOTE_DB_HOST -P $REMOTE_DB_PORT --default-character-set=$CHARACTER_SET $REMOTE_DB_NAME -e "DELETE FROM $TABLE" if [ $? -eq 0 ]; then echo "表 $TABLE 的数据已成功清空" else echo "清空表 $TABLE 的数据失败" continue # 如果清空数据失败,则跳过后续步骤 fi
# 执行 SQL 文件同步到远程数据库并设置字符集 echo "正在同步数据到表 $TABLE" mysql -u$REMOTE_DB_USER -p$REMOTE_DB_PASSWORD -h $REMOTE_DB_HOST -P $REMOTE_DB_PORT --default-character-set=$CHARACTER_SET $REMOTE_DB_NAME < $SQL_FILE if [ $? -eq 0 ]; then echo "表 $TABLE 的数据已成功同步到远程数据库" else echo "表 $TABLE 的数据同步到远程数据库失败" fi done
echo "所有数据已成功同步到远程数据库!"
|
4.如果同步失败 单独同步某个表 update_one.sh
./update_one.sh backup_cleaned/sys_log.sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #!/bin/bash # 远程 MySQL 数据库连接信息 REMOTE_DB_HOST="" REMOTE_DB_PORT="" REMOTE_DB_NAME="" REMOTE_DB_USER="" REMOTE_DB_PASSWORD=""
# 检查参数是否提供 if [ $# -eq 0 ]; then echo "未提供要执行的 SQL 文件路径" exit 1 fi
# 指定要执行的 SQL 文件 SQL_FILE="$1"
# 检查文件是否存在 if [ ! -f "$SQL_FILE" ]; then echo "文件 $SQL_FILE 不存在" exit 1 fi
# 提取文件名(不包括路径和扩展名) TABLE=$(basename -- "$SQL_FILE") TABLE="${TABLE%.*}"
echo "正在处理表 $TABLE"
# 设置字符集 CHARACTER_SET="utf8mb4"
# 设置在命令执行失败时不退出脚本 set +e
# 清空远程表内容并设置字符集 mysql -u$REMOTE_DB_USER -p$REMOTE_DB_PASSWORD -h $REMOTE_DB_HOST -P $REMOTE_DB_PORT --default-character-set=$CHARACTER_SET $REMOTE_DB_NAME -e "DELETE FROM $TABLE" if [ $? -eq 0 ]; then echo "表 $TABLE 的数据已成功清空" else echo "清空表 $TABLE 的数据失败" fi
# 执行 SQL 文件同步到远程数据库并设置字符集 echo "正在同步数据到表 $TABLE" mysql -u$REMOTE_DB_USER -p$REMOTE_DB_PASSWORD -h $REMOTE_DB_HOST -P $REMOTE_DB_PORT --default-character-set=$CHARACTER_SET $REMOTE_DB_NAME < $SQL_FILE
# 恢复默认设置,即使命令执行失败也退出脚本 set -e
if [ $? -eq 0 ]; then echo "表 $TABLE 的数据已成功同步到远程数据库" else echo "表 $TABLE 的数据同步到远程数据库失败" fi
echo "所有数据已成功同步到远程数据库!"
|
少部分 异常的 重新导一下 基本可以了