最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL主從復(fù)制與GTID環(huán)形復(fù)制的完整實操流程

 更新時間:2026年04月27日 09:56:23   作者:陳桴浮海  
MySQL主從復(fù)制是MySQL數(shù)據(jù)庫體系中最為經(jīng)典、應(yīng)用最廣泛、生產(chǎn)環(huán)境部署頻率最高的高可用與可擴展性技術(shù)方案之一,這篇文章主要介紹了MySQL主從復(fù)制與GTID環(huán)形復(fù)制的相關(guān)資料,需要的朋友可以參考下

前言

MySQL 主從復(fù)制是實現(xiàn)數(shù)據(jù)高可用、橫向擴展、離線數(shù)據(jù)分析的核心技術(shù),通過日志傳輸與重放機制實現(xiàn)多節(jié)點數(shù)據(jù)同步。本文將從復(fù)制核心原理入手,結(jié)合實操步驟講解基礎(chǔ)主從復(fù)制配置、新增從庫部署GTID 模式開啟環(huán)形復(fù)制拓?fù)浯罱?/strong>,覆蓋從單主單從到多節(jié)點環(huán)形同步的完整實操流程。

一、MySQL 復(fù)制核心原理與基礎(chǔ)知識點

在進(jìn)行實操配置前,先掌握 MySQL 復(fù)制的核心概念與關(guān)鍵知識點,是理解后續(xù)操作的基礎(chǔ)。

1. 復(fù)制核心架構(gòu)與模式

MySQL 默認(rèn)采用異步復(fù)制模式,主庫將數(shù)據(jù)變更寫入二進(jìn)制日志(Binary Log),從庫通過兩個核心線程實現(xiàn)數(shù)據(jù)同步:

  • IO_THREAD:從庫專屬線程,與主庫建立連接,拉取主庫二進(jìn)制日志并寫入本地中繼日志(Relay Log)
  • SQL_THREAD:從庫專屬線程,讀取本地中繼日志,執(zhí)行其中的 SQL 語句完成數(shù)據(jù)重放,實現(xiàn)主從數(shù)據(jù)一致。

2. 復(fù)制核心配置要求

  • server-id:集群中每個 MySQL 節(jié)點必須配置唯一的服務(wù)器 ID,是復(fù)制拓?fù)渲泄?jié)點識別的核心標(biāo)識,不可重復(fù);
  • 二進(jìn)制日志:主庫必須開啟log-bin,用于記錄所有數(shù)據(jù)變更操作,是復(fù)制的核心數(shù)據(jù)源;
  • 中繼日志:從庫需開啟relay-log,用于暫存從主庫拉取的二進(jìn)制日志內(nèi)容;
  • 復(fù)制用戶:主庫需創(chuàng)建具備REPLICATION SLAVE權(quán)限的專用用戶,供從庫拉取日志使用。

3. 復(fù)制關(guān)鍵特性與注意事項

  • 主庫可掛載的從庫數(shù)量無理論限制,生產(chǎn)環(huán)境建議控制在 30 個以內(nèi),避免主庫壓力過大;
  • 從庫 MySQL 版本建議不低于主庫,可向下兼容但不推薦,防止日志解析異常;
  • 從庫無需永久連接主庫,斷開后重新連接可從上次同步的日志位點繼續(xù)同步;
  • 基于語句的復(fù)制(SBR)存在局限性,非確定性函數(shù)(RAND()/UUID()/NOW())會導(dǎo)致主從數(shù)據(jù)不一致,建議使用基于行的復(fù)制(RBR)。

4. 復(fù)制的典型應(yīng)用場景

  • 橫向擴展:多從庫分擔(dān)讀請求,實現(xiàn)讀寫分離,提升集群整體讀性能;
  • 高可用性:主庫故障時,可將從庫提升為主庫,快速恢復(fù)業(yè)務(wù),減少停機時間;
  • 數(shù)據(jù)分析:從庫承接離線統(tǒng)計、報表查詢等操作,避免影響主庫業(yè)務(wù)運行。

二、基礎(chǔ)環(huán)境準(zhǔn)備:MySQL 多實例配置

本次實操基于單服務(wù)器部署 MySQL 多實例(server1/server2/server3/server4,端口 3311-3314),模擬多節(jié)點復(fù)制集群,核心步驟為實例配置、服務(wù)管理與核心參數(shù)配置。

1. 停止默認(rèn) MySQL 服務(wù)

# 停止系統(tǒng)默認(rèn)mysqld服務(wù)
systemctl stop mysqld
# 驗證服務(wù)狀態(tài)
systemctl status mysqld

2. 配置 MySQL 多實例基礎(chǔ)參數(shù)

創(chuàng)建多實例配置文件,指定每個實例的端口、數(shù)據(jù)目錄、套接字文件等基礎(chǔ)參數(shù):

cat > /Labs/multi.cnf << 'EOF'
[mysqld@server1]
user=mysql
socket=/mysql/server1.sock
port=3311
datadir=/mysql/data1
log-error=/mysql/server1.err
mysqlx=OFF
 
[mysqld@server2]
user=mysql
socket=/mysql/server2.sock
port=3312
datadir=/mysql/data2
log-error=/mysql/server2.err
mysqlx=OFF
 
[mysqld@server3]
user=mysql
socket=/mysql/server3.sock
port=3313
datadir=/mysql/data3
log-error=/mysql/server3.err
mysqlx=OFF
 
[mysqld@server4]
user=mysql
socket=/mysql/server4.sock
port=3314
datadir=/mysql/data4
log-error=/mysql/server4.err
mysqlx=OFF
EOF

3. 配置復(fù)制核心參數(shù)

編輯復(fù)制專用配置文件/labs/repl.cnf,開啟二進(jìn)制日志、中繼日志,配置唯一server-id,開啟 GTID 模式(后續(xù)使用):

# server1 核心配置
[mysqld@server1]
server-id=11
log-bin=server1-bin
relay-log=server1-relay-bin
gtid-mode=ON
enforce-gtid-consistency=ON
 
# server2 核心配置
[mysqld@server2]
server-id=12
log-bin=server2-bin
relay-log=server2-relay-bin
gtid-mode=ON
enforce-gtid-consistency=ON
 
# server3 核心配置
[mysqld@server3]
server-id=13
log-bin=server3-bin
relay-log=server3-relay-bin
gtid-mode=ON
enforce-gtid-consistency=ON
 
# server4 核心配置
[mysqld@server4]
server-id=14
log-bin=server4-bin
relay-log=server4-relay-bin
gtid-mode=ON
enforce-gtid-consistency=ON

4. 啟動 MySQL 多實例

通過系統(tǒng)服務(wù)管理多實例,重新加載服務(wù)配置并啟動所有實例:

# 編輯多實例服務(wù)配置(按需調(diào)整)
vim /usr/lib/systemd/system/mysqld@.service
# 重新加載系統(tǒng)服務(wù)
systemctl daemon-reload
# 啟動所有MySQL實例
systemctl start mysqld@server1
systemctl start mysqld@server2
systemctl start mysqld@server3
systemctl start mysqld@server4

注:所有實例通過--defaults-file=/labs/repl.cnf --defaults-group-suffix=@serverX啟動,分別加載對應(yīng)實例的配置。

三、實操一:基礎(chǔ)主從復(fù)制配置(server1→server2)

實現(xiàn)單主單從基礎(chǔ)復(fù)制拓?fù)?,主庫?server1(3311),從庫為 server2(3312),核心步驟為主庫配置、從庫配置、復(fù)制啟動與驗證。

1. 主庫(server1)配置

(1)登錄主庫并設(shè)置提示符(便于區(qū)分節(jié)點)

mysql -uroot -h127.0.0.1 -P3311
# 設(shè)置提示符為1>,標(biāo)識主庫
1> PROMPT 1>;

(2)查看主庫二進(jìn)制日志位點

記錄日志文件名與位置,作為從庫同步的起始點:

1> SHOW MASTER STATUS\G
# 關(guān)鍵輸出
File: server1-bin.000001  # 二進(jìn)制日志文件名
Position: 155            # 日志寫入位置
Executed_Gtid_Set:       # 未開啟GTID時為空

(3)創(chuàng)建并授權(quán)復(fù)制專用用戶

創(chuàng)建repl用戶,授予REPLICATION SLAVE權(quán)限,僅允許本地訪問(生產(chǎn)環(huán)境建議限制從庫 IP):

1> CREATE USER 'repl'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'oracle';
1> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';
1> FLUSH PRIVILEGES;

(4)主庫導(dǎo)入測試數(shù)據(jù)

創(chuàng)建業(yè)務(wù)數(shù)據(jù)庫并導(dǎo)入數(shù)據(jù),作為同步測試源:

1> SOURCE /path/to/world.sql;  # 導(dǎo)入world測試庫
1> SHOW DATABASES;  # 驗證數(shù)據(jù)庫創(chuàng)建成功

2. 從庫(server2)配置

(1)登錄從庫并設(shè)置提示符

mysql -uroot -h127.0.0.1 -P3312
# 設(shè)置提示符為2>,標(biāo)識從庫
2> PROMPT 2>;

(2)配置主從復(fù)制參數(shù)

指定主庫地址、端口、同步起始日志位點,與主庫SHOW MASTER STATUS輸出保持一致:

2> CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3311,
MASTER_LOG_FILE='server1-bin.000001',
MASTER_LOG_POS=155;

(3)啟動從庫復(fù)制線程

啟動 IO_THREAD 和 SQL_THREAD,開始從主庫拉取并重放日志:

2> START SLAVE USER='repl' PASSWORD='oracle';

3. 主從復(fù)制狀態(tài)驗證

(1)主庫驗證復(fù)制連接

主庫執(zhí)行SHOW PROCESSLIST,查看是否有從庫的 Binlog Dump 連接:

1> SHOW PROCESSLIST\G
# 關(guān)鍵輸出:State為Master has sent all binlog to slave; waiting for more updates

(2)從庫驗證復(fù)制線程狀態(tài)

從庫執(zhí)行SHOW PROCESSLIST,查看 IO/SQL 線程運行狀態(tài):

2> SHOW PROCESSLIST\G
# 關(guān)鍵輸出:State為Slave has read all relay log; waiting for more updates

(3)驗證數(shù)據(jù)同步結(jié)果

從庫查看是否同步到主庫的world數(shù)據(jù)庫,確認(rèn)數(shù)據(jù)一致:

# 主庫查看數(shù)據(jù)
1> SELECT ID, Name FROM world.city ORDER BY ID DESC LIMIT 5;
# 從庫查看數(shù)據(jù),與主庫完全一致即為同步成功
2> SHOW DATABASES;  # 可見world庫
2> SELECT ID, Name FROM world.city ORDER BY ID DESC LIMIT 5;

四、實操二:新增從庫部署(基于 server2 新增 server3 從庫)

在已有主從拓?fù)洌╯erver1→server2)基礎(chǔ)上,新增 server3 作為 server2 的從庫,核心難點為從庫數(shù)據(jù)初始化同步位點獲取,需通過備份實現(xiàn)數(shù)據(jù)一致性。

1. 從庫(server2)全量備份

在 server2 上執(zhí)行 mysqldump 備份,通過--master-data=2記錄當(dāng)前同步位點,僅備份業(yè)務(wù)庫world

mysqldump -uroot -h127.0.0.1 -P3312 --master-data=2 -B world > /tmp/server2.sql

注:--master-data=2會在備份文件中以注釋形式記錄當(dāng)前二進(jìn)制日志位點,-B指定備份的數(shù)據(jù)庫,此備份僅包含 world 庫,不包含 mysql 系統(tǒng)庫中的復(fù)制用戶信息。

2. 查看備份文件中的同步位點

編輯備份文件,找到CHANGE MASTER TO注釋行,記錄日志文件名與位置:

vim /tmp/server2.sql
# 關(guān)鍵注釋行,記錄同步起始位點
-- CHANGE MASTER TO MASTER_LOG_FILE='server2-bin.000001', MASTER_LOG_POS=736159;

3. 新從庫(server3)配置

(1)登錄 server3 并設(shè)置提示符

mysql -uroot -h127.0.0.1 -P3313
3> PROMPT 3>;

(2)導(dǎo)入備份文件初始化數(shù)據(jù)

恢復(fù) server2 的 world 庫數(shù)據(jù),保證新從庫與主庫數(shù)據(jù)基礎(chǔ)一致:

3> SOURCE /tmp/server2.sql;

(3)配置復(fù)制參數(shù)并啟動復(fù)制

基于備份文件中的位點,配置主庫為 server2,啟動復(fù)制線程:

# 配置復(fù)制參數(shù)
3> CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3312,
MASTER_LOG_FILE='server2-bin.000001',
MASTER_LOG_POS=736159;
# 啟動復(fù)制線程
3> START SLAVE USER='repl' PASSWORD='oracle';

4. 新增從庫同步驗證

(1)驗證從庫復(fù)制狀態(tài)

3> SHOW SLAVE STATUS\G
# 關(guān)鍵輸出:Slave_IO_Running=Yes、Slave_SQL_Running=Yes

(2)驗證多級數(shù)據(jù)同步

主庫 server1 執(zhí)行數(shù)據(jù)變更,驗證 server2、server3 是否逐級同步:

# 主庫server1刪除數(shù)據(jù)
1> DELETE FROM world.city WHERE ID>4070;
# server2驗證數(shù)據(jù)已刪除
2> SELECT ID, Name FROM world.city ORDER BY ID DESC LIMIT 5;
# server3驗證數(shù)據(jù)已同步刪除,與server2一致
3> SELECT ID, Name FROM world.city ORDER BY ID DESC LIMIT 5;

五、實操三:開啟 GTID 并配置環(huán)形復(fù)制(server1→server2→server3→server1)

GTID(Global Transaction Identifier,全局事務(wù)標(biāo)識符)為每個事務(wù)分配唯一標(biāo)識,替代傳統(tǒng)的「文件 + 位點」同步方式,實現(xiàn)自動定位同步位點,簡化復(fù)制配置與故障切換。在此基礎(chǔ)上搭建環(huán)形復(fù)制,實現(xiàn)多節(jié)點互相同步。

1. 開啟 GTID 模式(所有節(jié)點)

(1)停止所有 MySQL 實例與復(fù)制線程

# 停止所有MySQL多實例
systemctl stop mysqld@server*
# 登錄各節(jié)點,停止復(fù)制線程(若未停止)
1> STOP SLAVE;
2> STOP SLAVE;
3> STOP SLAVE;

(2)確認(rèn) GTID 配置已生效

檢查/labs/repl.cnf中已配置以下 GTID 核心參數(shù)(實操二已配置):

gtid-mode=ON
enforce-gtid-consistency=ON  # 強制GTID一致性,防止非GTID事務(wù)

(3)重啟所有 MySQL 實例

systemctl start mysqld@server1
systemctl start mysqld@server2
systemctl start mysqld@server3

2. 傳統(tǒng)復(fù)制升級為 GTID 復(fù)制(server1→server2)

將原有「文件 + 位點」復(fù)制升級為 GTID 復(fù)制,核心為清空舊日志歷史開啟自動定位

(1)登錄從庫 server2,重置主庫并配置 GTID 同步

2> STOP SLAVE;  # 停止傳統(tǒng)復(fù)制線程
2> RESET MASTER;  # 清空舊的二進(jìn)制日志與GTID歷史
2> CHANGE MASTER TO MASTER_AUTO_POSITION=1;  # 開啟GTID自動定位
2> START SLAVE USER='repl' PASSWORD='oracle';  # 啟動GTID復(fù)制線程

(2)驗證 GTID 復(fù)制狀態(tài)

2> SHOW SLAVE STATUS\G
# 關(guān)鍵輸出:Master_Auto_Position=1、Slave_IO_Running=Yes、Slave_SQL_Running=Yes

3. 搭建 GTID 模式環(huán)形復(fù)制拓?fù)?/h3>

配置環(huán)形復(fù)制:server1→server2→server3→server1,所有節(jié)點均為主庫同時也是從庫,核心為每個節(jié)點配置上游主庫并開啟 GTID 自動定位。

(1)配置 server2→server3 的 GTID 復(fù)制

# 登錄server3,停止舊復(fù)制線程并重置
3> STOP SLAVE;
3> RESET MASTER;
# 配置主庫為server2,開啟GTID自動定位
3> CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3312,
MASTER_AUTO_POSITION=1;
# 啟動復(fù)制線程
3> START SLAVE USER='repl' PASSWORD='oracle';

(2)配置 server3→server1 的 GTID 復(fù)制

# 登錄server1,停止舊復(fù)制線程并重置
1> STOP SLAVE;
1> RESET MASTER;
# 配置主庫為server3,開啟GTID自動定位
1> CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3313,
MASTER_AUTO_POSITION=1;
# 啟動復(fù)制線程
1> START SLAVE USER='repl' PASSWORD='oracle';

4. 環(huán)形復(fù)制狀態(tài)與數(shù)據(jù)同步驗證

(1)各節(jié)點驗證 GTID 復(fù)制狀態(tài)

每個節(jié)點執(zhí)行SHOW SLAVE STATUS\G,確保Slave_IO_Running=YesSlave_SQL_Running=Yes、Master_Auto_Position=1。

(2)驗證環(huán)形數(shù)據(jù)同步

任意節(jié)點執(zhí)行數(shù)據(jù)變更,驗證其他節(jié)點是否同步更新,實現(xiàn)環(huán)形互通:

# server2執(zhí)行數(shù)據(jù)插入/更新
2> INSERT INTO world.city (Name, CountryCode, District, Population) VALUES ('TestCity', 'USA', 'California', 10000);
# server3驗證數(shù)據(jù)已同步
3> SELECT * FROM world.city WHERE Name='TestCity';
# server1驗證數(shù)據(jù)已同步
1> SELECT * FROM world.city WHERE Name='TestCity';

(3)查看節(jié)點 GTID 與 UUID

# 查看節(jié)點UUID,唯一標(biāo)識GTID集群中的節(jié)點
2> SELECT @@server_uuid;
# 查看已執(zhí)行的GTID事務(wù)
2> SHOW MASTER STATUS\G;

六、實操常見問題與解答

1. 備份文件中為何沒有復(fù)制用戶repl?

mysqldump 備份時通過-B world僅指定了業(yè)務(wù)庫 world,而復(fù)制用戶repl存儲在mysql 系統(tǒng)庫中,因此不會被包含在備份文件中;且復(fù)制用戶是在主庫創(chuàng)建后通過復(fù)制同步到從庫,并非備份文件自帶。

2. 從庫啟動后Slave_IO_Running=No如何排查?

  1. 檢查主從庫server-id是否唯一,無重復(fù);
  2. 驗證復(fù)制用戶密碼是否正確,權(quán)限是否為REPLICATION SLAVE;
  3. 檢查主庫二進(jìn)制日志是否開啟(log-bin);
  4. 驗證主從庫網(wǎng)絡(luò)連通性,端口是否開放;
  5. 檢查從庫配置的MASTER_LOG_FILEMASTER_LOG_POS是否與主庫一致。

3. GTID 模式與傳統(tǒng)復(fù)制模式的核心區(qū)別?

  • 傳統(tǒng)復(fù)制:基于「二進(jìn)制日志文件 + 位點」定位同步起始點,需手動記錄和配置,故障切換時需重新查找位點;
  • GTID 復(fù)制:基于全局唯一事務(wù) ID 定位,無需手動指定文件和位點,通過MASTER_AUTO_POSITION=1實現(xiàn)自動定位,簡化配置與故障切換,提升復(fù)制可靠性。

七、核心知識點總結(jié)

  1. MySQL 異步復(fù)制的核心是二進(jìn)制日志 + 中繼日志,通過 IO_THREAD 和 SQL_THREAD 實現(xiàn)主從數(shù)據(jù)同步,server-id唯一是集群配置的前提;
  2. 基礎(chǔ)主從復(fù)制配置的核心步驟為:主庫開啟 binlog + 創(chuàng)建復(fù)制用戶→記錄主庫位點→從庫配置參數(shù)→啟動復(fù)制線程→驗證同步;
  3. 新增從庫時,需通過mysqldump --master-data=2實現(xiàn)數(shù)據(jù)初始化 + 同步位點記錄,保證新從庫與主庫數(shù)據(jù)基礎(chǔ)一致;
  4. GTID 通過全局唯一事務(wù) ID 替代傳統(tǒng)「文件 + 位點」,實現(xiàn)自動定位同步位點,核心配置為gtid-mode=ON+MASTER_AUTO_POSITION=1;
  5. 環(huán)形復(fù)制是多節(jié)點互為主從的拓?fù)淠J?,需基?GTID 實現(xiàn),適用于多區(qū)域數(shù)據(jù)同步場景,配置核心為每個節(jié)點指定上游主庫并開啟 GTID 自動定位;
  6. 復(fù)制驗證的核心標(biāo)準(zhǔn)為:從庫Slave_IO_Running=Yes、Slave_SQL_Running=Yes,且各節(jié)點數(shù)據(jù)完全一致。

到此這篇關(guān)于MySQL主從復(fù)制與GTID環(huán)形復(fù)制的文章就介紹到這了,更多相關(guān)MySQL主從復(fù)制與 gtid內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

犍为县| 易门县| 乐至县| 晋州市| 海门市| 清丰县| 双峰县| 德兴市| 郧西县| 商河县| 夹江县| 平乐县| 仲巴县| 蕉岭县| 秦安县| 阿拉尔市| 固原市| 保康县| 濮阳县| 舒兰市| 福鼎市| 都兰县| 都安| 平谷区| 浦城县| 临颍县| 保亭| 通许县| 凤阳县| 凤城市| 和硕县| 宜兰市| 天柱县| 鹰潭市| 蓬安县| 华池县| 百色市| 林芝县| 伽师县| 宽甸| 昌乐县|