手把手教你:MySQL数据库迁移(SQL脚本版)

手把手教你:MySQL数据库迁移(SQL脚本版) 手把手教你MySQL数据库迁移SQL脚本版一、迁移核心思路将源服务器的MySQL数据库完整导出为.sql脚本文件再将脚本文件传输到目标服务器最后在目标服务器执行脚本完成数据迁移。整个过程核心分3步导出脚本 → 传输脚本 → 执行脚本适配跨服务器、跨版本兼容MySQL 5.7/8.0场景。二、前置准备环境要求源/目标服务器均安装MySQL或MariaDB且能通过mysql/mysqldump命令行工具操作权限要求源服务器拥有数据库的SELECT、LOCK TABLES权限导出必备目标服务器拥有数据库的CREATE、INSERT、ALTER权限导入必备工具准备跨服务器传输文件可使用scpLinux、XftpWindows、宝塔面板可视化等。三、Step 1从源服务器导出SQL脚本1. 基础导出命令完整库迁移使用MySQL官方工具mysqldump导出这是最稳定的导出方式执行以下命令Linux/macOS终端Windows需打开MySQL的bin目录执行# 核心命令模板mysqldump-u[用户名]-p[密码]-h[源数据库IP]-P[端口][数据库名][导出脚本名].sql# 示例本地数据库端口3306mysqldump-uroot-p123456-h127.0.0.1-P3306my_dbmy_db_backup.sql# 示例远程源数据库需开放端口mysqldump-udb_user -pDb123456-h192.168.1.100-P3306my_dbmy_db_backup.sql2. 命令参数说明参数作用-u指定MySQL用户名-p指定密码-p和密码间无空格若省略密码执行后会交互式输入-h源数据库IP本地可填127.0.0.1-P数据库端口默认3306可省略将导出内容写入指定.sql文件3. 进阶导出按需定制1导出指定表若只需迁移部分表而非整个库mysqldump-uroot-p123456my_db table1 table2my_db_tables.sql2导出结构数据含存储过程/函数默认导出仅含表结构和数据如需包含存储过程、函数、触发器mysqldump-uroot-p123456-R-Fmy_dbmy_db_full.sql# -R导出存储过程/函数-F导出触发器3仅导出表结构无数据适合搭建空库框架mysqldump-uroot-p123456-dmy_dbmy_db_structure.sql# -d仅导出结构不包含数据4. 导出注意事项避免密码明文若担心命令行明文密码不安全可省略-p后的密码执行后会提示输入更安全mysqldump-uroot-h127.0.0.1 my_dbmy_db_backup.sql处理大库导出若数据库超过10GB添加--quick --single-transaction避免内存溢出mysqldump-uroot-p123456--quick--single-transaction my_dbmy_db_backup.sql字符集统一指定字符集避免乱码如UTF8MB4mysqldump-uroot-p123456--default-character-setutf8mb4 my_dbmy_db_backup.sql四、Step 2传输SQL脚本到目标服务器1. Linux服务器间传输scp命令# 从本地源服务器传输到目标服务器scp/本地脚本路径/my_db_backup.sql 目标服务器用户名目标IP:/目标保存路径/# 示例scp/root/my_db_backup.sql root192.168.1.200:/data/backup/2. Windows→Linux传输方式1使用Xftp、WinSCP等可视化工具直接拖拽.sql文件到目标服务器方式2通过宝塔面板的「文件」功能上传脚本到目标服务器。3. 验证文件完整性传输后可对比文件大小避免传输中断导致脚本损坏# 源服务器查看大小ls-lhmy_db_backup.sql# 目标服务器查看大小ls-lh/data/backup/my_db_backup.sql五、Step 3在目标服务器执行SQL脚本1. 前置操作创建目标数据库先在目标服务器的MySQL中创建空数据库需与源库名一致或后续修改脚本# 登录MySQLmysql-uroot-p# 执行SQL创建数据库CREATE DATABASE IF NOT EXISTS my_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 退出MySQLexit;2. 执行导入脚本# 核心命令模板mysql-u[用户名]-p[密码]-h[目标数据库IP][目标数据库名][脚本路径].sql# 示例本地目标数据库mysql-uroot-p123456my_db/data/backup/my_db_backup.sql# 示例交互式输入密码更安全mysql-uroot-pmy_db/data/backup/my_db_backup.sql3. 大脚本导入优化若脚本超过10GB添加--default-character-setutf8mb4和--max_allowed_packet512M避免导入失败mysql-uroot-p--default-character-setutf8mb4--max_allowed_packet512M my_db/data/backup/my_db_backup.sql六、Step 4验证迁移结果导入完成后需确认数据完整# 登录目标数据库mysql-uroot-pmy_db# 1. 查看表是否全部导入SHOW TABLES;# 2. 抽查表数据以user表为例SELECT COUNT(*)FROM user;# 3. 验证字符集SHOW CREATE DATABASE my_db;七、常见问题与解决方案1. 导入时报错「Unknown collation: ‘utf8mb4_0900_ai_ci’」原因源库是MySQL8.0目标库是5.7排序规则不兼容。解决导出时指定兼容排序规则mysqldump-uroot-p123456--default-character-setutf8mb4--collationutf8mb4_unicode_ci my_dbmy_db_backup.sql2. 导入时提示「表已存在」解决导出脚本时添加--add-drop-table导入前自动删除原有表mysqldump-uroot-p123456--add-drop-table my_dbmy_db_backup.sql3. 大脚本导入中断解决使用source命令分步导入登录MySQL后执行mysql-uroot-pmy_db mysqlsource/data/backup/my_db_backup.sql;八、完整迁移脚本示例一键导出导入1. 源服务器导出脚本backup_mysql.sh#!/bin/bash# 配置参数DB_USERrootDB_PASS123456DB_HOST127.0.0.1DB_NAMEmy_dbBACKUP_FILE/root/my_db_backup_$(date%Y%m%d).sql# 导出脚本mysqldump-u${DB_USER}-p${DB_PASS}-h${DB_HOST}--default-character-setutf8mb4--quick--single-transaction${DB_NAME}${BACKUP_FILE}# 验证导出结果if[-f${BACKUP_FILE}];thenecho导出成功${BACKUP_FILE}elseecho导出失败exit1fi2. 目标服务器导入脚本restore_mysql.sh#!/bin/bash# 配置参数DB_USERrootDB_PASS123456DB_HOST127.0.0.1DB_NAMEmy_dbBACKUP_FILE/data/backup/my_db_backup_20260319.sql# 创建数据库mysql-u${DB_USER}-p${DB_PASS}-h${DB_HOST}-eCREATE DATABASE IF NOT EXISTS${DB_NAME}DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 导入脚本mysql-u${DB_USER}-p${DB_PASS}-h${DB_HOST}--default-character-setutf8mb4${DB_NAME}${BACKUP_FILE}# 验证导入结果COUNT$(mysql-u${DB_USER}-p${DB_PASS}-h${DB_HOST}${DB_NAME}-eSELECT COUNT(*) FROM user;|grep-vCOUNT)echouser表数据量${COUNT}echo导入完成3. 脚本使用方式# 源服务器执行导出chmodx backup_mysql.sh ./backup_mysql.sh# 目标服务器执行导入chmodx restore_mysql.sh ./restore_mysql.sh九、总结核心流程mysqldump导出脚本 → 传输脚本 →mysql执行脚本关键细节统一字符集UTF8MB4、处理大库导出/导入、验证数据完整性适配场景跨服务器迁移、数据库备份恢复、测试环境搭建。整个过程无需复杂工具纯命令行即可完成是最通用、最稳定的MySQL迁移方式适合个人开发者和中小企业使用。