前言
实际生产中,当数据量比较多时,特别是读多写少的应用中,常常需要用到数据库的主从架构,用于减轻主库的读请求压力,增强可用性。本文使用的数据库版本为:MySQL 5.7.30
单机MySQL的安装可参考:Docker 安装 MySQL 5.7.30-CSDN博客
安装数据库
# 安装主服务器,由于3306已经被以前安装的MySQL占用了,所以这里用3305做映射端口
docker run -p 3305:3306 --name mysql-master --restart=always --privileged=true \
-v /usr/local/mysql-master/log:/var/log/mysql \
-v /usr/local/mysql-master/data:/var/lib/mysql \
-v /usr/local/mysql-master/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.30
# 安装从服务器
docker run -p 3307:3306 --name mysql-slave --restart=always --privileged=true \
-v /usr/local/mysql-slave/log:/var/log/mysql \
-v /usr/local/mysql-slave/data:/var/lib/mysql \
-v /usr/local/mysql-slave/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.30
# 查看
docker ps
主库 修改my.cnf 配置文件(没有,则新增)
切换目录:
cd /usr/local/mysql-master/conf
vim my.cnf
修改配置:
[mysqld]
## 主库配置
## 设置server_id,需要唯一
server_id=1000
## 指定不需要同步的数据库名称
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
从库 修改my.cnf 配置文件(没有,则新增)
切换目录:
cd /usr/local/mysql-master/conf
vim my.cnf
修改配置:
[mysqld]
## 从库配置
## 设置server_id,需要唯一
server_id=1001
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
主库 创建账号-用于数据同步
# 创建账号(在主库中)
CREATE USER 'user_slave'@'%' IDENTIFIED BY '123456';
# 授予权限 (*.* 指定 所有数据库.所有数据表)
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'user_slave'@'%';
# 刷新
flush privileges;
重启服务
# docker中重启
docker restart mysql-master
docker restart mysql-slave
查看 主库 配置
查看主库的配置,用于后面设置从库的同步配置;
show master status;
参数说明:
File: 二进制日志文件名(bin-log)
Position: 当前正在写入的二进制日志文件中的位置。
Binlog_Do_DB: 要复制的数据库名,空表示复制所有库表
Binlog_Ignore_DB: 忽略复制的数据库名,空表示不忽略
从库 设置主从同步
# 设置要同步的主库信息
change master to master_host='192.168.44.130', master_user='user_slave', master_password='Aa@@123456', master_port=3306, master_log_file='mysql-bin.000015', master_log_pos=154, master_connect_retry=30;
## 参数说明:
master_host: 主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
# 查看 从库 状态
show slave status;
## slave_io_running和slave_sql_running为 NO,说明未开启主从同步
从库 开启主从同步
start slave;
验证
- 在主库中新增/修改数据库,数据表,新增行记录;
- 查看从库中是否自动产生有相同的数据库、表、以及行记录。
参考
linux环境下 mysql5.7主从同步搭建_linux mysql 5.7主从同步配置-CSDN博客
【保姆级】docker安装MySQL主从复制_docker新建一个端口为3307的同名数据库-CSDN博客