【MySQL(二十)】mysql8 docker 主从 搭建

没做过DBA的工作,发现整一套mysql环境是真的难。。。本人用的mac,平时单机测试,用brew装了一个本地的mysql,这次想搞搞主从,就想着用二进制包在特定目录下搭建一下,发现各种坑。。。根本搭不起来。mysql不同版本的命令都不一样,而且有很多设定其实比较坑,比如有些参数必须是第一位,指定配置文件是--defaults-file而不是--default-file,这些命令你不研究研究官网,根本没法使,但是也没时间。。。没办法,后面决定用docker整了,这里记录下。

 

参考:https://segmentfault.com/a/1190000014736624

https://hub.docker.com/_/mysql/

 

1.拉docker镜像

docker pull mysql

然后创建两个配置文件:

master:

# 主库配置文件my-master.cnf
[mysqld]
log-bin = mysql-bin
server-id = 1

slave:

# 从库配置文件my-slave.cnf
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=2
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin  
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed  
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## 防止改变数据(除了特殊的线程)
read_only=1 

这里面的配置没有细研究,copy的。

 

2.启动mysql实例

docker run -d -e MYSQL_ROOT_PASSWORD=123123 --name mysql-master -v /Users/miracle/mysql/master:/etc/mysql/conf.d -v /Users/miracle/mysql/master/data:/var/lib/mysql -p 3307:3306 mysql
docker run -d -e MYSQL_ROOT_PASSWORD=123123 --name mysql-slave -v /Users/miracle/mysql/slave:/etc/mysql/conf.d -v /Users/miracle/mysql/slave/data:/var/lib/mysql -p 3308:3306 mysql

稍微解释一下:

-e参数,指定了docker容器的环境变量,这个是mysql镜像特有的,用于设定mysql实例的密码(这就很方便了,不需要我们再初始化,启动mysql了),具体可以看我之前发的第二个链接;

--name,指定docker容器实例名;

-v,这里挂载了两个文件,第一个是配置文件,这个需要按照docker官网格式来,也在我之前发的第二个链接里,注意并不是直接映射配置文件,而是映射配置文件所在的目录,这个也是一个坑;第二是data文件,挂载出来方便研究binlog格式。

-p,分别是宿主机的3307和3308端口,3306我自己还要用。

 

3.查docker实例的ip

docker inspect --format '{{ .NetworkSettings.IPAddress }}' 7c0ee452c8a9

后面的容器id需要替换

master:172.17.0.2

slave:172.17.0.3

 

4.设置master:

mysql -h127.0.0.1 -P3307 -uroot -p123123

这里用容器ip连不上,原因待考证

CREATE USER 'binlog'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
GRANT REPLICATION SLAVE ON *.* to 'binlog'@'%';

创建一个名为binlog的用户,并赋予赋值权限。

这里有两个坑,mysql8建用户时要使用WITH语法指定密码算法,不然后面slave连接会报错:Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

另外加权限命令,不能加identified by语句指定密码了,加了会报错,坑死。

show master status;

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

这些信息需要在slave消费binlog时用到。

 

5.设置slave:

change master to master_host='172.17.0.2', master_user='binlog', master_password='123123', master_port=3306, master_log_file='mysql-bin.003', master_log_pos=156, master_connect_retry=30;

start slave;

再使用如下命令确认状态:

show slave status \G;

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: binlog
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000003

如果state是waiting,应该没啥问题了,可以在master上建表试试了。

 

终于成功了,真的难,后面就能研究下binlog了。

你可能感兴趣的:(mysql)