MySQL同步到Teledb

因为业务需要 讲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 "所有数据已成功同步到远程数据库!"

少部分 异常的 重新导一下 基本可以了