MySQL的主从复制

发布于:2025-02-10 ⋅ 阅读:(70) ⋅ 点赞:(0)

目录

一、原理

二、工作过程

准备

实现

安装数据库

在主数据库添加server_id

启动数据库

进入数据库创建用户

授权

查看

在两台从数据库上添加server_id

启动数据库

在从数据库里指定主数据库

启动

查看是否成功

检测

在主数据库创建一个库和表,并插入数据

在从数据库查看,就会看到会出现在主数据库创建的库和表内容

方法二

基于gtid的主从复制

之后在三台虚拟机都添加相应模块

重启数据库

再停止从数据库的slave

在从数据库里指定主数据库

启动slave;

查看

都是yes,表示成功

检测

在主数据库创建库和表并插入内容

在从数据库查看,查看到就表示成功


一、原理

MySQL主从复制是基于事件的复制机制。主服务器负责处理所有的写操作和事务,并将所有的更改(如INSERT、UPDATE和DELETE)记录到二进制日志(Binary Log,即binlog)中。这个日志文件是MySQL中记录所有更改数据的日志文件,主服务器在执行每个更改操作时,会将该操作以事件的形式记录到binlog中。从服务器则通过读取主服务器的binlog来获取数据更改信息,并将这些更改应用到自身的数据库中,从而实现数据的同步。

二、工作过程

MySQL主从复制的工作过程是一个异步的过程,具体步骤如下:

  1. 主服务器记录日志:主服务器将所有对数据库的更改操作记录到binlog中。
  2. 从服务器请求日志:从服务器通过其IO线程连接到主服务器,并请求binlog的更新。这个请求通常包括要复制的binlog文件名和位置。
  3. 主服务器发送日志:主服务器收到从服务器的请求后,将其IO线程中的binlog内容以及相应的位置信息发送给从服务器。
  4. 从服务器写入中继日志:从服务器收到binlog内容后,将其写入本地的中继日志(Relay Log)中。同时,从服务器还会创建一个master.info文件,记录主服务器的IP地址、用户名、密码、binlog名称和位置等信息,以便后续继续复制。
  5. 从服务器执行日志:从服务器的SQL线程实时监控relay-log日志内容是否有更新。一旦检测到有新的日志内容,SQL线程就会解析这些内容,生成相应的SQL语句,并在从服务器的数据库中执行这些语句。这样,从服务器的数据就与主服务器保持一致了。

准备

需要三台虚拟机,并关闭防火墙和selinux

实现

安装数据库

[root@localhost ~]# yum install mysql-server -y

在主数据库添加server_id

[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf

启动数据库

[root@localhost ~]# systemctl enable --now mysqld

注意:由于是新开的虚拟机没有数据,如果原本数据库有数据要先锁表备份

进入数据库创建用户

mysql> create user mqw@'192.168.190.%' identified with mysql_native_password by
 '123';

授权

mysql> grant replication slave on *.* to mqw@'192.168.190.%';                                                                    

查看

mysql> show master status;

在两台从数据库上添加server_id

[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf

启动数据库

[root@localhost ~]# systemctl enable --now mysqld

在从数据库里指定主数据库


mysql> change master to
    -> master_host='192.168.190.10',
    -> master_user='mqw',
    -> master_password='123',
    -> master_log_file='binlog.000001',
    -> master_log_pos=682;

注意:master_log_file和master_log_pos所填的是在主数据库里查询到的

启动

查看是否成功

mysql> show slave status \G

如果都显示yes就表示成功

检测

在主数据库创建一个库和表,并插入数据

mysql> create database db_1;

-- 选择数据库
use db_1;

-- 创建表
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    position VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- 插入数据
INSERT INTO employees (name, position, salary) VALUES
('Alice', 'Engineer', 75000.00),
('Bob', 'Manager', 90000.00),
('Charlie', 'Technician', 60000.00);

在从数据库查看,就会看到会出现在主数据库创建的库和表内容

mysql> select * from db_1.employees;

方法二

基于gtid的主从复制

可以在上面的操作上先关闭从数据库的slave;

之后在三台虚拟机的数据库配置文件都添加相应模块

[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf
gtid_mode=ON
enforce-gtid-consistency=ON

重启数据库

[root@localhost ~]# systemctl restart mysqld.service

再停止从数据库的slave

mysql> stop slave;

在从数据库里指定主数据库

mysql> change master to
    -> master_host='192.168.190.10',
    -> master_user='mqw',
    -> master_password='123',
    -> master_auto_position=1;

启动slave;

mysql> start slave;

查看

都是yes,表示成功

检测

在主数据库创建库和表并插入内容

mysql> create database db_2;


mysql> use db_2;


CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock_quantity INT NOT NULL DEFAULT 0
);

INSERT INTO products (name, description, price, stock_quantity) VALUES
('Laptop X300', 'A high-performance laptop with 16GB RAM and 512GB SSD.', 999.99, 50),
('Smartphone Y20', 'A sleek and powerful smartphone with 8GB RAM and 128GB storage.', 499.99, 100),
('Headphones Z10', 'Wireless over-ear headphones with noise cancellation.', 199.99, 75),
('Mechanical Keyboard MK5', 'A high-quality mechanical keyboard with customizable RGB lighting.', 129.99, 30),
('Gaming Mouse GM7', 'An ergonomic gaming mouse with high DPI and customizable buttons.', 69.99, 80);

在从数据库查看,查看到就表示成功