mysql主从复制

思路

  • 创建主服务器,配置mysql
  • 创建从服务器,配置mysql
  • 主服务器中创建用户slave,复制master status 的文件名和position
  • 改变从服务器的master配置
  • 开启从服务器的slave

编辑mysql配置

编辑master配置,/Users/pan/code/docker/mysql/master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysqld]
## 设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-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

编辑slave配置,/Users/pan/code/docker/mysql/slave

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(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

生成服务器

生成主服务器

1
docker run --name mysql_master -v /Users/pan/code/docker/mysql/master:/etc/mysql/conf.d -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

生成从服务器

1
docker run --name mysql_slave -v /Users/pan/code/docker/mysql/slave:/etc/mysql/conf.d -p 33307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

进入主服务器

1
docker exec -it mysql_master /bin/bash

创建mysql用户,授予权限

1
2
3
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
这里主要是要授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限。

获取master 的 file 和position

1
show master status;

进入从服务器

改变从服务器的master连接

1
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=929, master_connect_retry=30;  

命令解释:

  • master_host: Master 的IP地址
  • master_user: 在 Master 中授权的用于数据同步的用户
  • master_password: 同步数据的用户的密码
  • master_port: Master 的数据库的端口号
  • master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
  • master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
  • master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。

在 Slave 的 MySQL 终端执行查看主从同步状态

1
show slave status \G;

SlaveIORunning 和 SlaveSQLRunning 是No,表明 Slave 还没有开始复制过程。相反 SlaveIORunning 和 SlaveSQLRunning 是Yes表明已经开始工作了

执行以下命令,开始开启主从同步:

1
2
start slave;
show slave status \G;

有时start slave的时候会提示caching_sha2_password相关的错误,多试几次貌似就可以了