1:docker配置
#拉取mysql镜像
docker pull mysql
#创建docker容器互联,新建网络
docker network create -d bridge my-net
#使用mysql镜像创建两个mysql服务器容器,
#设置密码123456,设置端口映射到本地,设置容器互联网络my-net
docker run --name mysql-2 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3307:3307 --network my-net mysql
docker run --name mysql-1 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 --network my-net mysql
2:mysql配置
由于容器内没有vim等编辑命令,所以临时使用docker desktop软件,配置mysql的配置文件/etc/my.conf,设置主从。
#配置容器mysql-1 /etc/my.conf
port=3306
server-id=1
log-bin=mysql-bin
binlog-format=row
#配置容器mysql-2 /etc/my.conf
port=3307
server-id=2
relay-log=mysql-relay-bin
配置完成重启两个容器
3:测试mysql连接和设置复制数据的账号
#主库配置
#创建复制账号
CREATE USER repl@localhost IDENTIFIED BY'123456';
CREATE USER repl@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON . TO repl@'localhost';
GRANT REPLICATION SLAVE ON . TO repl@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR repl @'%';
SHOW GRANTS FOR repl @'localhost';
#查看主库的bin log
SHOW VARIABLES LIKE '%log_bin%';
SHOW BINARY LOGS;
SHOW BINARY LOG STATUS
#查看从库
SHOW REPLICAS;
#从库配置
#停止复制进程
STOP REPLICA;
#创建复制配置
#使用docket inspect mysql-1查看容器mysql-1主库的ip为172.18.0.3
CHANGE REPLICATION SOURCE TO SOURCE_HOST = '172.18.0.3',
SOURCE_PORT = 3306,
SOURCE_USER = 'repl',
SOURCE_PASSWORD = '123456',
SOURCE_LOG_FILE = 'mysql-bin.000002',
SOURCE_LOG_POS = 358;
#开始复制进程
START REPLICA;
#查看复制进程状态
#########################
######重要################
#可以根据这个判断复制进程的状态和信息,例如失败,失败原因等
SHOW REPLICA STATUS;
4:遇到的错误
1:原本没有创建容器网络,所以容器之间是没有网络的,不是属于同一网络
docker network create -d bridge my-net
2:由于没有创建网络,所以以为可以通过映射到本地的端口配置复制
错误:CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'local'
正确:CHANGE REPLICATION SOURCE TO SOURCE_HOST = '172.18.0.3'
3:原本是不使用docker的,想在本地机器,开启两个mysql服务,发现不可以,只能开启一个
4:SHOW REPLICA STATUS;提示密码不安全,这时候需要去容器mysql-2里面执行
mysql -u repl -p123456 -h 172.18.0.3 -P3306 --get-server-public-key
获取到容器mysql-1的mysql服务公钥
5:SHOW REPLICA STATUS;可以查看具体的错误信息,应该是在字段Last_IO_Error
6:由于版本较新mysql 9了,SHOW MASTER STATUS;已经被弃用了,改为SHOW REPLICAS;
本文只是为了测试主从,不能作为正式配置。
发表回复