数据中心动环系统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将整个库做“逻辑全量备份”

  1. windows中导出命令是在cmd命令行里操作,不是mysql命令行。千万不要把 CMD 的命令敲在了 mysql> 里。
  2. 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/下

三、目标库操作

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

注意:先在目标库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,库名等信息即可。

六、再次迁移

注意注意注意:再次迁移比首次迁移多了一个删库再新建库的操作,其余步骤一模一样。

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)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐