【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows/Linux迁至Linux 8.0)_20251115
数据中心动环系统MySQL迁移SOP:Windows 5.7 / Linux8.0 → 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 在源服务器里查 mysqldump.exe 的实际路径
windows操作系统中在cmd中用where mysqldump
linux操作系统中用 which mysqldump
3 校验版本
windows操作系统中:"E:\devtool\mysql\mysql-5.7.32-winx64\bin\mysqldump.exe" --version
linux操作系统中:
/usr/bin/mysqldump --version
# 或
/usr/bin/mysqldump -V
路径来自上一步在源服务器里查 mysqldump.exe 的实际路径的查询结果
4 创建备份文件夹
mkdir E:\mysql_backup

如果是linux操作系统,用以下语句查询并创建好对应备份路径,确认权限。
which mysqldump
/usr/bin/mysqldump --version
df -h
mkdir -p /data/dbbackup251115
ls -ll
5 利用mysqldump将整个库做“逻辑全量备份”
- windows中导出命令是在cmd命令行里操作,不是mysql命令行。千万不要把 CMD 的命令敲在了
mysql>里。 - Linux中导出命令是在root用户bash命令行里操作,不是mysql命令行。千万不要把导出命令敲在了
mysql>里。
源库导出备份操作如下(包括windows和Linux)
一、windows操作系统导出:
注意:这条命令是在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
二、Linux操作系统导出:
mysqldump -uroot -p \
--default-character-set=utf8mb4 \
--single-transaction \
--quick \
--routines \
--triggers \
--events \
--master-data=0 \
--set-gtid-purged=OFF \
alarm_system_test > /data/dbbackup251115/alarm_system_test_$(date +%Y%m%d%H%M).sql
linux中导出时输完密码回车,命令执行,没有报错,直接回到了 shell 提示符
注意:库名、路径、日期可根据实际修改。
对应注释如下:
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,库名等信息即可。
六、再次迁移
注意注意注意:再次迁移比首次迁移多了一个删库再新建库的操作,其余步骤一模一样。
Linux操作系统之间用scp传输备份文件:
[root@mysql-8044-test dbbackup251115]# scp ./alarm_system_test_202511150906.sql root@这里换成目标库IP:/tmp/
mysql> show databases;
--删除原有的旧库
mysql> DROP DATABASE alarm_system;
Query OK, 7 rows affected (0.14 sec)
mysql> show databases;
--新建库
mysql> CREATE DATABASE alarm_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
--不用重新建用户
恢复操作:
mysql> use alarm_system;
Database changed
mysql> SOURCE /tmp/alarm_system_test_202511150906.sql
Query OK, 0 rows affected (0.00 sec)更多推荐
所有评论(0)