首页 > 数据库 >MySQL主从复制

MySQL主从复制

时间:2023-06-04 10:13:32浏览次数:54  
标签:主库 主从复制 Slave slave 线程 MySQL Master 从库

MySQL主从复制

一、复制概述

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

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

二、复制原理

在这里插入图片描述

MySQL主从复制原理:
(1) Master的更新事件(update、insert、delete)会按照顺序写入bin-log中。当Slave连接到Master的后,Master机器会为Slave开启binlog dump线程,该线程会去读取bin-log日志

(2) Slave连接到Master后,Slave库有一个I/O线程 通过请求binlog dump thread读取bin-log日志,然后写入从库的relay log日志中。

(3) Slave还有一个 SQL线程,实时监控 relay-log日志内容是否有更新,解析文件中的SQL语句,在Slave数据库中去执行。


总结
(1) 既然是要把事件记录到bin-log日志,那么对于Master就必须开启bin-log功能。

(2) 整个Mysql主从复制一共开启了3个线程。Master开启 IO线程,Slave开启 IO线程 和 SQL线程。

(3) 这点也很重要那就是Master和Slave交互的时候,记住这里是Slave去请求Master,而不是Master主动推给Slave。Slave通过IO线程连接Master后发起请求,Master服务器收到Slave IO线程发来的日志请求信息,io线程去将bin-log内容返回给slave IO线程。

三、复制优点

(1) 主库出现问题,可以快速切换到从库提供服务

(2) 在从库上执行查询操作,在主库上执行更新操作,实现读写分离,降低主库的访问压力

(3) 在从库上执行备份,以避免备份期间影响主库的服务

四、搭建主从复制

master-主库

1.修改配置文件
在master 的配置文件 /etc/my.cnf 中,添加如下内容:

cat >>/etc/my.cnf<<'EOF'
[mysqld]
log-bin=mysql-bin   # 启用二进制日志,数据间复制必不可少
server-id=100       # 服务器唯一ID
EOF
2.重启MySQL
systemctl restart mysqld.service
3.创建同步数据的用户并授权
1.mysql8授权用户需要先创建,创建和授权同一条语句的话会报错
create user slave@'%' identified by 'fxx123';
2.授权
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%'WITH GRANT OPTION;
3.刷新权限
flush privileges;

注:上面SQL的作用是创建一个用户slave,密码为fxx123,并且给slave用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

image-20230602093157891

4.登录Mysql数据库
登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值

show master status;

注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作

image-20230602093406822

slave-从库

1.修改配置文件
在slave 的配置文件 /etc/my.cnf 中,添加如下内容:

cat >>/etc/my.cnf<<'EOF'
[mysqld]
server-id=101       # 服务器唯一ID
EOF
2.重启MySQL
systemctl restart mysqld.service
3.登录Mysql数据库
登录Mysql数据库,执行下面SQL

1.执行前先停下slave
stop slave;

2.这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to master_host='10.0.0.51',master_user='slave',master_password='fxx123',master_log_file='mysql-bin.000002',master_log_pos=874;

3.执行后启动slave
start slave;

4.登录Mysql数据库,执行下面SQL,查看从数据库的状态
show slave status\G;

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'fxx123';

image-20230602094342336

image-20230602095756494

五、验证同步操作

1.主库操作
主库中创建数据库,创建表,并插入数据

create database db01;

use db01;

create table user(
    id int(11) not null auto_increment,
    name varchar(50) not null,
    sex varchar(1),
    primary key (id)
)engine=innodb default charset=utf8;

insert into user(id,name,sex) values(null,'Tom','1');
insert into user(id,name,sex) values(null,'Trigger','0');
insert into user(id,name,sex) values(null,'Dawn','1');

image-20230602100224112

2.从库操作
从库查取数据
show databases;
+--------------------+
| Database           |
+--------------------+
| db01               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use db01;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | Tom     | 1    |
|  2 | Trigger | 0    |
|  3 | Dawn    | 1    |
+----+---------+------+
3 rows in set (0.00 sec)

mysql> 

image-20230602100407660

image-20230602100459529

此时主库的内容一旦有变更,就会同步到从库。

标签:主库,主从复制,Slave,slave,线程,MySQL,Master,从库
From: https://www.cnblogs.com/fxx2019/p/17455260.html

相关文章

  • MySQL 8错误日志出现"The table /home/work/mysql_3306/tmp/#sqla2b_298b06_4d is fu
    ##############    了解MySQL8.0.26的错误日志出现"Thetable /home/work/mysql_3306/tmp/#sqla2b_298b06_4disfu11!"的bug,暂时通过修改临时表的存储引擎为内存引擎解决  MySQL8.0.13开始引入新的临时内存表引擎TempTable,并将其作为内存中创建临时表的默认存储引擎。T......
  • 使用 Node.js 连接 MySQL
    概述当使用Node.js开发Web应用程序时,经常需要与数据库进行交互来存储和检索数据。MySQL是一个流行的关系型数据库管理系统,它提供了强大的功能和性能。本文将介绍如何使用Node.js连接MySQL数据库,并展示一些常见的操作示例。开始在这里我们将使用Node.js的mysql2库来连......
  • MySQL数据库复制技术2
    一:复制的概念。    可能很多人认为,复制很简单就是把之前的数据直接转移到新的数据库当中不就是复制吗。但是在MySQL数据库中:复制指的就是复制一个服务器上(称为主节点服务器或者简称主节点)的所有改变到另一个服务器(称为从节点服务器或简称从节点)。复制通常用来创建主节点的一......
  • WSL 安装配置 MySQL
    在WSL安装并配置MySQL与在UbuntuServer安装配置MySQL一样的步骤。简要记录一下配置的过程。安装MySQL参考微软官方文档[1]安装MySQL。sudoaptinstall-ymysql-server启动MySQLServer:sudoservicemysqlstart登录mysql:sudomysqlmysql_secure_instal......
  • 关于MySQL数据库的索引的作用及如何创建?
    一、创建索引的作用?原因:创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分......
  • 一篇搞定MySQL索引长度(key_len)计算规则
    MySQL索引长度(key_len)计算 计算规则索引字段:没有设置NOTNULL,则需要加1个字节。定长字段:tinyint占1个字节、int占4个字节、bitint占8个字节、date占3个字节、datetime占5 个字节、char(n)占n个字节。变长字段:varchar(n)占n个字符+2个字节。注......
  • MySQL导入SQL文件过大或连接超时的解决办法
    使用navicatmysql导入sql总会出现许多的error,导致导入的sql不完整。这个问题说到底是mysql执行时间、文件大小限制,只要这样配置下,就可以正常oerror导入了。setglobalmax_allowed_packet=100000000;setglobalnet_buffer_length=100000;SETGLOBALinteractive_timeout=2......
  • docker安装mysql
    1.从DockerHub下载MySQL镜像:dockerpullmysql2.运行MySQL容器,并将主机的3306端口映射到容器的3306端口:dockerrun-p3306:3306--namemysql-eMYSQL_ROOT_PASSWORD=your_password-dmysql其中,--namemysql指定容器的名称为mysql,-p3306:3306将容器的3306端口映射......
  • MYSQL:无锁变更工具Pt-online-schema-change
    一、MySQL常用的无锁变更工具OnlineSchemaChange:OnlineSchemaChange(OSC)工具是MySQL官方提供的一种无锁变更工具,它可以在不停止MySQL服务器的情况下对表结构进行修改。OSC利用了InnoDB存储引擎的特性,使用复制和重放日志的方式来实现无锁变更。pt-online-schema-change:pt-......
  • MySQL同一字段取反处理
    在改BUG中遇到了这个问题一张表的字段比如是否可用标志取值取反了本来是0的写成了1 1写成了0可使用下面的语句 UPDATE(表名)SET字段名= CASE字段名WHEN (值) THEN(值)WHEN (值) THEN(值)WHEN (值) THEN(值)ENDWHERE(条件)举个例子:UPDA......