MySQL實(shí)現(xiàn)不停機(jī)遷移的完整指南
一、為什么需要不停機(jī)遷移?
在生產(chǎn)環(huán)境中,數(shù)據(jù)庫(kù)遷移是一個(gè)常見(jiàn)但充滿挑戰(zhàn)的任務(wù)。傳統(tǒng)的停機(jī)遷移方式會(huì)導(dǎo)致業(yè)務(wù)中斷,對(duì)于7×24小時(shí)運(yùn)行的互聯(lián)網(wǎng)服務(wù)來(lái)說(shuō),這種停機(jī)時(shí)間是不可接受的。不停機(jī)遷移方案可以在保證業(yè)務(wù)連續(xù)性的前提下,完成數(shù)據(jù)庫(kù)的平滑遷移。
二、核心原理解析
不停機(jī)遷移的核心思想是:先全量復(fù)制,后增量同步。具體來(lái)說(shuō):
- 全量備份階段: 使用mysqldump導(dǎo)出數(shù)據(jù),并記錄備份時(shí)刻的binlog位置
- 數(shù)據(jù)導(dǎo)入階段: 將備份數(shù)據(jù)導(dǎo)入到新數(shù)據(jù)庫(kù)
- 增量同步階段: 通過(guò)主從復(fù)制機(jī)制,從記錄的binlog位置開(kāi)始同步增量數(shù)據(jù)
- 切換階段: 數(shù)據(jù)追平后,切換應(yīng)用連接到新數(shù)據(jù)庫(kù)
這種方案的精妙之處在于:binlog作為增量數(shù)據(jù)的橋梁,確保了在備份期間和導(dǎo)入期間產(chǎn)生的新數(shù)據(jù)不會(huì)丟失。
三、詳細(xì)實(shí)施步驟
3.1 準(zhǔn)備工作
源庫(kù)配置檢查:
# 確認(rèn)binlog已開(kāi)啟 mysql> SHOW VARIABLES LIKE 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ # 查看binlog格式(建議ROW格式) mysql> SHOW VARIABLES LIKE 'binlog_format'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+
創(chuàng)建復(fù)制用戶:
-- 在源庫(kù)創(chuàng)建用于主從復(fù)制的專(zhuān)用賬號(hào) CREATE USER 'repl_user'@'新庫(kù)IP' IDENTIFIED BY '強(qiáng)密碼'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'新庫(kù)IP'; FLUSH PRIVILEGES;
3.2 全量備份并記錄binlog位置
這是整個(gè)方案的關(guān)鍵步驟!
# 使用mysqldump導(dǎo)出數(shù)據(jù),同時(shí)記錄binlog位置 mysqldump -h源庫(kù)IP -u用戶名 -p \ --single-transaction \ --master-data=2 \ --flush-logs \ --routines \ --triggers \ --events \ --all-databases \ > full_backup.sql # 參數(shù)說(shuō)明: # --single-transaction: 對(duì)InnoDB表使用一致性快照,不鎖表 # --master-data=2: 在備份文件中注釋形式記錄binlog位置 # --flush-logs: 生成新的binlog文件,便于后續(xù)管理 # --routines: 導(dǎo)出存儲(chǔ)過(guò)程和函數(shù) # --triggers: 導(dǎo)出觸發(fā)器 # --events: 導(dǎo)出事件調(diào)度器
查看備份文件中的binlog信息:
head -n 50 full_backup.sql | grep "CHANGE MASTER TO" # 輸出示例: # -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=154;
記住這兩個(gè)關(guān)鍵信息:
- MASTER_LOG_FILE: binlog文件名(如mysql-bin.000015)
- MASTER_LOG_POS: binlog位置(如154)
3.3 在新庫(kù)導(dǎo)入數(shù)據(jù)
# 將備份文件傳輸?shù)叫路?wù)器 scp full_backup.sql root@新庫(kù)IP:/tmp/ # 在新庫(kù)執(zhí)行導(dǎo)入 mysql -h新庫(kù)IP -u用戶名 -p < full_backup.sql # 或使用source命令(可顯示導(dǎo)入進(jìn)度) mysql -h新庫(kù)IP -u用戶名 -p mysql> source /tmp/full_backup.sql;
3.4 配置主從復(fù)制
在新庫(kù)(從庫(kù))上配置主從關(guān)系:
-- 停止從庫(kù)(如果之前有配置) STOP SLAVE; -- 配置主庫(kù)信息 CHANGE MASTER TO MASTER_HOST='源庫(kù)IP', MASTER_PORT=3306, MASTER_USER='repl_user', MASTER_PASSWORD='強(qiáng)密碼', MASTER_LOG_FILE='mysql-bin.000015', -- 使用備份時(shí)記錄的文件名 MASTER_LOG_POS=154; -- 使用備份時(shí)記錄的位置 -- 啟動(dòng)主從復(fù)制 START SLAVE; -- 檢查復(fù)制狀態(tài) SHOW SLAVE STATUS\G
關(guān)鍵狀態(tài)檢查:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes -- 必須是Yes
Slave_SQL_Running: Yes -- 必須是Yes
Seconds_Behind_Master: 0 -- 延遲秒數(shù),接近0說(shuō)明快追平了
3.5 監(jiān)控同步進(jìn)度
# 持續(xù)監(jiān)控延遲情況
watch -n 1 "mysql -u用戶名 -p密碼 -e 'SHOW SLAVE STATUS\G' | grep 'Seconds_Behind_Master'"
# 或使用SQL查詢(xún)
SELECT
CONCAT(
'IO線程: ', Slave_IO_Running,
' | SQL線程: ', Slave_SQL_Running,
' | 延遲: ', Seconds_Behind_Master, '秒'
) AS 復(fù)制狀態(tài)
FROM information_schema.REPLICA_STATUS;
3.6 切換應(yīng)用連接
當(dāng)Seconds_Behind_Master接近0時(shí),準(zhǔn)備切換:
- 設(shè)置源庫(kù)為只讀(可選,更安全):
-- 在源庫(kù)執(zhí)行 SET GLOBAL read_only = ON; SET GLOBAL super_read_only = ON;
- 最終確認(rèn)數(shù)據(jù)一致性:
# 對(duì)比源庫(kù)和新庫(kù)的數(shù)據(jù)量 mysql -h源庫(kù)IP -e "SELECT table_schema, COUNT(*) FROM information_schema.tables GROUP BY table_schema;" mysql -h新庫(kù)IP -e "SELECT table_schema, COUNT(*) FROM information_schema.tables GROUP BY table_schema;"
- 修改應(yīng)用配置,指向新庫(kù):
# 應(yīng)用配置文件示例 database: host: 新庫(kù)IP port: 3306 username: app_user password: app_password
- 重啟應(yīng)用或熱更新配置
- 驗(yàn)證業(yè)務(wù)功能正常
3.7 收尾工作
-- 新庫(kù)不再需要作為從庫(kù)時(shí),停止復(fù)制 STOP SLAVE; -- 重置從庫(kù)配置(可選) RESET SLAVE ALL; -- 關(guān)閉源庫(kù)只讀模式(如果需要保留源庫(kù)) SET GLOBAL read_only = OFF; SET GLOBAL super_read_only = OFF;
四、核心優(yōu)勢(shì)
- 零數(shù)據(jù)丟失: binlog機(jī)制保證了從備份開(kāi)始到切換完成期間的所有數(shù)據(jù)變更都被捕獲
- 業(yè)務(wù)無(wú)感知: 整個(gè)遷移過(guò)程中,源庫(kù)持續(xù)提供服務(wù)
- 可回滾: 切換前源庫(kù)數(shù)據(jù)完整,出現(xiàn)問(wèn)題可快速回滾
- 可控切換: 管理員可以選擇業(yè)務(wù)低峰期進(jìn)行最終切換
五、注意事項(xiàng)
- 提前演練: 在測(cè)試環(huán)境完整走一遍流程
- 備份保留: 遷移完成后保留源庫(kù)備份一段時(shí)間
- 監(jiān)控告警: 配置主從延遲監(jiān)控和告警
- 權(quán)限同步: 確保新庫(kù)用戶權(quán)限與源庫(kù)一致
- 防火墻規(guī)則: 確保新庫(kù)能訪問(wèn)源庫(kù)的3306端口
六、進(jìn)階技巧
使用Percona XtraBackup
對(duì)于超大數(shù)據(jù)庫(kù),可以使用XtraBackup替代mysqldump:
# 備份(物理備份,速度更快) xtrabackup --backup \ --target-dir=/backup/full \ --user=root --password=密碼 # 會(huì)自動(dòng)記錄binlog位置到xtrabackup_binlog_info文件 cat /backup/full/xtrabackup_binlog_info # 輸出: mysql-bin.000015 154
雙主模式(高級(jí))
遷移完成后可配置雙主模式,實(shí)現(xiàn)雙向同步,為下次遷移做準(zhǔn)備。
七、總結(jié)
MySQL不停機(jī)遷移的本質(zhì)是利用binlog的增量復(fù)制能力,在全量數(shù)據(jù)復(fù)制的基礎(chǔ)上,通過(guò)主從同步機(jī)制追平增量數(shù)據(jù)。只要嚴(yán)格按照流程操作,準(zhǔn)確記錄和配置binlog位置,就能實(shí)現(xiàn)真正的零數(shù)據(jù)丟失遷移。
遷移口訣:
- 全量dump記位置
- source導(dǎo)入打基礎(chǔ)
- 主從同步追增量
- 延遲為零再切換
以上就是MySQL不停機(jī)遷移的完整指南的詳細(xì)內(nèi)容,更多關(guān)于MySQL不停機(jī)遷移的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql語(yǔ)法時(shí)采用了雙引號(hào)““的錯(cuò)誤問(wèn)題
錯(cuò)誤原因:使用雙引號(hào)定義表名和列名導(dǎo)致MySQL報(bào)錯(cuò),應(yīng)使用反引號(hào),修改方案:將雙引號(hào)改為反引號(hào),避免語(yǔ)法沖突,總結(jié):在MySQL中,正確使用反引號(hào)引用標(biāo)識(shí)符,確保SQL語(yǔ)句符合MySQL語(yǔ)法規(guī)則2024-10-10
一文教你快速生成MySQL數(shù)據(jù)庫(kù)關(guān)系圖
我們經(jīng)常會(huì)用到一些表的數(shù)據(jù)庫(kù)關(guān)系圖,下面這篇文章主要給大家介紹了關(guān)于生成MySQL數(shù)據(jù)庫(kù)關(guān)系圖的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
使用JDBC在MySQL數(shù)據(jù)庫(kù)中如何快速批量插入數(shù)據(jù)
這篇文章主要介紹了使用JDBC在MySQL數(shù)據(jù)庫(kù)中如何快速批量插入數(shù)據(jù),可以有效的解決一次插入大數(shù)據(jù)的方法,2016-11-11
Mysql數(shù)據(jù)庫(kù) ALTER 操作詳解
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù) ALTER 操作詳解的相關(guān)資料,需要的朋友可以參考下2022-09-09
mysql建表報(bào)錯(cuò):invalid?default?value?for?'date'的解決方
最近遇到一個(gè)這樣的問(wèn)題,出現(xiàn)了invalid default value for 'end_date'錯(cuò)誤,所以下面這篇文章主要給大家介紹了關(guān)于mysql建表報(bào)錯(cuò):invalid?default?value?for?'date'的解決方法,需要的朋友可以參考下2022-12-12

