当前位置: 代码网 > it编程>数据库>Mysql > Docker搭建Mysql8的主从复制实例代码

Docker搭建Mysql8的主从复制实例代码

2026年05月09日 Mysql 我要评论
通过docker部署mysql主从复制,docker安装在前篇有,直接演示:拉取镜像# 获取有哪些镜像docker search mysql# 拉取mysql镜像docker pull mysql:8

通过docker部署mysql主从复制,docker安装在前篇有,直接演示:

拉取镜像

# 获取有哪些镜像
docker search mysql

# 拉取mysql镜像
docker pull mysql:8.0.32

# 查看镜像
docker images

主节点的配置

创建数据存储目录

mkdir -p /docker/mysql/master/data

创建日志目录

mkdir -p /docker/mysql/master/logs

创建配置文件目录

mkdir -p /docker/mysql/master/conf

进行快速启动 - 查看镜像是否有问题 注:不同的版本的配置文件位置不同,可通过快速创建,查看mysql的对应的配置文件位置,进行对应映射。

# 快速启动  -d是进行守护进程启动
docker run -p 3306:3306 --name mysql8 -e mysql_root_password=123456 -d mysql:8.0.32
 
# 启动成功后,进入容器内部拷贝配置文件,到宿主主机
docker cp  mysql8:/etc/mysql /docker/mysql/master/conf
 
# 删除刚才的容器,重新创建容器
docker stop mysql8
docker rm mysql8

运行容器

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.32 --init-connect="set collation_connection=utf8mb4_0900_ai_ci" --init-connect="set names utf8mb4" --skip-character-set-client-handshake 

进入容器

docker ps -a
docker exec -it mysql_master /bin/bash
docker exec -it mysql_master env lang=c.utf-8 /bin/bash # 进入容器,这种进入避免显示中午乱码

# 打开mysql,输入密码
mysql -uroot -p
# 查看数据库
show databases;
# 创建数据库
create database 数据库;

# 如果远程链接失败,可以修改默认密码校验方式(第三方工具可以连接上)
alter user 'root'@'%' identified  with mysql_native_password by '密码';

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

# 在mysql下执行
use mysql;
# 创建对外访问的用户和权限
create user '用户名'@'%' identified with mysql_native_password by '密码';
# 授权全部的权限(范围大)
# grant all on *.* to '用户名'@'%' with grant option;
# 刷新权限
flush privileges;

# 退出
exit

创建自定义的配置文件(主服务器配置文件)

cd /docker/mysql/master/conf
touch my.cnf

my.cnf文件内容:

[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 默认是1
server-id=1
# 设置不要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 设置需要复制的数据库(先创建好)
binlog-do-db=数据库名
# 启用二进制日志,日志的存放地址(默认是binlog),就是在show master status;看到filed名字
log-bin=/var/lib/mysql/mysql-bin
# 主机,1 只读 0 读写(默认是0)
read-only=0
# 设置logbin格式 有3种格式 
# statement(函数支持不好) 写指令,会出现主从数据不同步,now()函数
# 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

重启mysql容器

docker ps -a
docker restart 容器id

创建用户并授权给从机

主机创建用户:

# 连接上mysql服务,执行
create user '用户名'@'%' identified with mysql_native_password by '密码';
# 授权复制的权限 on后的*.*代表全部的库和表
grant replication slave on *.* to '用户名'@'%';
# 刷新权限
flush privileges;

# 如果远程链接失败,可以修改默认密码校验方式(第三方工具可以连接上)
alter user '用户名'@'%' identified with mysql_native_password by '密码';

查询主机的状态:

show master status;
# 执行上面命令,得到 file(binlog日志) position(接入点) binlog_do_db(要复制的数据库) binlog_ignoredb()
# 需要记录一下file、position

从节点配置

创建数据目录

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

mysql.cnf文件内容:

[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

运行容器

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.32 --init-connect="set collation_connection=utf8mb4_0900_ai_ci" --init-connect="set names utf8mb4" --skip-character-set-client-handshake 

进入容器

docker ps -a
docker exec -it mysql_slave /bin/bash

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

# 打开mysql,输入密码
mysql -uroot -p
# 查看数据库
show databases;
# 创建数据库
create database 数据库;
# 查看数据库
# 在mysql下执行
use mysql;
# 创建对外访问的用户和权限
create user '用户名'@'%' identified by '密码';
grant all on *.* to '用户名'@'%' with grant option;
flush privileges;

# 退出
exit

设置同步信息

# 停止同步(之前配置过,需要执行)
stop slave;

# 设置同步
change master to master_host='主机ip地址',
master_port=端口,
master_user='主机用户',master_password='主机用户的密码',
master_log_file='binlog日志名字',
master_connect_retry=30,
master_log_pos=具体的接入点值;

# master_connect_retry 是如果连接失败,重试时间间隔,默认60秒

如果操作失败,需要重新配置,执行下面2个命令

stop slave;    # 停止同步操作
reset master;  # 重置主从配置,删除之前的中继日志,会再生成一份新的

开始同步

start slave;

检查是否成功

show slave status \g;  # 检查状态
# 如果结果下面的字段为yes 代表配置成功
- slave_io_running: yes
- slave_sql_running: yes

停止和重置

# 从机上执行,停止i/o 线程和sql线程的操作
stop slave; 

# 从机上执行,用于删除slave数据库的relaylog日志文件,并重新启用新的relaylog文件
reset slave;

# 主机上执行,删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件
reset master;

验证

# 从主机上,创建表、插入sql语句
# 创建表
create table `emp` (
  `id` int(11) not null comment '主键',
  `name` varchar(255)  default null comment '员工名',
  `age` int(11) default null comment '年龄',
  `did` int(11) default null comment '部门id',
  primary key (`id`)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment='部门表';
insert into emp (`id`, `name`, `age`, `did`) values (1, '刘备', 55, 1);
# 分别 在主机和从机进行查询该sql语句
select * from  emp;
# 如:都看到相同的数据,代表成功

常见问题

启动主从同步后,常见错误是slave_io_running: no 或者 connecting 的情况,此时查看下方的 last_io_error错误日志,根据日志中显示的错误信息在网上搜索解决方案即可

一 常见错误:

`last_io_error: got fatal error 1236 from master when reading data from binary log: 'client requested master to start replication from position > file size'`

解决:

-- 在从机停止slave
slave stop;

-- 在主机查看mater状态
show master status;
-- 在主机刷新日志
flush logs;
-- 再次在主机查看mater状态(会发现file和position发生了变化)
show master status;
-- 修改从机连接主机的sql,并重新连接即可

二:启动docker容器后提示 warning: ipv4 forwarding is disabled. networking will not work.

解决:

#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

总结 

到此这篇关于docker搭建mysql8主从复制的文章就介绍到这了,更多相关docker搭建mysql8主从复制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com