数据中心动环系统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 DATABASE 与 USE 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';
SHOW WARNINGS无严重告警(信息级可忽略);- 表数=源库;
- 各表行数=源库导出时刻;
- 字符集/排序规则符合团队规范;

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

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