MySQL进阶-主从复制

✨作者:猫十二懿

❤️‍🔥账号:CSDN掘金语雀Github

🎉公众号:猫十二懿

一、MySQL主从复制概述

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

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

MySQL 复制的优点主要包含以下三个方面:

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

二、主从复制原理

MySQL主从复制的核心就是 二进制日志,具体的过程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上图来看,复制分成三步:

  1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
  2. 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log
  3. slave 重做中继日志中的事件,将改变反映它自己的数据。

三、搭建主从复制

3.1 环境准备

准备好两台服务器之后(可以在安装两个虚拟机),在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备(安装、密码配置等操作)工作。 其中:

  • 192.168.91.166 作为主服务器 master
  • 192.168.91.167 作为从服务器 slave

3.2 主库配置

  1. 修改配置文件 /etc/my.cnf

    #mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
    
    server-id=1
    
    #是否只读,1 代表只读, 0 代表读写
    
    read-only=0
    
    #忽略的数据, 指不需要同步的数据库
    #binlog-ignore-db=mysql
    #指定同步的数据库
    #binlog-do-db=db01
    
  2. 重启 MySQL 服务器

    systemctl restart mysqld
    
  3. 登录 MySQL,创建远程链接的账号,并授予主从复制权限

    #创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
    CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
    
    #为 'itcast'@'%' 用户分配主从复制权限
    GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
    
  4. 通过指令,查看二进制日志坐标

    show master status;
    
    mysql>  show master status;
    +---------------+----------+--------------+------------------+-------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +---------------+----------+--------------+------------------+-------------------+
    | binlog.000019 |      663 |              |                  |                   |
    +---------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    字段含义说明:

    • file:从哪个日志文件开始推送日志文件
    • position: 从哪个位置开始推送日志
    • binlog_ignore_db:指定不需要同步的数据库

3.3 从库配置

  1. 修改配置文件 /etc/my.cnf

    #mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可
    server-id=2
    
    #是否只读,1 代表只读, 0 代表读写
    read-only=1
    
  2. 重新启动 MySQL 服务

    systemctl restart mysqld
    
  3. 登录mysql,设置主库配置

注意:这里的binlog.000004,663一定要与 master 二进制日志坐标保持一致。

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.91.166', 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.91.166', MASTER_USER='itcast', MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=663;
参数名含义8.0.23之前
SOURCE_HOST主库IP地址MASTER_HOST
SOURCE_USER连接主库的用户名MASTER_USER
SOURCE_PASSWORD连接主库的密码MASTER_PASSWORD
SOURCE_LOG_FILEbinlog 日志文件名MASTER_LOG_FILE
SOURCE_LOG_POSbinlog 日志文件位置MASTER_LOG_POS
  1. 开启同步操作
start replica ; #8.0.22之后
start slave ; #8.0.22之前
  1. 查看主从同步状态
show replica status ; #8.0.22之后
show slave status ; #8.0.22之前
mysql> show replica status\G
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 192.168.91.166
                  Source_User: itcast
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: binlog.000001
          Read_Source_Log_Pos: 156
               Relay_Log_File: MySQL-Slave-relay-bin.000003
                Relay_Log_Pos: 365
        Relay_Source_Log_File: binlog.000001
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes

测试

  1. 在主库 192.168.91.166 上创建数据库、表,并插入数据
create database db01;
use db01;
create table tb_user(
	id int(11) primary key not null auto_increment,
	name varchar(50) not null,
	sex varchar(1)
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null,'Tom', '1'),(null,'Trigger','0'),(null,'Dawn','1');
  1. 在从库 192.168.91.167 中查询数据,验证主从是否同步

insert into tb_user(id,name,sex) values(null,‘Tom’, ‘1’),(null,‘Trigger’,‘0’),(null,‘Dawn’,‘1’);


2. 在从库 `192.168.91.167` 中查询数据,验证主从是否同步

   [外链图片转存中...(img-bWteVxcG-1701225355686)]







  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL 8 实现主从复制的过程包括以下几个步骤: 1. 配置主服务器: 首先,需要在主服务器上打开 binlog,并配置一个唯一的 server-id。这样主服务器才能将更新的日志发送给从服务器。在 MySQL 配置文件中,需要添加如下配置: ``` [mysqld] log-bin = mysql-bin server-id = 1 ``` 其中,`log-bin` 指定了 binlog 文件的名称,`server-id` 是主服务器的唯一标识。 2. 创建复制账户: 在主服务器上创建一个专门用于复制的账户,并赋予账户 REPLICATION SLAVE 权限。例如: ``` CREATE USER 'repl'@'slave_ip' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_ip'; ``` 其中,`slave_ip` 是从服务器的 IP 地址,`password` 是账户的密码。 3. 备份数据: 在主服务器上对数据库行备份,并记录当前的 binlog 文件名和位置。这样在从服务器配置时可以指定从哪个位置开始复制。 4. 配置从服务器: 在从服务器上,需要配置连接主服务器的信息和复制参数。通过修改 MySQL 配置文件,添加如下配置: ``` [mysqld] server-id = 2 ``` 然后在命令行或者 MySQL Workbench 中执行如下命令,连接主服务器并开始复制: ``` CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123; START SLAVE; ``` 其中,`master_ip` 是主服务器的 IP 地址,`mysql-bin.000001` 和 `123` 是在步骤 3 中备份数据时记录的 binlog 文件名和位置。 通过以上步骤,MySQL 8 主从复制就可以成功实现了。从服务器会不断从主服务器同步数据,并保持数据的一致性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫十二懿

你的支持就是写文章的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值