本教程环境
服务器:CentOS7.7(推荐使用该版本)
需安装docker,安装docker环境教程请移步 https://blog.csdn.net/weixin_44790046/article/details/105612438
一、搭建主数据库
注意:主从复制需要注意的地方
● 主DB server和从DB server数据库的版本一致
● 主DB server和从DB server数据库数据一致
● 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一
1)创建目录
#进入根目录
cd /
#创建目录
mkdir -p mysql/master
cd mysql/master
mkdir conf data
2)创建配置文件
cd conf/
#创建配置文件
vim my.cnf
#在里面写入如下内容
[mysqld]
server-id = 1 #服务id,不可重复
log-bin = mysql-bin #开启二进制日志
3)拉取mysql5.7镜像
docker pull mysql:5.7
镜像已拉取
4)创建mysql容器
docker run -d \
--name mysql_master \
-v /mysql/master/data:/var/lib/mysql \
-v /mysql/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7
5)查看目录是否挂载成功(重要),如果/mysql/master/data
目录有如下文件说明挂载成功
6)进入容器登录mysql(可以用远程连接工具连接)
docker exec -it mysql_master /bin/bash
7)创建一个同步用户以及授权
create user 'admin'@'%' identified by '362623';
grant replication slave on *.* to 'admin'@'%';
flush privileges;
看到mysql数据库中多了一个admin用户
如果执行过程中出现[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and错误
#解决方案,在my.cnf配置文件中添加如下设置
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'
8)查看mysql二进制日志功能是否开启
#查看mysql二进制日志功能是否开启
show variables like '%log_bin%';
#查看master状态
show master status;
#查看二进制日志相关的配置项
show global variables like 'binlog%';
#查看s erver相关的配置项
show global variables like 'server%';
出现这个日志文件就可以了,后面要用这两个信息
二、搭建从数据库
1)创建目录
#进入根目录
cd /
#创建目录
mkdir -p mysql/slave01
cd mysql/slave01
mkdir conf data
2)创建配置文件
cd conf/
#创建配置文件
vim my.cnf
#在里面写入如下内容
[mysqld]
server-id = 2 #服务id,不可重复
创建mysql从数据库容器
#创建容器
docker run -d \
--name mysql_slave01 \
-v /mysql/slave01/data:/var/lib/mysql \
-v /mysql/slave01/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=362623 \
mysql:5.7
4)查看目录是否挂载成功(重要),如果/mysql/slave01/data
目录有如下文件说明挂载成功
5)进入容器登录mysql(可以用远程连接工具连接)
docker exec -it mysql_slave01 /bin/bash
6)设置主库master的相关信息(注意:以下执行sql都是在从库中执行
)
#设置主库master的相关信息
CHANGE MASTER TO
master_host='192.168.200.131', #你的宿主机ip
master_user='admin', #上面在主数据库添加的用户名
master_password= '362623', #上面在主数据库添加的用户名密码
master_port=3306, #主数据库端口
master_log_file='mysql-bin.000003', #主数据库搭建最后一步的那两个信息
master_log_pos=741; #主数据库搭建最后一步的那两个信息
7)启动同步
start slave;
注意:这里如果执行
start slave
命令出现Slave failed to initialize relay log info structure from the repository
错误,那么就是执行reset slave;
命令清除记录再次执行第6步设置主库master的相关信息
8)查看master状态,如果红框两项都为yes那么恭喜你搭建成功
show slave status;
三、修改主从复制模式
#查看mysql_master二进制日志相关的配置项
show global variables like 'binlog%';
可以看到当前模式默认为ROW(基于行的复制)
在查看二进制日志相关参数内容中,会发现默认的模式为ROW ,其实在MySQL中提供了有3种模式,基于SQL语句的复制(statement-based replication, SBR) ,基于行的复制(row-based replication, RBR) ,混合模式复制(mixed-based replication, MBR)。对应的, binlog的格式也有三种: STATEMENT , ROW , MIXED。
STATEMENT模式(SBR)
- 优点是并不需要记录每一条sql语句和每一 行的数据变化 ,减少了binlog日志量,节约IO ,提高性能。
- 缺点是在某些情况下会导致master-slave中的数据不一致(如sleep)函数 ,last_insert_id() ,以及user-defined functions(udf)等会出现问题
ROW模式( RBR )
- 不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下
的存储过程、或function、 或trgger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是
alter table的时候会让日志暴涨。
MIXED模式( MBR )
- 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog ,对于STATEMENT模式无法复制的操作使
用ROW模式保存binlog , MySQL会根据执行的SQL语句选择日志保存方式。
建议使用MIXED模式。
修改主库配置文件my.cnf
#追加下面配置
binlog_format = MIXED
#重启并查看日志
docker restart mysql_master && docker logs -f mysql_master
#再次查看二进制日志相关的配置项
show global variables like 'binlog%';
测试
在主库中新建ceshi
数据库并创建user
表,在里面添加一条记录
我们发现从库也有了这张表和数据
至此,我们就实现了主从复制,当我们去执行写入的操作就可以写入到主库中,当执行查的操作就去从库查询,这样就节省了主库的压力。