先建立三個檔案
docker-compose.yml
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
networks:
- free
volumes:
- ./mysql/var_lib_mysql:/var/lib/mysql
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
mem_limit: 1024m
mysql2:
container_name: mysql2
image: mysql:8.0
ports:
- "3307:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
networks:
- free
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
mem_limit: 1024m
master.cnf
[mysqld]
# 禁用主機名快取
host_cache_size=0
# 跳過主機名解析
skip-name-resolve
# 主資料庫端ID號
server_id = 101
# 開啟GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 開啟二進位制日誌
log-bin = mysql-bin
# 不需要複製的資料庫名(mysql庫一般不同步)
binlog-ignore-db = mysql
# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size = 1M
# 二進位制日誌自動刪除的天數,預設值為0,表示“沒有自動刪除”,啟動時和二進位制日誌迴圈時可能刪除
expire_logs_days = 7
# 主從複製的格式(mixed,statement,row,預設格式是statement)
binlog_format = mixed
# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors = 1062
# log_slave_updates表示slave將複製事件寫進自己的二進位制日誌
log_slave_updates = ON
# 將函式複製到slave
log_bin_trust_function_creators = 1
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
slave.cnf
[mysqld]
# 禁用主機名快取
host_cache_size=0
# 跳過主機名解析
skip-name-resolve
# 從資料庫端ID號
server_id = 102
# 開啟GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 開啟二進位制日誌
log-bin = mysql-bin
# 不需要複製的資料庫名(mysql庫一般不同步)
binlog-ignore-db = mysql
# 為每個session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size = 1M
# 二進位制日誌自動刪除的天數,預設值為0,表示“沒有自動刪除”,啟動時和二進位制日誌迴圈時可能刪除
expire_logs_days = 7
# 主從複製的格式(mixed,statement,row,預設格式是statement)
binlog_format = mixed
# 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免slave端複製中斷。
# 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從資料庫資料不一致
slave_skip_errors = 1062
# log_slave_updates表示slave將複製事件寫進自己的二進位制日誌
log_slave_updates = ON
# 從伺服器中繼日誌的位置
relay_log = mysql-relay-bin
# 設定為只讀
read_only=1
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
配置主從
啟動預設配置的容器
docker compose up -d mysql mysql2
更新配置檔案
docker cp master.cnf mysql:/etc/my.cnf && docker cp slave.cnf mysql2:/etc/my.cnf
重啟兩個mysql
docker restart mysql mysql2
主伺服器執行
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
從伺服器執行
CHANGE REPLICATION SOURCE TO
MASTER_HOST='mysql'
,MASTER_USER='slave'
,MASTER_PASSWORD='123456'
,MASTER_PORT=3306
,GET_MASTER_PUBLIC_KEY=1
,MASTER_AUTO_POSITION=1;
START SLAVE;
SHOW SLAVE STATUS;
從服務重新配置需先停止同步
STOP SLAVE;
RESET MASTER;