MySQL主从复制配置(一主一从)

主从复制(一主一从)

系统环境:
centos
MySQL
docker 提前安装好,并配置好国内镜像源
vim编辑器

主从复制原理

(1)slave会从master读取binlog来进行数据同步

(2)三步骤+原理图
在这里插入图片描述

MySQL复制过程分成三步:

master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;

slave将master的binary log events拷贝到它的中继日志(relay log);

slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的

复制的基本原则

(1)每个slave只有一个master

(2)每个slave只能有一个唯一的服务器ID

(3)每个master可以有多个salve

复制的最大问题

因为发生多次IO,存在延时问题

一、准备工作

下载MySQL镜像,使用docker安装MySQL:

docker pull mysql:5.7.31

如果下载太慢就需要对docker配置阿里云仓库:

ps:如果下载太慢,请添加腾讯源,依次执行
echo “OPTIONS=‘–registry-mirror=https://mirror.ccs.tencentyun.com’” >> /etc/sysconfig/docker
systemctl daemon-reload
service docker restart
或者直接去阿里仓库下https://dev.aliyun.com/search.html把上面的–registry-mirror=https://mirror.ccs.tencentyun.com换成你的专属源就可以

下载完输入:

在这里插入图片描述

接下来在docker中创建两个MySQL容器:
创建主数据库:

docker run --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

创建从数据库:

docker run --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入主数据库docker环境:

进入主库容器

docker exec -it mysql-master bash

我们需要安装vim编辑器来修改MySQL的配置文件:

yum install vim
遇到提问就选y,然后等待安装完成

二、配置主库

1.编辑my.cnf配置文件
首先我们需要对主库的MySQL配置文件进行修改,配置文件一般在/etc/mysql/my.cnf或者/etc/my.cnf,小伙伴们需要按照自己的情况进行修改。因为我这边mysql配置文件在/etc/mysql/my.cnf,所以使用该路径进行举例。使用vim命令,编辑my.cnf文件,在 [mysqld] 下添加如下信息:

#同一局域网内注意要唯一
server-id=1
# 开启二进制日志功能,可以随便取
log-bin=mysql-bin

因为我的环境MySQL配置文件是在 /etc/my.cnf 下,所以直接执行:

vim /etc/my.cnf
在这里插入图片描述

进入my.cnf文件后:

修改MySQL配置文件在这里插入图片描述

**2.重启容器
修改完成后,保存文件,退出容器并重启
在这里插入图片描述
3.查看二进制日志是或开启

SHOW GLOBAL VARIABLES LIKE ‘%log%’;

在这里插入图片描述
4.查看主节点server id

SHOW GLOBAL VARIABLES LIKE ‘%server%’;

在这里插入图片描述

5.创建有复制权限的用户slave

CREATE USER ‘slave’@‘%’ IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@‘%’ IDENTIFIED by ‘123456’;
# 刷新配置
FLUSH PRIVILEGES;

6.查看File和Position字段的值

show master status;

在这里插入图片描述

三、配置从库

从库配置与主库配置非常类似
1.编辑my.cnf配置文件

##设置server_id,注意要唯一
server-id=2
#开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
#relay_log配置中继日志
relay_log=edu-mysql-relay-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

在这里插入图片描述
binlog 日志三种格式:
statement:复制主要数据,但是无法复制SQL中的函数以及系统变量(例如:@@host name),无法实现主从强一致性
ROW:强一致性,逐行记录数据变化,保证主从数据一致,但是性能比statement差
MIXED:以上两种的混合模式,但是只是解决了一部分数据不一致问题
在这里插入图片描述

2.重启容器
在这里插入图片描述
3.进入从数据库设置主数据库信息
进入从数据库,执行如下命令(命令参数说明:master_host是主库的ip地址;master_user在主库设置的具有复制权限的用户名;master_log_file主库配置环节中File字段的值,master_log_pos主库配置环节中Position字段的值)

change master to master_host=‘172.17.0.5’, master_user=‘slave’, master_password=‘123456’, master_port=3306, master_log_file=‘mysql-bin.000001’, master_log_pos=856, master_connect_retry=30;

4.启动主从复制

start slave;

5.查看主从同步状态

show slave status \G;

在这里插入图片描述
如果遇到错误可以用下面的办法处理:

#停止slave
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

#跳过错误:
mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)
#启动slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

6.设置从库只读

# 开启只读
show global variables like “%read_only%”;
# 对所有用户生效,包括super用户(不建议使用)
flush tables with read lock;
# 只对普通用户生效,如slave用户
set global read_only=1;
show global variables like “%read_only%”;
# 关闭只读
unlock tables;
set global read_only=0;

在这里插入图片描述

测试

1.主库中创建数据库
在 主库 中执行create database test; 创建数据库test

create database test;

在这里插入图片描述

此时我们在 从库中执行show databases;查看从库中所有的数据库(可以发现,从库中已经多了一个test数据库)
在这里插入图片描述

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值