MySQL 主从复制原理
1.在服务器上建立以下目录
mysql/
├── master
│ ├── config
│ │ └── my.cnf
│ └── data
└── slave
├── config
│ └── my.cnf
└── data
2.编辑主从数据库配置my.cnf
2.1 主数据库
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql
lower_case_table_names=1
symbolic-links=0
#主服务器唯一ID
server-id=100
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#设置需要复制的数据库
#binlog-do-db=spring_boot
#设置logbin格式
#binlog_format=STATEMENT
2.2 从数据库
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql
lower_case_table_names=1
symbolic-links=0
#从服务器唯一ID
server-id=101
log-bin=mysql-bin
#启用中继日志
relay_log=edu-mysql-relay-bin
3. 使用 docker 搭建 mysql
#拉取镜像
docker pull mysql:5.7.29
#搭建主服务器
docker run --name mysql_master -p 23306:3306 --privileged=true \
-v /root/docker/mysql/master/config/my.cnf:/etc/mysql/my.cnf \
-v /root/docker/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29
#搭建从服务器
docker run --name mysql_slave -p 23307:3306 --privileged=true \
-v /root/docker/mysql/slave/config/my.cnf:/etc/mysql/my.cnf \
-v /root/docker/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.29
通过Navicat等连接工具连接数据库连接主服务器,
执行创建用户及授权命令:
create user 'slave'@'%' identified with mysql_native_password by '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
执行show master status;
获取以下结果
在服务器执行docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id
获取主服务器容器的独立ip
连接从服务器,执行以下命令
change master to master_host='172.17.0.4', # Master 的地址,指的是容器的独立 ip
master_user='slave', #用于数据同步的用户
master_password='123456', #用于同步的用户的密码
master_port=3306, # Master 的端口号,指的是容器的端口号
master_log_file='mysql-bin.000003', #指定 Slave 从哪个日志文件开始复制数据,即上图中的 File 字段的值
master_log_pos= 935, #从哪个 Position 开始读,即上图中的 Position 字段的值
master_connect_retry=30; #如果连接失败,重试的时间间隔,单位是秒,默认是60秒
执行start slave
通过show slave status
查看状态
红框里两个Yes代表搭建成功
搭建 MySQL 数据库主从复制(双主双从)
1. 双主机配置
Master1配置
#主服务器唯一ID
server-id=100
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#设置需要复制的数据库
#binlog-do-db=需要复制的主数据库名字
#设置logbin格式
#binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
Master2配置
#主服务器唯一ID
server-id=102 #启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#设置需要复制的数据库
#binlog-do-db=需要复制的主数据库名字
#设置logbin格式
#binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
2. 双从机配置
Slave1配置
#从服务器唯一ID
server-id=101
log-bin=mysql-bin
#启用中继日志
relay_log=edu-mysql-relay-bin
Slave2配置
#从服务器唯一ID
server-id=103
log-bin=mysql-bin
#启用中继日志
relay_log=edu-mysql-relay-bin
3. 双主机、双从机重启 mysql 服务
4. 在两台主机上建立帐户并授权 slave
create user 'slave'@'%' identified with mysql_native_password by '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
执行show master status;
查询Master1和Master2的状态并记录
5. 在从机上配置需要复制的主机
Slava1 复制 Master1,Slava2 复制 Master2
方法同上
6. 两个主机互相复制
Master2 复制 Master1,Master1 复制 Master2
方法同上
7.测试
Master1 主机新建库、新建表、insert 记录,Master2 和从机复制