一、适用范围适用于MySQL 单库逻辑迁移使用mysqldump导出适合同库名迁移改库名迁移适用于 MySQL 逻辑备份方式的单库迁移常用于 MySQL 5.6/5.7/8.0 之间的同版本或跨版本迁移。二、迁移前确认1. 确认源库信息在源库执行SHOW CREATE DATABASE 源库名; SELECT VERSION(); SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name源库名; SHOW VARIABLES LIKE lower_case_table_names;注意最关键的三项为字符集排序规则大小写敏感配置lower_case_table_names2. 确认目标库信息在目标库执行SELECT VERSION(); SHOW VARIABLES LIKE lower_case_table_names; SHOW DATABASES LIKE 目标库名;重点确认目标 MySQL 服务正常目标库是否已存在是否允许覆盖如目标库已提前创建再执行SHOW CREATE DATABASE 目标库名; SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name目标库名;重点确认目标 MySQL 版本lower_case_table_names是否与源库一致目标库是否已存在如已建库字符集和排序规则是否与源库一致3. 记录迁移前基线表数量SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema源库名;库大小SELECT table_schema AS db_name, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables WHERE table_schema源库名 GROUP BY table_schema;查看估算行数前 20 的表SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema 源库名 AND table_type BASE TABLE ORDER BY table_rows DESC, table_name LIMIT 20;核心表精确行数SELECT COUNT(*) FROM 源库名.表名1; SELECT COUNT(*) FROM 源库名.表名2; SELECT COUNT(*) FROM 源库名.表名3;三、先判断迁移方式方式 A目标库名与源库名一致可以使用带库名导出mysqldump ... --databases 源库名这种 dump 通常会带CREATE DATABASEUSE 源库名适合同名导入。方式 B目标库名与源库名不一致例如源库imip-cloud目标库iron_mes推荐导出时不要带库名不要使用--databases 源库名而使用mysqldump ... 源库名这样更适合改名导入。四、标准导出命令推荐导出命令不带库名mkdir -p /data/backup d$(date %F) nohup bash -c mysqldump -u 源用户名 -p源密码 \ -h 源IP -P 3306 \ --default-character-setutf8mb4 \ --single-transaction \ --routines \ --triggers \ --events \ --hex-blob \ --no-tablespaces \ 源库名 | gzip /data/backup/源库名_${d}.sql.gz \ /data/backup/源库名_${d}.log 21 导出后检查ls -lh /data/backup/ file /data/backup/源库名_$(date %F).sql.gz gunzip -c /data/backup/源库名_$(date %F).sql.gz | head -40如果是不带库名导出头部通常不应包含CREATE DATABASEUSE 源库名五、传输备份文件scp /data/backup/源库名_日期.sql.gz root目标IP:/data/backup/六、目标库创建先在源库查看建库属性SHOW CREATE DATABASE 源库名;按源库属性创建目标库CREATE DATABASE 目标库名 DEFAULT CHARACTER SET utf8mb4;如果源库明确有COLLATE则按源库补上。七、两种导入方式方式 1命令行导入推荐适合生产环境、大文件、压缩文件。导入.sqlmysql -uroot -p 目标库名 /tmp/xxx.sql导入.sql.gzgunzip -c /data/backup/xxx.sql.gz | mysql -uroot -p 目标库名方式 2MySQL 客户端内SOURCE先登录mysql -uroot -p再执行USE 目标库名; SOURCE /tmp/xxx.sql;说明SOURCE只能在mysql里执行如果 dump 文件里自带USE 源库名会覆盖当前USE八、是否需要先建库1. dump 文件里带CREATE DATABASE和USE通常不需要先手工建库。2. dump 文件里不带CREATE DATABASE和USE必须先手工创建目标库名再导入。九、用户与权限mysqldump逻辑迁移默认不迁移 MySQL 用户和权限。先检查业务用户SELECT user, host FROM mysql.user WHERE user业务用户名;不存在则创建CREATE USER 业务用户名% IDENTIFIED BY 业务密码; GRANT ALL PRIVILEGES ON 目标库名.* TO 业务用户名%; FLUSH PRIVILEGES;测试登录mysql -u 业务用户名 -p业务密码 -h 127.0.0.1 -P 3306 -e SHOW DATABASES LIKE 目标库名;十、导入后校验表数量SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema目标库名;库大小SELECT table_schema AS db_name, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables WHERE table_schema目标库名 GROUP BY table_schema;查看估算行数前 20 的表SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema 目标库名 AND table_type BASE TABLE ORDER BY table_rows DESC, table_name LIMIT 20;核心表精确行数SELECT COUNT(*) FROM 目标库名.表名1; SELECT COUNT(*) FROM 目标库名.表名2; SELECT COUNT(*) FROM 目标库名.表名3;十一、生产环境推荐做法最推荐导出时不带库名导入前创建目标库名再导入到指定库。导出mysqldump ... 源库名 | gzip xxx.sql.gz建库CREATE DATABASE 目标库名 DEFAULT CHARACTER SET utf8mb4;导入gunzip -c xxx.sql.gz | mysql -uroot -p 目标库名授权CREATE USER 业务用户名% IDENTIFIED BY 业务密码; GRANT ALL PRIVILEGES ON 目标库名.* TO 业务用户名%; FLUSH PRIVILEGES;十二、不推荐做法1. 导入后再改数据库名不推荐原因MySQL 没有标准安全的RENAME DATABASE风险高不适合生产环境2. 对 dump 文件裸替换库名例如sed s/imip-cloud/iron_mes/g不推荐原因可能误替换业务数据、注释、字符串内容十三、经验总结先判断目标库名是否与源库名一致再判断 dump 文件里是否带CREATE DATABASE、USE生产环境优先使用导出不带库名 导入前手工建目标库迁移完成后不要忘记建用户、授权、校验、客户端验证十四、模板命令导出模板mkdir -p /data/backup d$(date %F) nohup bash -c mysqldump -u 源用户名 -p源密码 \ -h 源IP -P 3306 \ --default-character-setutf8mb4 \ --single-transaction \ --routines \ --triggers \ --events \ --hex-blob \ --no-tablespaces \ 源库名 | gzip /data/backup/源库名_${d}.sql.gz \ /data/backup/源库名_${d}.log 21 导入模板建库 CREATE DATABASE 目标库名 DEFAULT CHARACTER SET utf8mb4; shell导入 gunzip -c /data/backup/源库名_日期.sql.gz | mysql -uroot -p 目标库名授权模板CREATE USER 业务用户名% IDENTIFIED BY 业务密码; GRANT ALL PRIVILEGES ON 目标库名.* TO 业务用户名%; FLUSH PRIVILEGES;