找到docker安装的mysql的配置文件以及存放数据文件的文件夹路径
默认的配置文件路径:/etc/mysql
默认的数据文件存放路径:/var/lib/mysql
这一块需要视自己情况而定
在宿主机新建对应的配置文件和数据文件存放路径,等下需要挂载到容器里
我建的路径分别是
配置文件路径:/dockermysql/3305/conf/mysql
数据文件存放路径:/dockermysql/3305/data/mysql
因为需要安装两个mysql,所以我用端口3304和3305当做文件夹名
这样做的原因在于第一个是方便修改配置文件,另一个就是防止出现意外数据丢了找不到了
测试过程中,mysql的配置文件修改失败之后,容器就起不来了,也进不去容器内部
将容器复制出两个路径里面的文件
docker cp {CONTAINER ID}:/var/lib/mysql /dockermysql/3304/data
docker cp {CONTAINER ID}:/etc/mysql /dockermysql/3304/conf
注意:3304和3305两个都要复制出来,也就是上面的两条语句各执行两次
有人发现这里的第三步和第四步有问题,不执行第四步运行容器就无法执行第三步的复制路径,不执行第三步复制路径就无法执行第四步的挂载,貌似是这样的,我用的笨方法就是再起一个测试的mysql,复制出里面的文件之后就关掉,这样文件就有了,愉快的执行第四步
启动两个容器,这一步看不懂的可以见上一篇安装mysql的教程 docker 运行mysql
docker run -d -p 3304:3306 --restart=always --privileged=true --name mysql3304 -v /dockermysql/3304/conf/mysql:/etc/mysql -v /dockermysql/3304/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=×××× -d mysql:5.7
docker run -d -p 3305:3306 --restart=always --privileged=true --name mysql3305 -v /dockermysql/3305/conf/mysql:/etc/mysql -v /dockermysql/3305/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=×××× -d mysql:5.7
连接mysql试一下:
mysql -h127.0.0.1 -P3304 -uroot -p
mysql -h127.0.0.1 -P3305 -uroot -p
到此,准备工作完成。
我们这里使用3304端口的mysql当做主,3305当做从,下面就以3304,3305当做别名
修改3304的配置文件,因为挂载的宿主机的目录,所以直接修改挂载目录下面的配置文件就行了。
我们先看下这里的mysql的配置文件
docker安装的mysql和直接安装的mysql的配置文件有点不一样
这里引入的是同级目录下的两个文件夹(有人说:这哪里是同级了?我们当前在宿主机,看上去不在同级,但是文件是需要挂载到容器里面的,在容器里面就是同级了,我们一定要按照容器里面的目录来计算)
分别打开看看,最终确定我们需要修改的配置文件是 mysql.conf.d/mysqld.cnf 文件
修改3304也就是主mysql的配置文件:
vim /dockermysql/3304/conf/mysql/mysql.conf.d/mysqld.cnf
[mysqld]#在下面增加
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1,一般取IP最后一段
server-id=3304
修改之后:
修改3305的配置文件:
vim /dockermysql/3305/conf/mysql/mysql.conf.d/mysqld.cnf
[mysqld]#在下面增加
#[非必须]开启二进制日志
log-bin=mysql-bin
#[必须]服务器唯一ID,默认是1
server-id=3305
修改之后的就不截图了,和3304的差不多
重启两台mysql:
docker restart {CONTAINER ID}
登录3304,建立帐户并且授权:
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '3304'@'%' IDENTIFIED BY '*****';
刷新权限:
FLUSH PRIVILEGES;
登录3304,查看master的状态:
mysql> show master status;
记录下这两个值之后退出,后面会用到,不要记错了
登录3305并执行sql:
mysql> change master to master_host='***.***.***.***',master_user='刚刚在3304上新建的用户',master_password='******',master_port=3304,master_log_file='上一步记录的file',master_log_pos=上一步记录的position;
这一步很重要,也很坑,开始的时候我用的ip是127.0.0.1,到后面查看状态的时候出错了,查看log说的是连接不上,网上各种说密码错了,或者是非3306端口需要配置什么的,统统试了一遍,还是不行。最后确认问题,这里不能写127.0.0.1,因为我们用的是容器,3305里面的127肯定连上不3304。我写的是公网ip,不知道使用3304在宿主机里面的内网ip能不能成功。
开启复制功能:
mysql> start slave;
查看状态:
mysql> show slave status\G;
两个yes表示成功,失败的话下面的字段会给出错误码和错误的原因,对应着排除就好了。
测试是否成功,使用navicate登录两台mysql,在3304上新建数据库数据表,新增数据,看3305上是否也会新建对应的数据,我这边是成功的。
至此,全部完成。
本文有很多地方是借鉴别人的博文的,算是半原创吧,有错误请评论指出,欢迎转载,注明出处:https://blog.csdn.net/wb_json/article/details/103662945!!!