当前位置: 首页 > article >正文

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


http://www.kler.cn/a/596241.html

相关文章:

  • ubuntu忘记密码问题解决。进入恢复模式修改密码
  • MySQL和Oracle所学的知识点相通吗?
  • 零基础入门机器学习:用Scikit-learn实现鸢尾花分类
  • 如何优化 TCP/IP 的 NCCL 通信
  • 【课堂笔记】定理:样本越多,测量的经验损失越接近真实损失
  • vscode终端不识别npm 无法解析npm
  • 对 Docker 理解的补充 docker容器虚拟化技术有什么用?怎么使用?
  • STT-MRAM CIM 赋能边缘 AI:高性能噪声鲁棒贝叶斯神经网络宏架构详解
  • 日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(25):解释说明:という
  • 手动集成sqlite的方法
  • SpringSecurity配置(自定义认证过滤器)
  • Oracle转化为MySQL数据库
  • 当下主流 AI 模型对比:ChatGPT、DeepSeek、Grok 及其他前沿技术
  • cfca 申请国密证书流程
  • 面试总结之Android Bitmap 深度解析与性能优化
  • 第9章:Docker Compose企业级多容器编排
  • 19.课程发布-freeMarker
  • 读取Table的结构转换为Model类
  • kOps + Karpenter 集成实践:实现 K8s 集群的动态扩展
  • [Vue]条件渲染