docker安装MySQL主从及新增节点

1.下载镜像,这里使用MySQL8.0.18

1
复制代码docker pull mysql:8.0.18

2.主库

创建my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ini复制代码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

创建容器

1
2
3
4
5
6
7
bash复制代码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
1
2
bash复制代码# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p

  • 创建账号
1
2
sql复制代码CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';

3.从库

创建从库容器

1
2
3
4
5
6
7
bash复制代码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
  1. 主从同步

查看主库状态

  • 进入主库容器中的MySQL
1
2
bash复制代码# 进入容器内部,并连接mysql
docker exec -it mysql mysql -uroot -p
  • 查看主数据库状态
1
2
3
4
5
6
lua复制代码mysql> show master status;
+-----------------------+------------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+------------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 | 1044876395 | | mysql | |
+-----------------------+------------+--------------+------------------+-------------------+

配置从库

  • 进入从库中的MySQL
1
2
bash复制代码# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p

  • 在从数据库中配置主从复制
1
2
3
4
ini复制代码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 连接失败重试的时间间隔,单位为秒。
  • 查看主从同步状态
1
ini复制代码show slave status \G;
  • 开启主从同步
1
ini复制代码start slave;
  • Slave_IO_RunningSlave_SQL_Running都为YES时就是成功

5.测试

  • 在主库中创建数据库
  • 在从库中查看

6.增加新节点

停止一个从库的主从复制

1
2
3
4
5
6
7
8
ini复制代码# 进入容器内部,并连接mysql
docker exec -it mysqlslave mysql -uroot -p

# 停止主从同步
stop slave;

# 查看从库状态
show slave status \G;

备份当前从库的所有数据

1
css复制代码mysqldump -uroot -p --all-databases > sqlfile.sql
  • ps: 之前创建容器的时候,映射有文件夹,这条命令可以在有映射文件夹的地方执行,这样能直接在外面拿到sqlfile.sql ,也可以使用docker cp命令将sqlfile.sql文件拷贝出来

将导出的数据,导入新库里面

1
bash复制代码source /var/log/mysql/sqlfile.sql;

设置主库同步

1
2
3
4
ini复制代码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

开启同步

1
ini复制代码start slave;
  • 查看状态
  • show slave status \G;

开启第一步关闭的从库的主从复制

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%