MySQL主从复制的原理与操作实现

在生产环境中,只有一台MySQL的环境往往是很脆弱的,一旦承载MySQL的服务器宕机损坏,或者MySQL服务本身遭到破坏,库中的数据将不复存在,这对于大部分项目来说都是灾难性的。因此在大部分项目中,使用两台或以上的MySQL实现数据库的实时备份相当重要。多台MySQL同时存储同样的数据,在单台MySQL出现问题时,仍可保障数据的完整性,确保业务稳定运行

想要使用多台MySQL对数据库进行实时备份,数据的同步就非常重要。MySQL自身就提供了这样的功能,叫做主从复制,产生数据的库定义为主库备份数据的库定义为从库

原理

MySQL的binlog日志记录着数据库中的所有数据变更,主从复制就是通过这个binlog日志实现。在配置了主从复制的从库中,会有两组线程,一组是IOthread,另一组线程是SQLthread

  • IOthread:通过不断读取主库中的binlog文件,将文件中的最新数据变更记录写入到自身的一个中继文件 Relay log
  • SQLthread:通过读取Realy log文件,将变更实时写入到自身的数据库表中,以实现主从复制
    在这里插入图片描述

主库配置

刚才提到,主从复制基于主库的binlog实现,请先查询主库是否开启binlog日志(一般情况下mysql8是默认开启的),如果未开启,请先开启binlog

查看binlog是否开启

在MySQL控制台中使用如下语句:

show variables like '%log_bin%';

能够查询到如下结果:
在这里插入图片描述

  • log_bin binlog是否开启,为ON则表示已经开启了
  • log_bin_basename binlog日志的存放目录,以及文件开头
  • log_bin_index binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些

确认binlog开启后,修改配置文件my.cnf,通常情况下 /etc/my.cnf这个位置,在文件的末尾添加下列内容

#1. mysql服务ID,需保证整个集群环境中唯一,默认为1就好了
server-id=1
#2. 是否只读,1 代表只读, 0 代表读写
read-only=0
#3. 指定需要同步的数据库,如下配置表示,要同步的库为minfinedb
binlog-do-db=minfiedb
#4. 也可以只指定不需要同步的数据库,指定后,则除了指定不需要同步的库外,其他的库将全部同步
#binlog-ignore-db=mysql

添加完成后,重启MySql服务

systemctl restart mysql
或者
systemctl restart mysqld

接下来登录MySQL控制台,查看二进制日志坐标

show master status;

在这里插入图片描述
字段含义

  • File 当前binlog记录到了哪一个日志文件(很重要,需要在下列从库配置中填写,用于记录同步的起始位置
  • Position 当前binlog记录到了日志文件的哪一行(很重要,需要在下列从库配置中填写,用于记录同步的起始位置
  • Binlog_Do_DB 需要同步的数据库
  • Binlog_Ignore_DB 不需要同步的数据库

到这里,主库的工作就做完了

从库配置

在从库中先将需要同步的数据库创建出来,比如现在需要同步主库的minfinedb数据库,那么从库也需要手动创建一个一样的名称为minfinedb的数据库

create database minfinedb;

建完库后,先修改配置文件my.cnf,通常情况在 /etc/my.cnf这个位置,在文件的[mysqld]部分的末尾添加下列内容:

#mysql服务ID,需保证整个集群环境中唯一,随便填一个,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1

![在这里插入图片描述](https://img-blog.csdnimg.cn/1599534f0a6240aca834add5520f1707.png

配置完成后,重启MySQL服务

systemctl restart mysqld

登录MySQL控制台,配置主库信息

CHANGE MASTER TO MASTER_HOST='192.168.135.128', MASTER_USER='root',
MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000007',
MASTER_LOG_POS=1955;
  • MASTER_HOST 主库连接地址
  • MASTER_USER 连接主库的用户名
  • MASTER_PASSWORD 连接主库的密码
  • MASTER_LOG_FILE主库的binlog日志文件名,对应主库刚才通过命令show master status; 查询出的File 字段
  • MASTER_LOG_POS 主库的binlog日志行数,对应主库刚才通过命令show master status; 查询出的Position 字段

如果MySQL是8.0.23或之后的版本,也可以使用如下命令:

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.135.128', SOURCE_USER='root',
SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000007',
SOURCE_LOG_POS=1955;

配置完主库信息后,即可开启同步操作:

#8.0.22之前
start slave;
#8.0.22之后
start replica

至此,从库配置也已经完成,可以通过下列命令查询同步状态:

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

在这里插入图片描述

重要参数解析

  • Slave_IO_State 当前同步状态
  • Master_Host 同步的主库地址
  • Master_Log_File 当前同步的主库binlog日志文件名
  • Read_Master_Log_Pos 当前同步的主库binlog日志行数
  • Slave_IO_Running 同步IO线程是否运行
  • Slave_SQL_Running 同步SQL任务线程是否运行

一般来说,Slave_IO_State 没有异常, Slave_IO_RunningSlave_SQL_Running的值都为Yes,则表示同步功能是正常运行的,主从复制配置完成

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值