使用docker实现mysql 8.0主从复制

使用docker实现mysql 8.0主从复制

1.首先运行 docker pull mysql8.0 拉取镜像

docker pull mysql8.0

2.运行 docker images查看镜像,如果存在mysql 8.0那就可以进行下一步

docker images

 

 

 3.使用docker创建mysql主容器,运行下列命令 

docker run --name master -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

–name 为容器指定名称,这里是master
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3310端口

-e 设置环境变量,这里是指定root账号的密码为root

-d 后台运行容器,并返回容器ID

mysql:8.0 指定运行的mysql版本

 

 

 4.检验是否启动成功,运行命令docker ps -a

 docker ps -a

 

 

 开放端口

firewall-cmd --zone=public --add-port=3310/tcp --permanent

firewall-cmd --reload

–permanent 永久开启,避免下次开机需要再次手动开启端口

使用Navicat连接测试

 

 

 

 

5.修改MySQL配置环境

目录结构如下

/usr/local/mysql/master

/usr/local/mysql/slave

拷贝一份MySQL配置文件

docker cp master:/etc/my.cnf /usr/local/mysql/master/my.cnf

注意:有些人的my.cnf文件在不同的位置,可以通过docker exec -it 容器的NAMES /bin/bash进入docker查看对应位置

修改my.cnf,在 [mysqld] 节点最后加上后保存

log-bin=mysql-bin
server-id=100

修改完成后按esc,然后:wq保存退出

最后通过反拷贝文件

docker cp /usr/local/mysql/master/my.cnf master:/etc/my.cnf

让docker里面的文件被修改后的配置文件覆盖

重启 mysql 的docker , 让配置生效

docker restart master

 

6.运行MySQL从容器slave

同上,首先运行从容器slave

docker run --name slave -p 3311:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

开放对应端口

同上

查看所有容器

 

 

 拷贝一份MySQL配置文件

docker cp slave:/etc/my.cnf /usr/local/mysql/slave/my.cnf

修改slave里面的my.cnf,在 [mysqld] 节点最后加上后保存

然后反拷贝覆盖

docker cp /usr/local/mysql/slave/my.cnf slave:/etc/my.cnf

重启 mysql 的docker , 让配置生效

docker restart slave

7.配置主从复制

1.创建用户

使用Navicat登录MySql数据库,执行下面命令:

create user 'xiaoming'@'%' identified WITH 'mysql_native_password' by 'Root@123456';

注:这里表示创建一个不限制ip登录的用户 xiaoming
该用户的密码是 Root@123456
%代表不限制ip登录

mysql_native_password是因为在MySQL8.0之前,身份验证的插件是mysql_native_password,在MySQL 8.0中,caching_sha2_password 是默认的身份验证插件,安全性更高,如果不加的话有可能会报错,详情请参考该博客

https://blog.csdn.net/weixin_30647423/article/details/114816675?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165985551216782248526570%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165985551216782248526570&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-114816675-null-null.142^v39^control,185^v2^tag_show&utm_term=%E4%BB%8E%E5%BA%93%E8%BF%9E%E6%8E%A5%E4%B8%BB%E5%BA%93%E6%8A%A5%E9%94%99Authentication%20plugin%20caching_sha2_password%20reported%20error%3A%20Authentication%20requires%20secure%20connection&spm=1018.2226.3001.4187

2.给用户授权

GRANT REPLICATION SLAVE ON *.* TO xiaoming;

3.刷新权限,每一次权限更改后都刷新一下

flush privileges;

第四步:登录master MySql数据库,执行下面SQL,记录下结果中File和Position的值

show master status;

第五步:使用Navicat登录slave sql数据库,执行以下命令:

change master to master_host='XXX',master_user='xiaoming',master_password='Root@123456',master_port=3310, master_log_file='mysql-bin.000004',master_log_pos=85320;

MASTER_HOST 填公网ip

MASTER_PORT 主容器的端口

MASTER_USER 同步账号的用户名

MASTER_PASSWORD 同步账号的密码

master_log_file 为第四步中的 File 值,master_log_pos为第四步中的Position值

最后查看从数据库的状态

show slave status;

Slave_IO_State 如果是Waiting for master to send event,那么就成功一半了,如果是Connecting to master,基本就是配置失败了,建议重新检查下配置,具体失败的原因可以查看日志追踪

docker logs slave1 -f

 

 

接着上文,我们说成功一半,并没有说成功了,那么另一半在于Slave_IO_Running与Slave_SQL_Running

如果都是Yes的话,那么恭喜你,可以测试主从复制的效果了,如果有一个不是Yes,一半是重启从容器后,事务回滚引起的,那么给出解决方法如下

stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;

如果连接出问题,可以查看https://blog.csdn.net/CN_LiTianpeng/article/details/108663191?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165985683616780357298001%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165985683616780357298001&biz_id=&utm_medium=distribute.pc_search_result.none-task-code-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-108663191-0-null-null.142^v39^control,185^v2^tag_show&utm_term=This%20operation%20cannot%20be%20performed%20with%20a%20running%20slave%20io%20thread%3B%20%20run%20STOP%20SLAVE%20IO_THREAD%20FOR%20CHANNEL%20%20first.进行解决

同时成立,那么我们就可以进行测试了

 

 

在主库创建test数据库,刷新从库发现同步更新了,恭喜你成功实现主从复制

 

posted @ 2022-08-07 16:30  Aegeansea666  阅读(300)  评论(0编辑  收藏  举报