环境
1、macbook
2、docker 20.10.17
3、docker desktop
开始搭建
* 第一步:准备容器文件存放的物理文件地址目录(/Users/qeek/mydata 可以按需定义)
##### 主库
mkdir -pv /Users/qeek/mydata/mysql-master/log
mkdir -pv /Users/qeek/mydata/mysql-master/data
mkdir -pv /Users/qeek/mydata/mysql-master/conf.d
mkdir -pv /Users/qeek/mydata/mysql-master/conf
##### 从库
mkdir -pv /Users/qeek/mydata/mysql-slave/log
mkdir -pv /Users/qeek/mydata/mysql-slave/data
mkdir -pv /Users/qeek/mydata/mysql-slave/conf.d
mkdir -pv /Users/qeek/mydata/mysql-slave/conf
* 第二步:docker desktop(docker桌面管理工具)-> Preferences -> Resources -> File sharding
把上面新创建的目录添加进去后重启docker(绑定宿主机目录到docker容器中),否则会报目录权限问题。
* 第三步:设置主从服务配置
##### 主库
新增 /Users/qeek/mydata/mysql-master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
##### 从库
新增 /Users/qeek/mydata/mysql-slave/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
* 第四步:启动docker mysql服务
##### 主库
* docker run --name mysql-master -p 3307:3306 -v /Users/qeek/mydata/mysql-master/log:/var/log/mysql -v /Users/qeek/mydata/mysql-master/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-master/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31
##### 从库
* docker run --name mysql-slave -p 3308:3306 -v /Users/qeek/mydata/mysql-slave/log:/var/log/mysql -v /Users/qeek/mydata/mysql-slave/data:/var/lib/mysql -v /Users/qeek/mydata/mysql-slave/conf.d:/etc/mysql/conf.d/ -v /Users/qeek/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.31
##### 查看docker镜像清单
docker container ls -a
##### 进入docker 主库镜像内
docker exec -it mysql-master bash
##### 进入docker 主库mysql内
mysql -u root -p
##### 主库内设置从库读取数据账号
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
##### 主库内授权账号复制权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
##### 主库内设置密码加密方法(mysql8.0.4之前使用的“ mysql_native_password”认证,之后用的“ caching_sha2_password”,修改成老的加密认证方式)
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
##### 查看mysql master主库状态,记住“File”和“Position”值
##### "exit;"退出主库mysql,再"exit;"退出mysql主库镜像
##### 查看mysql主库docker镜像内ip地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master
##### 进入mysql从库镜像内
docker exec -it mysql-slave bash
##### 进入从库mysql内
mysql -uroot -p
设置从库的主库地址及日志文件、当前数据位置“master_log_file = 上面 File ”、“master_log_pos = 上面 Position”
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mall-mysql-bin.000005', master_log_pos=157, master_connect_retry=30;
##### 启动从库同步