文章目录

  • 主从复制
  • 一、概述
  • 二、原理
  • 三、 搭建主从复制结构
  • 3.1 服务器准备
  • 3.2 主库配置
  • 3.3 从库配置


主从复制

一、概述

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),使得从库和主库的数据保持同步。

从库当中把主库的二进制日志文件同步过来并执行了,name这个时候从库的数据和主库的数据也就同步保持一致了,这个过程就称为主从复制。

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制

主库一般称为Master, 从库一般称为Slave

mysql 主从 导出 mysql主从从_mysql 主从 导出

优点

  • 主库出现问题,可以快速切换到从库提供服务
  • 实现读写分离,降低主库的访问压力
    增删改的请求操作主库,查询的请求操作从库
  • 可以在从库中执行备份,以避免备份期间影响主库服务

在数据备份的时候,需要加一个全局锁,避免数据不一致的情况发生

添加全局锁后,其他客户端是不能执行增删改操作的(但是可以查询),显然会影响业务

但是现在有了从库之后,直接在从库进行数据备份,但是主库还是可以使用的,等从库备份完成后,再将二进制文件同步到从库,又使得主库从库数据一致。


二、原理

主库当中的数据是怎么同步到从库之中的?

主库当中一旦发生增删改等相关操作以及执行DDL语句的时候,它会将所有的数据变更写入到一份日志 - Binlog日志(二进制日志)

在此二进制日志当中,记录了主库所有的数据变更。(比如主库执行了一个insert,他就会记录在Binlog日志当中)

mysql 主从 导出 mysql主从从_数据库_02

从库里面涉及到两组线程

  • IOThread

会发起一个请求来连接master数据库,然后读取master数据库当中的binlog日志。

当读取日志并返回后,IOThread会将Binlog日志写入到Slave自身的一份日志,这份日志叫做中继日志 Relay Log

mysql 主从 导出 mysql主从从_java_03

  • SQLThread

上面的步骤完成后就该SQLThread线程出现了,主要负责读取中继日志当中的数据,把中继日志当中所记录的数据变化再反映到自身数据库的数据变化,从而保证了主从数据是一致的。

mysql 主从 导出 mysql主从从_数据_04


总结

① Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。

② 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。

③slave重做中继日志中的事件,将改变反映它自己的数据。

三、 搭建主从复制结构

我没有两台服务器,只能学习理论了。

3.1 服务器准备

直接将防火墙关掉就好

mysql 主从 导出 mysql主从从_mysql 主从 导出_05

3.2 主库配置

主库既可以读,又可以写

  • 修改my.ini文件
    binlog-ignore-db:表示在同步的时候忽略哪个数据库
    binlog-do-db:指定同步哪个数据库
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01
  • 重启MySQL服务
systemctl restart mysqld
  • 登录MySQL,创建远程连接账号,并授予主从复制权限
    这个账户就是将来从库链接主库时的账号和密码
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务。 %表示该用户可以在任意主机上访问该服务器
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';

#为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
  • 查看二进制日志坐标
show master status;

file : 从哪个日志文件开始推送日志文件

position : 从哪个位置开始推送日志

binlog_ignore_db : 指定不需要同步的数据库

mysql 主从 导出 mysql主从从_java_06

3.3 从库配置

  • 修改配置文件my.ini
    从库是只读,仅仅代表对普通用户是只读的,如果具有管理员的权限也是可以读写的,如果想让超级管理员也只读,需要再增加一条 super-read-only=1
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
  • 重启MySQL服务
systemctl restart mysqld
  • 登录MySQL,设置主库配置
    SOURCE_HOST:主机地址
    SOURCE_USER:对应服务器哪个用户
    SOURCE_PASSWORD:密码
    SOURCE_PASSWORD:从哪个二进制日志文件开始同步
    SOURCE_LOG_POS:从这份日志的哪个位置开始同步
CHANGE REPLICATION SOURCE TO 
  SOURCE_HOST='192.168.200.200', 
  SOURCE_USER='itcast',
  SOURCE_PASSWORD='Root@123456', 
  SOURCE_LOG_FILE='binlog.000004',
  SOURCE_LOG_POS=663;

上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:

知识参数名不同而已

CHANGE MASTER TO 
  MASTER_HOST='192.168.200.200', 
  MASTER_USER='itcast',
  MASTER_PASSWORD='Root@123456',
  MASTER_LOG_FILE='binlog.000004',
  MASTER_LOG_POS=663;
  • 开启同步操作
start replica; #8.0.22之后
start slave; # 8.0.22之前
  • 查看主从同步状态
show replica status ; #8.0.22之后
show slave status ; #8.0.22之前

如果查询出来的数据比较乱,没有按照行展示,可以在操作命令之后加\G

show replica status\G ; #8.0.22之后
show slave status\G ; #8.0.22之前

如果下面红框的都是Yes,说明主从复制正常

IOThread用来读取二进制日志并将内容写入到中继日志的

SQLThread用来读取中继日志,并把数据反映到自身变化的

mysql 主从 导出 mysql主从从_mysql_07