目录
一、原理
MySQL主从复制是基于事件的复制机制。主服务器负责处理所有的写操作和事务,并将所有的更改(如INSERT、UPDATE和DELETE)记录到二进制日志(Binary Log,即binlog)中。这个日志文件是MySQL中记录所有更改数据的日志文件,主服务器在执行每个更改操作时,会将该操作以事件的形式记录到binlog中。从服务器则通过读取主服务器的binlog来获取数据更改信息,并将这些更改应用到自身的数据库中,从而实现数据的同步。
二、工作过程
MySQL主从复制的工作过程是一个异步的过程,具体步骤如下:
- 主服务器记录日志:主服务器将所有对数据库的更改操作记录到binlog中。
- 从服务器请求日志:从服务器通过其IO线程连接到主服务器,并请求binlog的更新。这个请求通常包括要复制的binlog文件名和位置。
- 主服务器发送日志:主服务器收到从服务器的请求后,将其IO线程中的binlog内容以及相应的位置信息发送给从服务器。
- 从服务器写入中继日志:从服务器收到binlog内容后,将其写入本地的中继日志(Relay Log)中。同时,从服务器还会创建一个master.info文件,记录主服务器的IP地址、用户名、密码、binlog名称和位置等信息,以便后续继续复制。
- 从服务器执行日志:从服务器的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);