Fork me on GitHub

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)"

image
800多MB的sql文件被压缩成30MB,压缩很重要,服务器的带宽一般都不大,减少很多传输时间.

Mysql5.7服务器导入

在 CMD 中执行(不要用 PowerShell):

mysql -u USER -p -h 127.0.0.1 -P 3306 DBNAME < "D:\back.sql"

输入密码后开始导入

posted @ 2026-09-03 21:26  秋夜雨巷  阅读(10)  评论(0)    收藏  举报