Docker学习之路【八】安装主从复制MYSQL8

拉取MySQL镜像

bash 复制代码
#拉取MySQL镜像
docker pull mysql:8.0.37

创建存储目录

bash 复制代码
#创建数据存储目录
mkdir -p /docker/mysql/master/data
#创建日志目录
mkdir -p /docker/mysql/master/logs
#创建配置文件目录
mkdir -p /docker/mysql/master/conf

运行容器

bash 复制代码
docker run -p 3340:3306 --name mysql_master --privileged=true \
-v /docker/mysql/master/conf:/etc/mysql/conf.d \
-v /docker/mysql/master/logs:/var/log/mysql \
-v /docker/mysql/master/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.37 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake 

进入容器

bash 复制代码
docker exec -it mysql_master /bin/bash
mysql -uroot -p
#输入密码123456
#创建用于同步的数据库
create database db01;

配置远程连接(对外连接的)

bash 复制代码
# 在MySQL下执行
use mysql;
# 创建对外访问的用户和权限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'slave'@'%' WITH GRANT OPTION;
#修改认证方式
alter user 'slave'@'%' identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
# 退出
exit;

创建自定义的配置文件

bash 复制代码
cd /docker/mysql/master/conf
touch my.cnf
vim my.cnf

my.cnf文件内容

bash 复制代码
[client]
# mysql客户端默认字符集
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 跳过密码登录
#skip-grant-tables
#bind-address = 127.0.0.1
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
# mysql服务端默认字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
# datadir=/var/lib/mysql  

# 主服务器唯一ID
server-id=1
# 设置不要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 设置需要复制的数据库(先创建好)
binlog-do-db=db01
# 启用二进制日志,日志的存放地址
log-bin=/var/lib/mysql/mysql-bin
# 主机,1 只读 0 读写(默认是0)
read-only=0
# 设置logbin格式 有3种格式 
# 默认 STATEMENT(函数支持不好) 默认的 ROW(行模式大量修改效率不行,但支持存储引擎) MIXED (综合,推荐)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 二进制日志过期清理时间,默认是0(不自动清理)
expire_logs_days=7
# 单个二进制日志大小
max_binlog_size=200M
# 设置每隔多少次事务提交操作,将这些操作写入二进制日志文件
sync_binlog=1
# 使用mysql_native_password插件的认证
# default_authentication_plugin=mysql_native_password

重启容器

bash 复制代码
docker restart mysql_master
# 需要记录一下File、Position
show master status;
bash 复制代码
#查询结果
mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000002 |      730 | db01         | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)

配置从数据库节点

bash 复制代码
#创建数据目录
mkdir -p /docker/mysql/slave/data
#创建日志目录
mkdir -p /docker/mysql/slave/logs
#创建配置文件目录
mkdir -p /docker/mysql/slave/conf
#创建自定义的配置文件
cd /docker/mysql/slave/conf
touch my.cnf
vim my.cnf

my.cnf文件内容

bash 复制代码
[client]
# mysql客户端默认字符集
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 跳过密码登录
#skip-grant-tables
#bind-address = 127.0.0.1
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
# mysql服务端默认字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
# datadir=/var/lib/mysql  

# 从服务器唯一ID
server-id = 2  
# 开启中继日志
relay-log=mysql-relay
# 从机,1 只读 0 读写(默认是0)
read-only=1
# 启用二进制日志,日志的存放地址,如果从机变成主机可以继续使用bin日志
# log-bin=mysql-slave-bin
# 使用mysql_native_password插件的认证
# default_authentiction_plugin=mysql_native_password

运行容器

bash 复制代码
docker run -p 3341:3306 --name mysql_slave --privileged=true \
-v /docker/mysql/slave/conf:/etc/mysql/conf.d \
-v /docker/mysql/slave/logs:/var/log/mysql \
-v /docker/mysql/slave/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.37 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake 

进入容器

bash 复制代码
docker ps -a
docker exec -it mysql_slave /bin/bash
# 打开MySQL,输入密码
mysql -uroot -p
# 创建数据库
create database db01;

设置同步信息

bash 复制代码
CHANGE MASTER TO MASTER_HOST='ip地址',
MASTER_PORT=3340,
MASTER_USER='slave',MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_CONNECT_RETRY=30,
MASTER_LOG_POS=730;

开始同步

bash 复制代码
start slave;
show slave status \G;  # 检查状态
# 如果结果下面的字段为Yes 代表配置成功
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
相关推荐
sbjdhjd29 分钟前
云安全 | 从特权容器到旧版 runC:Docker 宿主机访问与运行时缺陷复盘
运维·网络安全·docker·云原生·kubernetes·云计算·云安全
Pocker_Spades_A2 小时前
Penpot自托管设计协作:Docker部署、MCP接入与Codex生成UI实操记录
ui·docker·容器
Lvan的前端笔记11 小时前
docker:每个前端项目一个 Nginx 容器还是只有一个Nginx容器
前端·nginx·docker
sbjdhjd16 小时前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
帷幕落秋18 小时前
Docker的两种安装
运维·docker·容器
工业一体机老司机18 小时前
工业一体机选购后的系统部署:Ubuntu下Docker容器化运行与GPIO配置
linux·ubuntu·docker·人机交互
姜鱼问生1 天前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
人生百态,人生如梦1 天前
Ubuntu在低版本下使用ccswitch+claudecode(CCSwitch+Docker+Claude)连调教程
linux·ubuntu·docker·claudecode·ccswitch
程序员老赵1 天前
Docker 部署 OpenViking:轻松搭建 AI Agent 上下文数据库平台
docker·开源·agent
吴声子夜歌1 天前
Docker入门与实战——高级镜像构建
docker