使用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数据库,刷新从库发现同步更新了,恭喜你成功实现主从复制