Mysql8.0向5.7低版本迁移脚本
Mysql8.0向5.7低版本迁移脚本
服务器合并,老得服务器只有5.7,需要把8.0的数据库导入到5.7中
Mysql8.0服务器导出备份文件.
#!/bin/bash
# ============================================================
# 配置区(所有参数均可留空,见下方注释)
# ============================================================
# 数据库连接
DB_HOST="" # 留空则默认 localhost
DB_PORT="" # 留空则默认 3306
DB_USER="root"
DB_PASS="" # 留空则表示无密码
# 要导出的数据库名
DB_NAME="DBNAME"
# ----- 导出文件路径(含时间戳,自动生成) -----
# 基础文件名(不含时间戳和扩展名)
BASE_NAME="DBNAME_backup"
# 存储目录(可自行修改)
OUTPUT_DIR="/root"
# 时间戳格式(年月日_时分,可自定义)
TIMESTAMP=$(date +"%Y%m%d_%H%M")
# 最终文件路径
OUTPUT="${OUTPUT_DIR}/${BASE_NAME}_${TIMESTAMP}.sql"
COMPRESSED="${OUTPUT_DIR}/${BASE_NAME}_${TIMESTAMP}.sql.gz"
# ----- 排除规则(支持多个,以空格分隔) -----
# 说明:所有表名中包含以下任意一个子串的表都会被排除(不导出)
# 示例1:排除所有包含 "_20" 或 "_old" 的表
# EXCLUDE_SUBSTRINGS="_20 _old"
# 示例2:排除包含 "temp" 或 "backup" 的表
# EXCLUDE_SUBSTRINGS="temp backup"
# 示例3:不排除任何表(留空)
# EXCLUDE_SUBSTRINGS=""
EXCLUDE_SUBSTRINGS="_20" # 这里按您的需求默认排除 _20
# ============================================================
# 构建连接选项(自动处理空值)
CONN_OPTS=""
[ -n "$DB_HOST" ] && CONN_OPTS="$CONN_OPTS -h$DB_HOST"
[ -n "$DB_PORT" ] && CONN_OPTS="$CONN_OPTS -P$DB_PORT"
[ -n "$DB_USER" ] && CONN_OPTS="$CONN_OPTS -u$DB_USER"
PASS_OPT=""
[ -n "$DB_PASS" ] && PASS_OPT="-p$DB_PASS"
# 构建排除条件(使用 INSTR 匹配子串,无需转义)
EXCLUDE_COND=""
if [ -n "$EXCLUDE_SUBSTRINGS" ]; then
CONDITIONS=""
for PAT in $EXCLUDE_SUBSTRINGS; do
if [ -z "$CONDITIONS" ]; then
CONDITIONS="INSTR(TABLE_NAME, '$PAT') > 0"
else
CONDITIONS="$CONDITIONS OR INSTR(TABLE_NAME, '$PAT') > 0"
fi
done
EXCLUDE_COND="AND ($CONDITIONS)"
fi
# 查询需要忽略的表
IGNORE_ARGS=""
if [ -n "$EXCLUDE_COND" ]; then
for TBL in $(mysql $CONN_OPTS $PASS_OPT -N -e \
"SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA='$DB_NAME' $EXCLUDE_COND;"); do
IGNORE_ARGS="$IGNORE_ARGS --ignore-table=$DB_NAME.$TBL"
done
fi
# 执行导出
mysqldump $CONN_OPTS $PASS_OPT \
--add-drop-table \
--no-tablespaces \
--skip-triggers \
--skip-routines \
--skip-events \
--set-gtid-purged=OFF \
--default-character-set=utf8mb4 \
--skip-extended-insert \
--column-statistics=0 \
$IGNORE_ARGS \
--databases $DB_NAME > $OUTPUT
# ------------------------------------------------------------------
# 兼容性处理(8.0 → 5.7)
# 1. 替换排序规则:0900 → general(5.7 不认识 0900,否则报错 Unknown collation)
# 2. 删除认证插件声明:5.7 不支持 caching_sha2_password,删除后需手动重建应用用户
# ------------------------------------------------------------------
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g; s/utf8mb4_0900_bin/utf8mb4_bin/g' $OUTPUT
sed -i '/IDENTIFIED WITH/d' $OUTPUT
# 压缩
gzip -f $OUTPUT
echo "导出并压缩完成:$COMPRESSED"
echo "排除的子串:${EXCLUDE_SUBSTRINGS:-(无)}"
echo "跳过的表数量:$(echo $IGNORE_ARGS | grep -o '\-\-ignore-table' | wc -l)"

800多MB的sql文件被压缩成30MB,压缩很重要,服务器的带宽一般都不大,减少很多传输时间.
Mysql5.7服务器导入
在 CMD 中执行(不要用 PowerShell):
mysql -u USER -p -h 127.0.0.1 -P 3306 DBNAME < "D:\back.sql"
输入密码后开始导入
如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~


浙公网安备 33010602011771号