數據中心動環系統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)