mysql-主从同步原理

AB复制(重点)

一、什么是主从复制?

1、主从同步也叫AB复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

2、主从复制的作用

1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3.读写分离,使数据库能支撑更大的并发。1--在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)2--在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
为什么要搞主从同步?
因为只有一个服务器 上面跑着mysql 万一发生故障 数据会丢失 业务访问无法正常运行,业务量过大的情况下,对服务器的压力也是很大的,所以要考虑到服务要高可用,既降低服务器压力又提高可用性写库(写入)专门放一个数据库 主库负责写入
查询(select)在专门放一个库 从库负责查询AB复制也叫读写分离

二、主从同步原理(面试题)

主服务器把数据修改之后,会放入到二进制日志中(binary log)中,然后通过内部进程机制把日志传递到从服务器(从服务器在通过IO线程写入到中继日志)中并表示为中继日志(中继日志在通过sql线程传输给从服务器并执行),从而达到了主从一致
从服务器有俩个线程(I/O线程和SQL线程)I/O线程负责把主服务器上的日志拉取过来,slq线程是负责把日志执行的,从服务器干的活最多
主服务器写入数据,从服务器就写入,主服务器删除数据,从服务器就会接着删除数据从服务器不能写入数据主从同步也叫异步模式,时间会有0.几毫秒延时,主服务器做好授权 从服务器具有授权的凭证进行把日志传递丛库可以写数据库 但是主库是不会有的
三、M-S 架构GTID 基于事务ID复制
1、什么是GTID?

全局事务标识:global transaction identifiers
是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。

2、GTID工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
3、部署主从复制
-A, --all-databases #备份所有库
-B, --databases  #备份多个数据库
-F, --flush-logs #备份之前刷新binlog日志
--default-character-set #指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
--no-data,-d #不导出任何数据,只导出数据库表结构。
--lock-tables #备份前,锁定所有数据库表
--single-transaction #保证数据的一致性和服务的可用性
-f, --force #即使在一个表导出期间得到一个SQL错误,继续。对主库已有的数据库不会进行自动同步(可选操作 两边的库要一样)
逻辑备份 先暂时关闭gtid 
--single-transaction 做一次性检查
--all-databases 导出所有数据库mkdir /dackupdb
mysqldump -uroot  -p'123456'  --set-gtid-purged=OFF --single-transaction  --all-databases  > /data/backupdb/all_$(date +%Y%m%d%H%M%S).sql在从库上导入单个数据库。
mysql -uroot -p'' 库名 < /path/dbname.bak
mysql -uroot -p'123456' company < all_20240524195401.sql在从库上导入多个数据库
mysql -uroot -p'123456'  < all_20240524195401.sql

部署主从复制详细流程

开始执行第一步
master操作:
cd /usr/local/mysql/
mkdir bin-log
chown -R mysql:mysql bin-log[root@mysql-master ~]# vim /etc/my.cnf
#在[mysqld]下添加如下内容
server-id=1
log-bin = /usr/local/mysql/bin-log/binlog  //前面是路径后面是文件名
gtid_mode = on
enforce_gtid_consistency=1
#强制gtid
sync_binlog = 1[root@mysql-master ~]# systemctl restart mysqld检查一下bin-log文件夹(此时二进制文件已经生成好了)
cd /usr/local/mysql/
cd bin-log/ llreplication  slave  //同步到从服务器
reload //重新加载
super //超级权限
slave //账号
% //从服务器的id地址和主机
openssl rand -base64 40 | cut -c 2-15
+GVUrydHxuf4FK在主服务器创建授权账户:
mysql> grant replication  slave,reload,super on *.*  to 'slave'@'%' identified by '+GVUrydHxuf4FK';
#注:生产环境中密码采用高级别的密码,实际生产环境中将'%'换成slave的ip
mysql> flush privileges;
mysql> show master status; //查看状态注意:如果不成功删除以前的binlog日志
replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
super权限:允许用户使用修改全局变量的SET语句以及CHANGE  MASTER语句
reload权限:必须拥有reload权限,才可以执行flush  [tables | logs | privileges]
slave操作(从服务器):
[root@mysql-slave ~]# vim /etc/my.cnf  #添加如下配置relay-log-info-repository=TABLE //要不要这个表的数据记录server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE在重启服务
[root@mysql-slave ~]# systemctl restart mysqld检查一下有没有错误的配置文件
cat /usr/local/mysql/mysql.log master_host='' //主服务器是多少
master_user='' //账号是多少
master_password='+GVUrydHxuf4FK', //主服务器的密码是多少
master_auto_position=1; //主服务器的标识是几
[root@mysql-slave ~]# mysql -uroot -p'123456'   #登陆mysqlmysql> change master to
master_host='192.168.171.15',
master_user='slave', 
master_password='+GVUrydHxuf4FK', 
master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)mysql> start slave;   #真实启动slave(从)角色
mysql> show slave status\G  #查看状态,验证sql和IO是不是yes。Slave_IO_Running: Yes  //表示主从同步已经配置成功Slave_SQL_Running: Yes
4、测试同步
在主库新建数据库,在从库查看同步回到主服务器上
mysql> show master status;
创建数据库
mysql> create database test_db;
主服务器状态码会发生变化为773 
mysql> show master status;
回到从服务器上 状态码也会发生变化为773 
mysql> show slave status\G 
查看test_db库是否存在
mysql> show databases;在主服务器上创建库shuihu
mysql -uroot -p'123456' -e"create database shuihu"; 
回到从服务器上 查看shuihu库是否存在
mysql> show databases;
查看动态日志
tail -f /usr/local/mysql/mysql.log
5、重设从库
什么场景需要重设从库,比如网络发生异常,主库地址(position)会发生变化,从库上方网络ok就可以做一次从连从库重设#全在从库执行(断开于主库之间的通信,脱离主从关系)
mysql>stop slave;
mysql>reset slave;
mysql>reset master; 
#从库的binlog已经无效了,所以要执行这个命令清空binlogmysql> change master to
master_host='192.168.171.15',
master_user='slave', 
master_password='+GVUrydHxuf4FK', 
master_auto_position=1;mysql> start slave;   #启动slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G  #查看状态,验证sql和IO是不是yes。
6、常见错误
ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' first
如果遇到这种错误(是因为之前做主从同步的时候有残留)要先断开服务
从库重设#全在从库执行(断开于主库之间的通信,脱离主从关系)
mysql>stop slave;
mysql>reset slave;
mysql>reset master; 
在进行重启就ok了 
systemctl stop mysqld
systemctl start mysqld常见故障1
Slave has more GTIDs than the master has,using the master's SERVER_UUID
该问题代表从库获取到的GTID超过了主库,比如主库在未指定binlog文件名的同时修改了系统主机名,导致binlog全部被修改,从库就会判断失败;或者主库未配置双1参数时断电,导致从库提前获取到了还未执行的GTID,解决方法如下:
重设从库
stop slave;
reset slave;
reset master; 
#从库的binlog已经无效了,所以要执行这个命令清空binlog
change master to
master_host='10.36.107.10',
master_port=3306,
master_user='slave',
master_password='Qf@12345!',
master_auto_position=1;常见故障2
如果从库未指定relaylog的同时修改了系统主机名,只需要在从库重新执行一次同步
stop slave;
reset slave;
change master to 
master_host='10.36.107.10',
master_port=3306,
master_user='slave',
master_password='Qf@12345!',
master_auto_position=1;常见故障3
Master_has_purged_require_gtids
主库提前删除了还未同步完成的binlog
在主库上查看master信息
mysql> show master status\G;
*************************** 1. row ***************************File: mylog.000001Position: 465Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 402c0020-4012-11ed-8d7e-000c292b8f0e:1-2
1 row in set (0.00 sec)
#在从库上手动指定二进制日志文件master_log_file和位置master_log_pos与master上的一致
mysql > stop slave;
mysql > change master to 
master_host='10.36.107.10',
master_user='slave',
master_password='Qf@12345!',
master_log_file='mylog.000001',
master_log_pos=465,
master_auto_position=0;
mysql > start slave;
6、故障切换
丛库可以创数据库 但是主库是不会有的mysql主从,主服务器发生故障,如何进行切换?
主机故障,要把从服务器替换成主服务器1)在从服务器执行:(脱离主从关系)
mysql> stop slave;
mysql> reset master;2)查看是否只读模式:(此时只读模式是关闭模式 OFF)
show variables like 'read_only';
关闭只读模式
vim /etc/my.cnf
read-only=1
并重启mysql服务
systemctl restart mysqld或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off;
3)查看show slave status \G;
4)在程序中将原来主库IP地址改为现在的从库IP地址,测试应用连接是否正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用MySQL的SQL语句来读写硬盘目录文件

1.先确保创建表&#xff0c;例如起名Temp CREATE TABLE temp ( id int(11) NOT NULL AUTO_INCREMENT, image mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8; 注意这里的image字段用mediumblog&#xff0c;就可以避免出现data too …

27【Aseprite 作图】盆栽——拆解

1 橘子画法拆解 (1)浅色3 1 0;深色0 2 3 就可以构成一个橘子 (2)浅色 2 1;深色1 0 (小个橘子) (3)浅色 2 1 0;深色1 2 3 2 树根部分 (1)底部画一条横线 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

省市区(输入code) 转相应省市区工具类(两种方式)

方式一 通过调用接口&#xff08;时间高达1s&#xff09; package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.BufferedReader; import java.io.InputStreamReader; i…

Java 泛型基础

目录 1. 为什么使用泛型 2. 泛型的使用方式 2.1. 泛型类 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符号 3.1. 类型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符&#xff1f;的区别。 4. 泛型不变性 5. 泛型编译时擦除 1. 为什么使用泛型 Java 为…

基于深度学习的入侵检测系统综述文献概述

好长时间不发博客了&#xff0c;不是因为我摆烂了&#xff0c;是我换研究方向了&#xff0c;以后我就要搞科研了。使用博客记录我的科研故事&#xff0c;邀诸君共同见证我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互联网发展迅速&#xff…

Android firebase消息推送集成 FCM消息处理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一个服务&#xff0c;用于处理来自 Firebase 服务器的消息。它有几个关键的方法&#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解释这些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…

基于ssm的蛋糕商城系统java项目jsp项目javaweb

文章目录 蛋糕商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 蛋糕商城系统 一、项目演示 蛋糕商城管理系统 二、项目介绍 系统角色 : 管理员、用户 一&#xff0c;管理员 管理员有…

PICO VR眼镜定制播放器使用说明文档videoplayerlib-ToB.apk

安装高级定制播放器 高级定制播放器下载地址:https://download.csdn.net/download/ahphong/89360454 仅限用于PICO G2、G3、G4、NEO系列VR眼镜上使用, 用途:用于第三方APP(开发者)调用定制播放器播放2D、3D、180、360全景视频。 VR眼镜系统请升级到最新版,可在官网下载,…

Mixed-precision计算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】选择排序以及需要注意的问题

选择排序的基本思想&#xff1a;每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 第一种实现方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金丝雀发布后续 + 声明式资源管理yaml

目录 一、K8S常见的发布方式 1.1蓝绿发布 1.2灰度发布&#xff08;金丝雀发布&#xff09; 1.3滚动发布 二、金丝雀发布 三、声明式管理方法 3.1YAML 语法格式 3.1.1查看 api 资源版本标签 3.1.2查看资源简写 3.2YAML文件详解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊属性

特殊属性 will-change will-change 属性用于向浏览器提供提示,表明某个元素或其特定属性在未来极有可能发生变化。这有助于浏览器提前优化相关渲染流程,提升动画或其他动态效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++内存管理方式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C/C内存分布 在这篇文章开始之前&#xff0c;我们先以一道题目来进行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

在CSDN上成长的感悟,你的粉丝长啥样?

文章目录 一、写作的初衷1. 记录所学内容2.巩固所学知识3.分享与帮助4.方便后续查找5.获取激励 二、你的粉丝长啥样&#xff1f;1. 粉丝的特点与困惑2. 关于粉丝&#xff0c;细思极恐 三、继续前行、坚持初心 在CSDN上写博文&#xff0c;对于我来说&#xff0c;不仅仅是一个记录…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

异构图上的连接预测一

这里写目录标题 异构图&#xff1f;处理数据&#xff1a; 异构图&#xff1f; 异构图&#xff1a;就是指节点与边类型不同的图。 连接预测&#xff1a;目的是预测图中两个节点之间是否存在一条边&#xff0c;或者是预测两个节点之间&#xff0c;在未来可能形成的连接。 eg&…

Linux系统如何通过编译方式安装python3.11.3

1.切换到/data 目录 cd /data 2.下载python源码Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安装路径 和 执行openssl的路径 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用继承&#xff1a;2、案例2&#xff1a;final修饰的类不可以被继承&#xff1a;3、案例3&#xff1a;final修饰的类不能有子类&#xff0c;但是可以有父类4、final修饰构造方法5、final修饰普通方法6、…