阿里云服务器环境部署 四 MySQL主从配置
安装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 -p123456 CHANGE 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
,且两者差异仅为主库新产生的事务。