#--name指定运行之后的容器的名称为mysql-master; #--privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限; #-v指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的; #-p表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口; #-e表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码; #-d参数指定了当前容器是在后台运行。 #mysql:latest mysql最新版本, docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Root2021 -d mysql:latest docker ps docker exec -it mysql-master /bin/bash mysql -uroot -pRoot2021 create user 'testSlave'@'%' identified by 'Root2021'; #这里是我之前创建过一次,所以出现用户已经存在,删掉重新创建就好了 drop user'testSlave'@'%'; create user 'testSlave'@'%' identified by 'Root2021'; #这里需要指定 mysql_native_password 不然文章结尾有踩坑经历 alter user 'testSlave'@'%' identified with mysql_native_password by 'Root2021'; flush privileges;
#接着在mysql-master命令行下执行 show master status;
这里不知道这两个值的含义,就顺便扒了以下主从复制的原理,来源 : 主从复制的原理
docker run --name mysql-slave --privileged=true -v /home/mysql/slave-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=Root2021 -d mysql:latest docker ps docker exec -it mysql-slave /bin/bash mysql -uroot -pRoot2021 #这里的master_log_file 与 master_log_pos 就是之前查看的master的值 change master to master_host='master', master_user='testSlave', master_password='Root2021', master_port=3306, master_log_file='binlog.000003', master_log_pos=1112, master_connect_retry=30; start slave; #这里也是因为我之前搭建过一次,所以重新拉起需要reset reset slave;
#查看从库连接状态 show slave status\G;
不出意外的话应该是下面这种情况
error : The slave I/O thread stops because master and slave have equal MySQL server ids
分别查看主从库的server_id 与 server_uuid,左边从库,右边主库,发现server_id一致
show variables like 'server_id'; show variables like '%server_uuid%';
修改从库server_id
set global server_id=2;
再次查看连接状态
进入主库
docker exec -it mysql-master /bin/bash mysql -uroot -pRoot2021 # ★★★★★记得切到mysql数据库★★★★★ use mysql; show grants for 'testSlave'@'%'; grant replication slave on *.* to 'testSlave'@'%'; show grants for 'testSlave'@'%';
修改完成后进入从库查看连接情况
docker exec -it mysql-slave /bin/bash mysql -uroot -pRoot2021 show slave status\G;
左边主库操作,右边从库查看
主库'testSalve'@'%'的密码加密方式不对,需要修改