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
#expire_logs_days=7
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,同一局域网中需要唯一
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
[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 |
容器名称 |
创建数据同步用户
# 进入容器内部,并连接mysql
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. 主从同步
查看主库状态
# 进入容器内部,并连接mysql
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 | |
+-----------------------+------------+--------------+------------------+-------------------+
复制代码
配置从库
# 进入容器内部,并连接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.增加新节点
停止一个从库的主从复制
# 进入容器内部,并连接mysql
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;
开启第一步关闭的从库的主从复制
近期评论