【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,库名等信息即可。

相关推荐
Wang's Blog4 小时前
Nestjs框架: 微服务断路器实现原理与OPOSSUM库实践
运维·微服务·nestjs
威桑4 小时前
C++ Linux 环境下内存泄露检测方式
linux·c++
深思慎考4 小时前
微服务即时通讯系统(服务端)——文件存储模块全链路设计与实现(3)
linux·微服务·架构·c++项目·聊天系统
l1t4 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密4 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全
ColderYY4 小时前
Python连接MySQL数据库
数据库·python·mysql
IT教程资源C5 小时前
(N_084)基于jsp,ssm学生信息管理系统
mysql·jsp·ssm学生信息
GW_Cheng5 小时前
达梦数据库适配遇到的一些问题
数据库·国产化·达梦数据库
robin_suli5 小时前
数据库之多版本控制MVCC
java·数据库