安裝MySQL?
?
導入mysql鏡像
docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar
docker run --privileged=true --name mysql8 --restart=unless-stopped -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf/:/etc/mysql/conf.d -v /usr/local/mysql/mysql-files:/var/lib/mysql-files -d mysql:latest
docker ps
在容器中登錄mysql
docker exec -it mysql8 /bin/bash
?mysql -u root -p123456
對root用戶進行本地授權和配置密碼
use mysql
update user set host = '%' where user = 'root' and host='localhost';
grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
select host,user from user where user = 'root';
flush privileges;
ALTER user 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
mysql> exit;
Bye
bash-4.4# exit;
安裝mysql 客戶端?
sudo yum install -y mysql
可以訪問了
創建數據庫
create database?business_chatgpt;
?
導入表結構:
mysql -uroot -h172.16.108.44 -P3306 -p***** business_chatgpt < /opt/dockerinstall/mysql/table.sql
MySQL主從配置
由于擔心單點的mysql會有風險,所以需要部署一個mysql 的slave
由于已經在44上部署了mysql,所以只能修改配置后在43上再部署一個mysql的從庫
?
第一步:修復主庫配置
你的現有主庫容器?缺少關鍵的主從復制配置,需要補充以下內容:
1. 創建主庫配置文件
在44宿主機?/usr/local/mysql/conf
?目錄下創建?my.cnf
?文件:
?
[mysqld]
# 主庫核心配置
# 主庫唯一標識(必須)
server-id = 1
# 二進制日志配置(必須)
log-bin = mysql-bin
# 推薦使用ROW模式保證數據一致性
binlog_format = ROW# GTID 配置(MySQL 8 推薦)
# 開啟全局事務標識
gtid_mode = ON
# 強制GTID一致性
enforce_gtid_consistency = ON# 允許所有IP連接(生產環境建議限制IP)
bind-address = 0.0.0.0
port = 3306# 日志管理
# 7天 日志生命周期
binlog_expire_logs_seconds = 604800
# 單個binlog文件大小
max_binlog_size = 2G
# 每個連接binlog緩存
binlog_cache_size = 2M# 性能優化
# 平衡性能與可靠性
innodb_flush_log_at_trx_commit = 2
# 降低磁盤同步頻率
sync_binlog = 1000
docker ps?
2. 重啟主庫容器
docker restart mysql8
?
第二步:創建主庫復制賬號
?
mysql -uroot -h172.16.108.44 -P3306 -p*****? ? // 登錄mysql
?
-- 執行 SQL
CREATE USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'Replica*****';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
第三步:準備從庫容器
在43服務器上
導入mysql鏡像
docker load -i /data/dockerinstall/mysql/mysql-8.1.0.tar
1. 創建從庫配置文件
mkdir -p /usr/local/
mysql/{conf,
data,logs,mysql-files}
chmod -R 777 /usr/local/mysql
在宿主機?/usr/local/mysql/conf
?目錄下創建?my.cnf
:
[mysqld]
# 必須全局唯一
server-id = 2
relay-log = relay-bin
read_only = ON
super_read_only = ON# 安全增強
skip_name_resolve = ON
log_bin_trust_function_creators = ON# 性能優化
innodb_buffer_pool_size = 1G # 根據內存調整
sync_binlog = 1000
innodb_flush_log_at_trx_commit = 2
啟動命令
?
docker run --privileged=true --name mysql8-slave --restart=unless-stopped -e MYSQL_ROOT_PASSWORD=***** -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf/:/etc/mysql/conf.d -v /usr/local/mysql/mysql-files:/var/lib/mysql-files -d mysql:latest
docker ps
1. 主庫創建數據快照(主庫機器)
docker exec mysql8 mysqldump -uroot -p****? --all-databases ?--single-transaction ?--master-data=2 ?--flush-logs ?--hex-blob ? --set-gtid-purged=ON ?> master_full_$(date +%F).sql
scp master_full_2025-03-19.sql root@bigdata43:/data/dockerinstall/mysql/
3. 從庫機器導入數據
?
# 導入數據 docker exec -i mysql8-slave mysql -uroot -p**** < /data/dockerinstall/mysql/master_full_2025-03-19.sql
?
四、配置主從復制
1. 獲取主庫連接信息
# 主庫機器執行
docker exec mysql8 mysql -uroot -p**** -e "SHOW MASTER STATUS\G"![]()
記錄:
-
File:?
mysql-bin.00000X
-
Position:?
XXX
-
或使用 GTID 自動定位
?
2. 配置復制通道(從庫機器)
docker exec -it mysql8-slave mysql -uroot -p123456CHANGE MASTER TO MASTER_HOST='172.16.108.44', MASTER_PORT=3306, MASTER_USER='replica', MASTER_PASSWORD='Replica@1234', MASTER_AUTO_POSITION=1, MASTER_CONNECT_RETRY=10, GET_MASTER_PUBLIC_KEY=1;-------------------------------------------------- 遇到問題: 問題1: ERROR 1777 (HY000): CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 cannot be executed because @@GLOBAL.GTID_MODE = OFF. 參考:Mysql8 MHA高可用搭建之主從復制配置-CSDN博客
1.在所有主從實例結構中執行:
set?global?ENFORCE_GTID_CONSISTENCY = WARN;
##說明,這是一個警告模式,如果有還沒有執行完的sql
2.如果沒有警告,所有實例中執行:
set global ENFORCE_GTID_CONSISTENCY = ON;
主:
從:
3.在所有實例中執行:
set global GTID_MODE = OFF_PERMISSIVE;
主
從
4.在所有實例中執行:
set global GTID_MODE = ON_PERMISSIVE;
5,在所有主從實例中執行,檢查是否還有事務沒有結束:
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
#注意value一定要為0
6.檢查slave的binlog點位,如果還沒有應用完binlog,則需等待
show slave status\G;
7.在所有實例中執行:
set global GTID_MODE = ON;
?
8、再次執行上面的sql就ok
------------------------------------------------------------------------------------------------------------
?
六、驗證與監控
?
安裝mysql 客戶端?
sudo yum install -y mysql
1. 基礎驗證
docker exec mysql8-slave mysql -uroot -p123456 -e "SHOW SLAVE STATUS\G" | grep -E 'Running|Behind|Error' 期望輸出:
2、在從庫執行
SHOW SLAVE STATUS\G;
三、GTID 深度驗證
1. 對比主從 GTID 集合
?
主庫執行
SELECT @@GLOBAL.gtid_executed AS master_gtid;
從庫執行
SELECT @@GLOBAL.gtid_executed AS slave_gtid;
正常情況:
從庫的?slave_gtid
?應包含主庫的?master_gtid
,且兩者差異僅為主庫新產生的事務。