news 2026/4/17 14:08:09

MySQL数据库迁移脚本及使用说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL数据库迁移脚本及使用说明

脚本源码

#!/bin/bash# 数据库迁移脚本 - 导出MySQL数据库并导入到新机器# 支持可配置的数据库列表和目标服务器IP地址# 默认配置SOURCE_HOST="127.0.0.1"SOURCE_USER="user"SOURCE_PASS="password"TARGET_HOST="127.0.0.1"TARGET_USER="user"TARGET_PASS="password"DB_LIST=("net""event""scd""stgy""web")BACKUP_DIR="/tmp/mysql_backup_$(date+%Y%m%d_%H%M%S)"COMPRESS=true# 帮助信息show_help(){echo"用法:$0[选项]"echo"选项:"echo" -s, --source-host 源数据库主机地址 (默认:$SOURCE_HOST)"echo" -u, --source-user 源数据库用户名 (默认:$SOURCE_USER)"echo" -p, --source-pass 源数据库密码"echo" -t, --target-host 目标数据库主机地址 (默认:$TARGET_HOST)"echo" -U, --target-user 目标数据库用户名 (默认:$TARGET_USER)"echo" -P, --target-pass 目标数据库密码"echo" -d, --databases 要迁移的数据库列表,用逗号分隔 (默认: net,event,scd,stgyweb)"echo" -o, --output-dir 备份目录 (默认: /tmp/mysql_backup_时间戳)"echo" -c, --compress 是否压缩备份文件 (true/false,默认: true)"echo" -h, --help 显示此帮助信息"echo" --export-only 仅导出数据库,不导入"echo" --import-only 仅导入数据库(需指定备份目录)"echo""echo"示例:"echo" # 使用默认配置导出导入所有数据库到本地"echo"$0"echo""echo" # 导出到指定IP的服务器"echo"$0--target-host 192.168.1.100 --target-user admin --target-pass password"echo""echo" # 仅导出特定数据库"echo"$0--databases net,event --export-only"echo""echo" # 仅导入特定备份目录"echo"$0--import-only --output-dir /tmp/mysql_backup_20230101_120000"}# 解析命令行参数while[[$#-gt0]];docase$1in-s|--source-host)SOURCE_HOST="$2"shift2;;-u|--source-user)SOURCE_USER="$2"shift2;;-p|--source-pass)SOURCE_PASS="$2"shift2;;-t|--target-host)TARGET_HOST="$2"shift2;;-U|--target-user)TARGET_USER="$2"shift2;;-P|--target-pass)TARGET_PASS="$2"shift2;;-d|--databases)IFS=','read-r -a DB_LIST<<<"$2"shift2;;-o|--output-dir)BACKUP_DIR="$2"shift2;;-c|--compress)COMPRESS="$2"shift2;;-h|--help)show_helpexit0;;--export-only)EXPORT_ONLY=trueshift;;--import-only)IMPORT_ONLY=trueshift;;*)echo"未知选项:$1"show_helpexit1;;esacdone# 检查必要的工具check_requirements(){if!command-v mysqldump&>/dev/null;thenecho"错误: 未找到 mysqldump 命令,请安装 MySQL 客户端工具。"exit1fiif!command-v mysql&>/dev/null;thenecho"错误: 未找到 mysql 命令,请安装 MySQL 客户端工具。"exit1fiif["$COMPRESS"=true]&&!command-vgzip&>/dev/null;thenecho"警告: 未找到 gzip 命令,将不压缩备份文件。"COMPRESS=falsefi}# 导出数据库export_databases(){echo"开始导出数据库..."echo"源数据库主机:$SOURCE_HOST"echo"数据库列表:${DB_LIST[*]}"echo"备份目录:$BACKUP_DIR"# 创建备份目录mkdir-p"$BACKUP_DIR"# 导出每个数据库fordbin"${DB_LIST[@]}";doecho"正在导出数据库:$db"# 构建导出命令EXPORT_CMD="mysqldump -h$SOURCE_HOST-u$SOURCE_USER"if[-n"$SOURCE_PASS"];thenEXPORT_CMD="$EXPORT_CMD-p$SOURCE_PASS"fi# 添加--databases选项来包含创建数据库的语句EXPORT_CMD="$EXPORT_CMD--databases$db"# 添加一些常用的选项EXPORT_CMD="$EXPORT_CMD--single-transaction --routines --triggers --events"# 根据是否压缩构建完整命令if["$COMPRESS"=true];thenEXPORT_CMD="$EXPORT_CMD| gzip >$BACKUP_DIR/${db}.sql.gz"echo"执行:$EXPORT_CMD"eval"$EXPORT_CMD"elseEXPORT_CMD="$EXPORT_CMD>$BACKUP_DIR/${db}.sql"echo"执行:$EXPORT_CMD"eval"$EXPORT_CMD"fi# 检查导出是否成功if[$?-eq0];thenecho"数据库$db导出成功。"elseecho"错误: 数据库$db导出失败!"export_errors=truefidone# 生成配置文件记录导出信息cat>"$BACKUP_DIR/backup_info.txt"<<EOF 备份时间:$(date'+%Y-%m-%d %H:%M:%S')源数据库主机:$SOURCE_HOST源数据库用户名:$SOURCE_USER数据库列表:${DB_LIST[*]}是否压缩:$COMPRESSEOFif[-n"$export_errors"];thenecho"警告: 部分数据库导出失败!"return1elseecho"所有数据库导出成功!"return0fi}# 导入数据库import_databases(){echo"开始导入数据库..."echo"目标数据库主机:$TARGET_HOST"echo"备份目录:$BACKUP_DIR"# 检查备份目录是否存在if[!-d"$BACKUP_DIR"];thenecho"错误: 备份目录 '$BACKUP_DIR' 不存在!"exit1fi# 检查备份信息文件if[-f"$BACKUP_DIR/backup_info.txt"];thenecho"备份信息:"cat"$BACKUP_DIR/backup_info.txt"elseecho"警告: 未找到备份信息文件。"fi# 确定要导入的文件列表if[${#DB_LIST[@]}-eq0];then# 如果没有指定数据库列表,尝试从备份目录中读取if["$COMPRESS"=true]||ls"$BACKUP_DIR"/*.sql.gz1>/dev/null2>&1;thenBACKUP_FILES=("$BACKUP_DIR"/*.sql.gz)elseBACKUP_FILES=("$BACKUP_DIR"/*.sql)fielse# 如果指定了数据库列表,使用指定的列表BACKUP_FILES=()fordbin"${DB_LIST[@]}";doif[-f"$BACKUP_DIR/${db}.sql.gz"];thenBACKUP_FILES+=("$BACKUP_DIR/${db}.sql.gz")COMPRESS=trueelif[-f"$BACKUP_DIR/${db}.sql"];thenBACKUP_FILES+=("$BACKUP_DIR/${db}.sql")elseecho"警告: 未找到数据库$db的备份文件!"fidonefi# 导入每个数据库文件import_errors=falseforfilein"${BACKUP_FILES[@]}";do# 提取数据库名db_name=$(basename"$file")db_name=${db_name%.sql.gz}db_name=${db_name%.sql}echo"正在导入数据库:$db_name"# 构建导入命令IMPORT_CMD="mysql -h$TARGET_HOST-u$TARGET_USER"if[-n"$TARGET_PASS"];thenIMPORT_CMD="$IMPORT_CMD-p$TARGET_PASS"fi# 根据文件类型构建完整命令if[["$file"==*.gz]];thenIMPORT_CMD="gzip -dc$file|$IMPORT_CMD"echo"执行:$IMPORT_CMD"eval"$IMPORT_CMD"elseIMPORT_CMD="$IMPORT_CMD<$file"echo"执行:$IMPORT_CMD"eval"$IMPORT_CMD"fi# 检查导入是否成功if[$?-eq0];thenecho"数据库$db_name导入成功。"elseecho"错误: 数据库$db_name导入失败!"import_errors=truefidoneif[-n"$import_errors"];thenecho"警告: 部分数据库导入失败!"return1elseecho"所有数据库导入成功!"return0fi}# 主函数main(){echo"========================================"echo"MySQL数据库迁移工具"echo"========================================"# 检查必要的工具check_requirements# 根据参数执行导出或导入if["$IMPORT_ONLY"!=true];thenexport_databasesexport_result=$?fiif["$EXPORT_ONLY"!=true]&&["$IMPORT_ONLY"!=true];then# 如果不是仅导出或仅导入,则在导出后进行导入if[$export_result-eq0];thenimport_databaseselseecho"由于导出失败,跳过导入步骤。"exit1fielif["$IMPORT_ONLY"==true];then# 如果是仅导入,则直接执行导入import_databasesfiecho"========================================"echo"迁移完成!"echo"========================================"}# 执行主函数main

脚本概述

这是一个功能完整的MySQL数据库迁移工具,支持将多个数据库从源服务器导出并导入到目标服务器。脚本使用mysqldump进行逻辑备份,确保数据迁移的兼容性和可靠性。

主要特性:

  • 支持批量迁移多个数据库
  • 可配置的源和目标服务器连接参数
  • 可选择压缩备份以节省磁盘空间
  • 支持导出/导入分离操作
  • 完整的错误检查和日志记录

快速开始

基本用法

# 使用默认配置迁移所有数据库到本地./mysql_migration.sh# 迁移到远程服务器./mysql_migration.sh --target-host192.168.1.100 --target-user admin --target-pass password# 仅迁移特定数据库./mysql_migration.sh --databases net,event

常见用法

从本机迁移数据库到指定主机
  1. 将所有数据库迁移到指定主机
    ./db_migrate.sh --source-host127.0.0.1 --target-host10.10.110.46
  2. 仅迁移某个数据库到指定主机
    ./db_migrate.sh --source-host127.0.0.1 --target-host10.10.110.46 -d scd
将其他主机数据库迁移到指定主机
  1. 将所有数据库迁移到指定主机
    ./db_migrate.sh --source-host10.10.112.3 --target-host10.10.110.46
  2. 仅迁移某个数据库到指定主机
    ./db_migrate.sh --source-host10.10.112.3 --target-host10.10.110.46 -d web

参数详解

连接参数

参数简写默认值说明
--source-host-s127.0.0.1源数据库主机地址
--source-user-uusername源数据库用户名
--source-pass-ppassword源数据库密码
--target-host-t127.0.0.1目标数据库主机地址
--target-user-Uusername目标数据库用户名
--target-pass-Ppassword目标数据库密码

功能参数

参数简写默认值说明
--databases-dnet,event,scd,stgy,web要迁移的数据库列表(逗号分隔)
--output-dir-o自动生成备份文件存储目录
--compress-ctrue是否压缩备份文件
--export-onlyfalse仅执行导出操作
--import-onlyfalse仅执行导入操作(需指定备份目录)

使用示例

完整迁移到远程服务器

./mysql_migration.sh\--source-host192.168.1.50\--source-user dbadmin\--source-pass src_password\--target-host192.168.1.100\--target-user dbadmin\--target-pass tgt_password\--databases net,event,scd

分步执行

# 第一步:仅导出数据库./mysql_migration.sh\--source-host192.168.1.50\--export-only\--output-dir /backup/mysql_20231213# 第二步:将备份文件传输到目标服务器scp-r /backup/mysql_20231213 user@target-server:/tmp/# 第三步:在目标服务器上导入./mysql_migration.sh\--target-host192.168.1.100\--import-only\--output-dir /tmp/mysql_20231213

大型数据库优化

对于大型数据库,建议添加性能优化参数:

# 在脚本中的EXPORT_CMD变量添加以下参数:EXPORT_CMD="$EXPORT_CMD--single-transaction --quick --skip-lock-tables"

迁移技术细节

导出参数说明

脚本使用的关键mysqldump参数:

  • --single-transaction:在事务中执行导出,确保数据一致性
  • --routines:导出存储过程和函数
  • --triggers:导出触发器
  • --events:导出事件调度器
  • --databases:包含创建数据库语句

备份文件结构

/tmp/mysql_backup_20231213_143022/ ├── net.sql.gz # 压缩的数据库备份 ├── event.sql.gz ├── scd.sql.gz ├── stgy.sql.gz ├── web.sql.gz └── backup_info.txt # 备份元数据信息

最佳实践建议

1. 迁移前准备

权限检查:确保数据库用户有足够权限

-- 源数据库用户需要SELECT、LOCK TABLES权限 GRANT SELECT, LOCK TABLES ON source_db.* TO 'username'@'localhost'; -- 目标数据库用户需要CREATE、INSERT等权限 GRANT CREATE, INSERT, UPDATE ON target_db.* TO 'username'@'localhost';

版本兼容性:检查MySQL版本兼容性,特别是5.7到8.0的迁移

2. 大数据量迁移优化

分批次迁移:对于特大表可以考虑分批次导出

# 按条件分批导出大数据表mysqldump --where="id BETWEEN 1 AND 1000000"large_table>part1.sql

网络优化:使用压缩传输减少网络带宽占用

# 管道直接传输(避免中间文件)mysqldump -h source_host -u user -p db|gzip|sshuser@target_host"gunzip | mysql -u user -p db"

3. 数据一致性验证

迁移完成后建议进行数据验证:

# 记录数对比source_count=$(mysql -h source_host -u user -p -N -s -e"SELECT COUNT(*) FROM table")target_count=$(mysql -h target_host -u user -p -N -s -e"SELECT COUNT(*) FROM table")echo"Source:$source_count| Target:$target_count"

故障排除

常见问题解决

  1. 连接失败

    • 检查防火墙设置和端口访问(默认3306)
    • 验证用户名和密码是否正确
    • 确认MySQL服务是否正常运行
  2. 权限错误

    • 确保用户有导出/导入权限
    • 检查数据库名是否正确
  3. 字符集问题

    • 添加字符集参数:--default-character-set=utf8mb4
    • 统一源和目标数据库的字符集设置
  4. 大数据量导出超时

    • 调整超时参数:SET GLOBAL ob_query_timeout=1000000000;
    • 使用--quick参数优化大表导出

注意事项

  1. 业务影响:迁移期间建议停止使用源数据库的应用程序
  2. 存储空间:确保备份目录有足够磁盘空间
  3. 网络稳定性:跨网络迁移需要稳定的网络连接
  4. 回滚方案:重要数据迁移前建议做好备份
  5. 触发器处理:注意触发器的导出和导入设置

扩展功能

如需更高级的数据库版本控制,可以考虑集成Flyway或Liquibase等专业工具,它们提供更好的版本管理和回滚能力。

此脚本提供了MySQL数据库迁移的基础功能,适用于大多数迁移场景。根据具体需求可以进一步定制和优化参数设置。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:04:47

什么是GPU

现代机器学习GPU&#xff08;例如H100、B200&#xff09;基本上是由多个专门用于矩阵乘法的计算核心&#xff08;称为流式多处理器或SM&#xff09;连接到一块高速内存条&#xff08;称为HBM&#xff09;组成。下图所示&#xff1a; 图&#xff1a; H100 或 B200 GPU 的抽象布…

作者头像 李华
网站建设 2026/4/18 5:40:02

2025免费降AI率完全指南:从降AI工具选择到实操技巧,一步到位!

在论文、报告、内容创作越来越严格的时代&#xff0c;查AI率、检测AI率、降AI率 已经成为学生、写作者、博主的日常需求。很多同学因为 AI率过高被导师指出“AI痕迹太重”&#xff0c;甚至退回重写。本文今天一次性告诉你&#xff1a; 检测AI率应该注意什么 免费查AI率的网站有…

作者头像 李华
网站建设 2026/4/18 5:25:34

软件工程选择题

PDL&#xff1a;伪代码 PAD&#xff1a;流程图 DD&#xff1a;数据字典模块框直线相连&#xff0c;存在调用关系 面向对象设计关注求解域 用例模型从用户角度描述系统功能 问题域子系统主要作用&#xff1a;定义系统的核心业务逻辑 确认测试的目的&#xff1a;测试软件是否符合…

作者头像 李华
网站建设 2026/4/18 5:25:35

springboot校园二手交易平台的设计与实现_7p4141h3-

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/4/18 6:57:33

毕业设计实战:基于SpringBoot+MySQL的毕业生实习与就业管理系统设计与实现,从需求到测试全流程避坑指南!

毕业设计实战&#xff1a;基于SpringBootMySQL的毕业生实习与就业管理系统设计与实现&#xff0c;从需求到测试全流程避坑指南&#xff01; 谁懂啊&#xff01;当初做毕业生实习与就业管理系统毕设时&#xff0c;光“就业信息表”和“学生表”的外键关联就卡了3天——一开始没给…

作者头像 李华