1.下载镜像,这里使用MySQL8.0.18
docker pull mysql:8.0.18
2.主库
创建my.cnf
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
创建容器
sudo docker run -d --privileged=true \
-v /community/mysql/master/conf:/etc/mysql \
-v /community/mysql/master/logs:/var/log/mysql \
-v /community/mysql/master/data:/var/lib/mysql \
-v /community/mysql/master/my.cnf:/etc/mysql/my.cnf \
-p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18
参数说明
参数 | 说明 |
---|
-d | 后台运行 |
-v | 挂载文件或文件夹 |
-p | 端口映射 |
-e | 环境变量设置 |
--privileged=true | 拥有root权限 |
--name | 容器名称 |
创建数据同步用户
docker exec -it mysql mysql -uroot -p
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
3.从库
创建从库容器
sudo docker run -d --privileged=true \
-v /community/mysql/slave1/conf:/etc/mysql \
-v /community/mysql/slave1/logs:/var/log/mysql \
-v /community/mysql/slave1/data:/var/lib/mysql \
-v /community/mysql/slave1/my.cnf:/etc/mysql/my.cnf \
-p 3305:3306 --name=mysqlslave -e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.18
4. 主从同步
查看主库状态
docker exec -it mysql mysql -uroot -p
mysql> show master status;
+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+
| mall-mysql-bin.000003 | 1044876395 | | mysql | |
+
配置从库
docker exec -it mysqlslave mysql -uroot -p
change master to master_host='10.0.0.165',\
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000003', \
master_log_pos=1044876395, master_connect_retry=30
参数 | 说明 |
---|
master_host | 主库IP |
master_user | 同步的用户 |
master_password | 同步的密码 |
master_port | 同步的端口 |
master_log_file | show master status;查出来的File |
master_log_pos | show master status;查出来的Position |
master_connect_retry | 连接失败重试的时间间隔,单位为秒。 |
show slave status \G
start slave
- 当Slave_IO_Running和Slave_SQL_Running都为YES时就是成功
5.测试
6.增加新节点
停止一个从库的主从复制
docker exec -it mysqlslave mysql -uroot -p
stop slave
show slave status \G
备份当前从库的所有数据
mysqldump -uroot -p --all-databases > sqlfile.sql
- ps: 之前创建容器的时候,映射有文件夹,这条命令可以在有映射文件夹的地方执行,这样能直接在外面拿到sqlfile.sql ,也可以使用docker cp命令将sqlfile.sql文件拷贝出来
将导出的数据,导入新库里面
source /var/log/mysql/sqlfile.sql;
设置主库同步
change master to master_host='10.0.0.165', \
master_user='slave', master_password='123456',\
master_port=3306, master_log_file='mall-mysql-bin.000004', \
master_log_pos=37642095, master_connect_retry=30
参数 | 说明 |
---|
master_log_file | 对应从库状态查询出来的Relay_Master_Log_file |
master_log_pos | 对应从库状态查询出来的Exec_Master_Log_Pos |
开启同步
start slave
- 查看状态
show slave status \G;
开启第一步关闭的从库的主从复制