【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)

数据中心动环系统MySQL迁移SOP:Windows 5.7 → Linux 8.0,覆盖测试与生产(零停机mysqldump逻辑备份实战)。

一、迁移背景

复制代码
一、源库信息(From)
操作系统:windows server 2022
数据库版本:MySQL 5.7.32
服务器 IP/主机名:
端口:3306
库名:alarm_system
用户:root
密码:
默认字符集:utf8mb4
默认排序规则:utf8mb4_general_ci

二、目标库信息(To)
2.1测试数据库
操作系统:CentOS Linux release 7.9.2009
数据库版本:MySQL 8.0.42
服务器 IP/主机名:
端口:3306
实例/库名:alarm_system_test
账号:alarm_tester
密码:
默认字符集:utf8mb4
默认排序规则:utf8mb4_general_ci

2.2正式数据库
操作系统:CentOS Linux release 7.9.2009
数据库版本:MySQL 8.0.42
服务器 IP/主机名:
端口:3306
实例/库名:alarm_system
账号:alarm_user 
密码:
默认字符集:utf8mb4
默认排序规则:utf8mb4_general_ci

三、目标数据库建库信息(已建好)
3.1测试数据库:
mysql> CREATE DATABASE alarm_system_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

mysql> CREATE USER 'alarm_tester'@'%' IDENTIFIED BY '密码';

mysql> GRANT ALL PRIVILEGES ON alarm_system_test.* TO 'alarm_tester'@'%';

mysql> FLUSH PRIVILEGES;

3.2正式数据库
mysql> CREATE DATABASE alarm_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

mysql> CREATE USER 'alarm_user'@'%' IDENTIFIED BY '密码';

mysql> GRANT ALL PRIVILEGES ON alarm_system.* TO 'alarm_user'@'%';

mysql> FLUSH PRIVILEGES;

建库信息每一个语句都要返回Query OK, 0 rows affected (0.01 sec)

二、源库操作mysqldump

1 源库体检

复制代码
1-3直接在 mysql> 里(root 或有权限的账号)执行就行。
-- 1 库大小(MB)
SELECT ROUND(SUM(data_length+index_length)/1024/1024,2) AS mb
FROM information_schema.tables WHERE table_schema='alarm_system';

-- 2 引擎分布(InnoDB 即可无锁导出)
SELECT engine, COUNT(*) FROM information_schema.tables
WHERE table_schema='alarm_system' GROUP BY engine;

--3 对象统计(触发器/例程/事件)
SELECT 'triggers',COUNT(*) FROM information_schema.triggers WHERE trigger_schema='alarm_system'
UNION ALL SELECT 'routines',COUNT(*) FROM information_schema.routines WHERE routine_schema='alarm_system'
UNION ALL SELECT 'events',COUNT(*)   FROM information_schema.events   WHERE event_schema='alarm_system';

4-6需要进入源库
USE alarm_system;

--4 表数量
SELECT COUNT(*) AS tbls
FROM information_schema.tables
WHERE table_schema='alarm_system';

--5 各表行数
SELECT 'alarmdata'            AS tbl, COUNT(*) AS cnt FROM alarm_system.alarmdata
UNION ALL SELECT 'conditionalthreshold', COUNT(*) FROM alarm_system.conditionalthreshold
UNION ALL SELECT 'monitoring',          COUNT(*) FROM alarm_system.monitoring
UNION ALL SELECT 'receiverinfo',        COUNT(*) FROM alarm_system.receiverinfo
UNION ALL SELECT 'secretkey',           COUNT(*) FROM alarm_system.secretkey
UNION ALL SELECT 'statusconfig',        COUNT(*) FROM alarm_system.statusconfig
UNION ALL SELECT 'tagthreshold',        COUNT(*) FROM alarm_system.tagthreshold;

--6 库级字符集/排序规则
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME='alarm_system';

2 在源服务器Windows CMD 里查 mysqldump.exe 的实际路径

where mysqldump

3 校验版本(cmd里跑)

"E:\devtool\mysql\mysql-5.7.32-winx64\bin\mysqldump.exe" --version

路径来自第 1 步的查询

4 创建备份文件夹

mkdir E:\mysql_backup

5 利用mysqldump将整个库做"逻辑全量备份"

导出命令是在cmd命令行里操作,不是mysql命令行。千万不要把 CMD 的命令敲在了 mysql> 里。

导出命令是在cmd命令行里操作,不是mysql命令行。千万不要把 CMD 的命令敲在了 mysql> 里。

导出命令是在cmd命令行里操作,不是mysql命令行。千万不要把 CMD 的命令敲在了 mysql> 里。

复制代码
20251103源库本地cmd命令行操作导出语句(源库数据库版本5.7):
注意:这条命令是在Windows的cmd命令行里执行,不是mysql里

"E:\devtool\mysql\mysql-5.7.32-winx64\bin\mysqldump.exe" -uroot -p -h127.0.0.1 -P3306 --default-character-set=utf8mb4 --single-transaction --quick --routines --triggers --events --master-data=0 --set-gtid-purged=OFF alarm_system > E:\mysql_backup\alarm_system_2025110442.sql

注意:库名、路径、日期可根据实际修改。

对应注释如下:
mysqldump:导出指定库的结构+数据(逻辑备份)。

--single-transaction + --quick:InnoDB 下不阻塞写,基于快照一致性导出。

--routines --triggers --events:把存储过程/函数、触发器、事件都带上。

--default-character-set=utf8mb4:确保导出/导入字符集一致,避免乱码。

--master-data=0:不写 binlog 位置(不是做主从就该这么设)。

--set-gtid-purged=OFF:不向文件写 GTID 语句(跨版本/非 GTID 环境更稳)。

> ...sql:把结果重定向到你指定的 .sql 文件里。

6 等待备份完成,将备份文件传输到目标库服务器指定路径/tmp/下

三、目标库操作

1 必须先 在目标库创建对应的新数据库,库名可自定义但要小写

注意:先在目标库mysql的root下 查实例的表名大小写策略+ 查这个库里有没有名字里带大写的表

复制代码
mysql> SHOW VARIABLES LIKE 'lower_case_table_names'; 
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 0     |
+------------------------+-------+
1 row in set (0.01 sec)

mysql> SELECT table_name
    -> FROM information_schema.tables
    -> WHERE table_schema='alarm_system_test' AND BINARY table_name <> LOWER(table_name);
Empty set, 1 warning (0.01 sec)

在目标库 lower_case_table_names=0 (区分大小写)且现有对象全小写的前提下------新建的库名直接用小写就行 ,并且后续 SQL/连接串里也要一律用同样的小写

复制代码
在目标库上新建测试数据库(mysql的root用户下操作):
mysql -u root -p

mysql> CREATE DATABASE alarm_system_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

mysql> CREATE USER 'alarm_tester'@'%' IDENTIFIED BY 'password';

mysql> GRANT ALL PRIVILEGES ON alarm_system_test.* TO 'alarm_tester'@'%';

mysql> FLUSH PRIVILEGES;

这里在背景里已经创建过,这里再次写只是为了方便流程逻辑连接。

2 校验一下备份文件完整性(可选但专业)

复制代码
sha256sum /tmp/alarm_system_20251103.sql
# 预期值:fb9c4503ded5a93db749de5d97cd7276d8ca35b25a3b037b2d1a768d74c351fc

校验值对上,文件完整无损 ✅

3 恢复/导入:库名不一致,必须先指定目标库 ,再 SOURCE

只有当 导出时用了 --databases (dump 里自带 CREATE DATABASEUSE alarm_system;)时,才不需要 手动 USE但那会强制用源库名,通常不适合导入到不同库名。

复制代码
[root@mysql-8044-test ~]# mysql -u root -p
Enter password: 

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| alarm_system_test   |
| imip_csp_order_test |
| imip_mes            |
| information_schema  |
| mysql               |
| performance_schema  |
| sys                 |
+---------------------+
7 rows in set (0.00 sec)

mysql> USE alarm_system_test;
Database changed

mysql> SOURCE /tmp/alarm_system_20251103.sql; 

注意:最后SOURCE这一句就是恢复语句,注意路径和文件名。

4 对比验证(重点查询以下2,3,4和源库结果对比)

复制代码
以下4项查询出来后用于和源库对表数做对比。

1.查看上一条语句的警告
 SHOW WARNINGS LIMIT 50;
只显示"上一条语句"产生的 warning。导入完要看告警,必须紧跟在 SOURCE ... 之后执行;隔了别的查询就看不到了。

2.表总数:数库里有多少张表???
SELECT COUNT(*) AS tbls
FROM information_schema.tables
WHERE table_schema='alarm_system_test';

3.每表行数核对:每个表有几行???
SELECT 'alarmdata'            AS tbl, COUNT(*) AS cnt FROM alarm_system_test.alarmdata
UNION ALL SELECT 'conditionalthreshold', COUNT(*) FROM alarm_system_test.conditionalthreshold
UNION ALL SELECT 'monitoring',          COUNT(*) FROM alarm_system_test.monitoring
UNION ALL SELECT 'receiverinfo',        COUNT(*) FROM alarm_system_test.receiverinfo
UNION ALL SELECT 'secretkey',           COUNT(*) FROM alarm_system_test.secretkey
UNION ALL SELECT 'statusconfig',        COUNT(*) FROM alarm_system_test.statusconfig
UNION ALL SELECT 'tagthreshold',        COUNT(*) FROM alarm_system_test.tagthreshold;
逐表 COUNT(*),确认数据是否齐(用于和源库对应表行数比对,判断导入是否完整)。

4.库级默认字符集/排序规则
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME='alarm_system_test';
  1. SHOW WARNINGS 无严重告警(信息级可忽略);
  2. 表数=源库;
  3. 各表行数=源库导出时刻;
  4. 字符集/排序规则符合团队规范;

四、迁移完成后交付给业务测试

五、测试没问题后完成正式迁移

正式迁移和测试迁移步骤完全一样,只是要注意导入到的数据库服务器IP,库名等信息即可。

相关推荐
h***01549 分钟前
Docker启动安装nacos(详情讲解,全网最细)
运维·docker·容器
z***948410 分钟前
Linux下安装Nginx服务及systemctl方式管理nginx详情
linux·运维·nginx
默恋~微凉16 分钟前
Nginx(十一)——反向代理与负载均衡
运维·nginx·负载均衡
凉晓风22 分钟前
Linux上TCP通信异常排查工具命令
linux·运维·tcp/ip
Xの哲學23 分钟前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
程序员小白条42 分钟前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
老华带你飞1 小时前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·社区养老保障
码龄3年 审核中1 小时前
Linux record 03
java·linux·运维
q***69771 小时前
Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
java·spring boot·mysql