1.創建my-master.conf
[mysqld]
# 基礎配置
server-id = 1 # 唯一標識主庫
port = 3306
bind-address = 0.0.0.0 # 允許所有IP連接
# 二進制日志配置(主從復制核心)
log-bin = mysql-bin # 啟用二進制日志
binlog-format = ROW # 行模式日志(推薦)
expire_logs_days = 7 # 日志保留7天
max_binlog_size = 100M # 單個日志文件最大100MB
# GTID 配置(簡化復制管理)
gtid-mode = ON
enforce-gtid-consistency = ON
# 數據持久化
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
# 其他優化
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2.創建my-slave.conf
[mysqld]
# 基礎配置
server-id = 2 # 唯一標識從庫(必須不同)
port = 3306
bind-address = 0.0.0.0 # 允許所有IP連接
read_only = ON # 從庫只讀(防止誤寫)
# 二進制日志配置(可選,用于級聯復制)
log-bin = mysql-bin
binlog-format = ROW
# GTID 配置
gtid-mode = ON
enforce-gtid-consistency = ON
# 復制控制(啟動時不自動開啟復制)
skip-slave-start = ON
# 數據持久化
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
# 其他優化
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
(2) 主庫配置參數說明
| 參數 | 作用 |
|---|---|
--server-id=1 |
唯一標識主庫(從庫需不同) |
--log-bin=mysql-bin |
啟用二進制日志(主從同步依賴此日志) |
--binlog-format=ROW |
設置二進制日志格式為行模式(推薦) |
--gtid-mode=ON |
啟用全局事務標識符(GTID) |
--enforce-gtid-consistency=ON |
強制 GTID 一致性 |
構建docker-compose.yml
version: '3.8' services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: rootpassword volumes: - ./my-master.conf:/etc/mysql/conf.d/master.cnf - mysql-master-data:/var/lib/mysql ports: - "3306:3306" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci mysql-slave: image: mysql:8.0 container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: rootpassword volumes: - ./my-slave.conf:/etc/mysql/conf.d/slave.cnf - mysql-slave-data:/var/lib/mysql ports: - "3307:3306" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: mysql-master-data: mysql-slave-data:
3. 配置主庫并創建復制賬戶
(1) 進入主庫容器
docker exec -it mysql-master mysql -uroot -prootpassword
(2) 創建復制賬戶
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
(3) 查看主庫狀態
SHOW MASTER STATUS\G
5. 配置從庫同步主庫
(1) 進入從庫容器
docker exec -it mysql-slave mysql -uroot -prootpassword
(2) 配置復制鏈路
CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_AUTO_POSITION=1;
(3) 啟動復制
START SLAVE;
(4) 查看從庫狀態
SHOW SLAVE STATUS\G
6. 驗證主從同步
(1) 在主庫創建測試數據
CREATE DATABASE test; USE test; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20)); INSERT INTO users (name) VALUES ('Alice');
(2) 在從庫檢查數據
SELECT * FROM test.users;
若輸出 Alice 表示同步成功。
7. 關鍵注意事項
-
數據一致性:主從配置前確保主庫無寫入操作,否則需先同步數據。
-
網絡互通:主從容器必須處于同一 Docker 網絡(
mysql-replication)。 -
防火墻設置:確保容器間
3306端口開放。 -
GTID 優勢:使用 GTID 模式可簡化故障轉移和主從切換。
8. 擴展:多從庫配置
若需添加更多從庫,重復步驟 4 和 5,注意修改 server-id:
docker run -d \ --name mysql-slave2 \ --network mysql-replication \ -e MYSQL_ROOT_PASSWORD=root_password \ -v $(pwd)/slave2-data:/var/lib/mysql \ -p 3308:3306 \ mysql:8.0 \ --server-id=3 \ ...
通過以上步驟,你已成功搭建 MySQL 主從復制環境。主庫寫入的數據會自動同步到從庫,適用于讀寫分離、負載均衡和高可用場景。
在 MySQL 中,GTID(Global Transaction Identifier,全局事務標識符) 是一種用于唯一標識事務的機制,它簡化了主從復制的管理和故障恢復。--enforce-gtid-consistency=ON 的作用是強制確保事務在 GTID 模式下的兼容性和一致性。以下是詳細解釋:
1. GTID 是什么?
GTID 是 MySQL 主從復制中用于唯一標識事務的全局唯一標識符。
它的格式為:GTID = server_uuid:transaction_id
-
server_uuid:MySQL 實例的唯一標識符(自動生成)。 -
transaction_id:事務在該實例中的遞增序號。
例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23。
2. GTID 的作用
-
全局唯一性:每個事務的 GTID 在集群中唯一,避免主從數據沖突。
-
簡化復制管理:通過 GTID 而非二進制日志文件名和位置(
binlog file + position)定位事務,簡化主從切換和故障恢復。 -
一致性保障:確保事務在主從節點上按相同順序執行。
3. --enforce-gtid-consistency=ON 的作用
該參數強制 MySQL 在 GTID 模式下 僅執行與 GTID 兼容的事務,防止因某些操作(如非事務性語句)導致主從數據不一致。具體行為如下:
(1) 禁止不安全的 SQL 語句
在 GTID 模式下,以下操作會被禁止(除非顯式啟用 gtid_next):
-
非事務性存儲引擎的操作(如 MyISAM)。
-
跨數據庫的 DDL 語句(如
CREATE TABLE ... SELECT)。 -
隱式提交事務的語句(如
CREATE TEMPORARY TABLE)。
(2) 報錯示例
若執行以下語句(不兼容 GTID):
CREATE TABLE my_table SELECT * FROM other_table;
MySQL 會拋出錯誤:
Error 1786: Statement violates GTID consistency.
4. 為什么需要強制 GTID 一致性?
-
數據一致性:確保所有事務都能被正確追蹤和復制。
-
避免隱式風險:防止開發者意外使用與 GTID 不兼容的語句,導致復制中斷或數據不一致。
-
簡化運維:強制規范事務行為,降低主從同步的維護成本。
5. 如何查看 GTID?
(1) 查看當前 GTID
SHOW MASTER STATUS;
輸出示例:
+------------------+----------+--------------+------------------+----------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+----------------------------------------+ | mysql-bin.000003 | 187 | | | server_uuid:1-10 | +------------------+----------+--------------+------------------+----------------------------------------+
(2) 查看已執行的事務 GTID
SELECT @@GLOBAL.gtid_executed;
6. 實際應用場景
(1) 主從切換
當主庫故障時,只需根據從庫的 Executed_Gtid_Set 選擇最新的從庫提升為主庫,無需關心二進制日志位置。
(2) 數據恢復
通過 GTID 可以精準定位需要重放的事務,避免重復執行或遺漏。
7. 注意事項
-
存儲引擎:建議使用 InnoDB 等事務性存儲引擎。
-
版本兼容性:GTID 在 MySQL 5.6+ 中支持,但不同版本行為可能略有差異。
-
參數依賴:啟用 GTID 需同時設置
gtid-mode=ON和enforce-gtid-consistency=ON。
總結
-
GTID 是全局事務的唯一標識符,用于簡化復制和故障恢復。
-
--enforce-gtid-consistency=ON確保所有操作與 GTID 兼容,避免潛在的數據不一致風險。 -
在 GTID 模式下,需遵循事務性操作規范,避免使用不兼容的 SQL 語句。
浙公網安備 33010602011771號