首页 > 数据库 >mysql

mysql

时间:2023-09-03 16:57:14浏览次数:45  
标签:binlog 事务 同步 复制 mysql 服务器 从库

MySQL Replication概述

    MySQL Replication俗称 MySQL AB复制、主从复制、主从同步,是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到数据同步效果。

优点:
通过增加从服务器来提高数据库平台的可靠性。在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整数据库平台的高性能。
提高数据安全性.因为数据已复制到从服务器,主数据库数据异常时,可以将从服务器复制进程终止来达到保护数据完整性的特点。
在主服务器上生成实时数据.而在从服务器上分析这些数据,从而缓解主服务器的性能压力。

MySQL复制类型

异步复制
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理了事务,这样就会有一个问题,主库如果down 掉了,此时主上已经提交的事务可能并没有传到从库服务器上,如果此时,强行将从提升为主,可能会导致新主上的数据不完整。默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。

全同步复制
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响,返回客户端的响应速度也会被拖慢。

半同步复制
MySQL5.5由 Google贡献的补丁才开始支持半同步复制模式,介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP 往返的时间。所以半同步复制最好在低延时的网络中使用。当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。


半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式。

半同步复制原理图:
 

 

半同步复制的潜在问题:
客户端事务在存储引擎层提交后,在得到从库同步的过程中,主库宕机了。此时可能的情况有两种:
事务还没发送到从库上
此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当宕机的主库重新启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来的。
事务已经发送到从库上
此时从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主年。

无数据丢失的半同步复制·
针对上述潜在问题,MySQL 5.7引入了一种新的半同步方案: Loss-Less半同步复制。针对上面这个图."Waiting Slave dump”被调整到"Storage Commit"之前。当然,之前的半同步方案同样支持,MySQL 5.7.2引入了一个新的参数进行控制rpl_semi_sync_master_wait_point。
v
rpl_semi_sync_master_wait_point有两种取值
AFTER_SYNC:这个即新的半同步方案,Waiting Slave dump 在 Storage Commit之前。
AFTER_COMMIT:老的半同步方案

MySQL支持的复制方式

    基于SQL 语句的复制(SBR):在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高。
基于行的复制(RBR):主服务器把表的行变化作为事件写入到二进制日志中,主服务器代表了行变化的事务复制到从数据库中
混合模式复制(MBR):先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行。

在MySQL5.1.4之前的版本都只能使用基于SQL语句的复制方式,MySQL5.6.5和往后的版本是基于GTIDs来进行事务复制。当使用GTIDs时可以大大简化复制过程,因为GTIDs完全基于事务,只要在主服务器上提交了事务那么从服务器就一定会执行该事务。

通过设置服务器的系统变量binlog_format来指定要使用的格式:
RBR的优点:
任何情况都可以被复制,这对复制数据来说是最安全可靠的更少的行级锁表
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快很多

RBR的缺点
Binlog文件较大
复杂的回滚时 binlog中会包含大量的数据
主服务器上执行多个 UPDATE语句时,所有发生变化的记录都会写到 binlog 中,而且只写为一个操作事物,这会导致频繁发生binlog的并发写问题
不能通过查看日志来审计执行过的sql 语句,不过可以通过使用mysqlbinlog --base64-output=decode-rows --verbose来查看数据的变动

SBR的优点
历史悠久,技术成熟;binlog文件较小
binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
binlog 可以用于实时的还原,而不仅仅用于复制
主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR的缺点
不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。
复制需要进行全表扫描(WHERE 语句中没有使用到索引)的UPDATE 时,需要比 RBR请求更多的行级锁
对于一些复杂的语句,在从服务器上的耗资源情况会更严重


无论选择哪种方式复制,都会影响到复制的效率以及服务器的损耗,以及数据一致性问题,目前其实没有很好的客观手段去评估一个系统更适合哪种方式的复制。

复制工作原理

 


当master 上的数据发生改变时,则将其改变写入二进制曰志 binlog日志中;
slave 服务器会在一定时间间隔内对master 二进制日志进行探测其是否发生改变.如果发生改变,从库会生成两个线程,一个I/O线程,一个SQL线程;Io线程会去请求主库的binlog.并将得到的 binlog 写到本地的relay-log(中继日志)文件中
主库会生成一个 log dump 线程,用来给从库lO线程传 binlog
SQL线程,会读取relay log文件中的日志.并解析成sql语句逐一执
最后IOThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

标签:binlog,事务,同步,复制,mysql,服务器,从库
From: https://www.cnblogs.com/lijianyyds/p/17675163.html

相关文章

  • 在Kubernetes(K8S)上安装和部署MySQL
    摘要:本文将介绍如何在Kubernetes(K8S)上安装和部署MySQL。我们将通过以下步骤实现这一目标:准备工作、安装MySQL、配置MySQL以及在K8S上部署MySQL。通过本文,您将了解如何使用K8S来管理MySQL的容器化部署,提高应用程序的性能、可靠性和安全性。一、引言MySQL是一种流行的关系型数据库,广......
  • MysqlHelper——一个便捷的MySQL导入导出的助手类库
    MysqlHelper是一个便捷的通过PHP导入和导出Mysql数据库表结构和数据的工具,可以快速实现mysql的数据库的导入和导出.......
  • SpringBoot管理系统连接虚拟机MYSQL数据库
    1、使用Navicat软件连接虚拟机ip地址填写虚拟机的:192.168.158.129;密码填写虚拟机的mysql的密码:wingkin45;发现弹出这样一个提示框:2、在虚拟机中查看网络端口信息netstat-ntpl找到3306端口;3、在虚拟机中查看防火墙的状态systemctlstatusfirewalld没有3306端口,则就是......
  • 云服务器——安装MySQL
    镜像拉取MySQL#拉取mysql镜像,默认最新版本dockerpullmysql#默认最新版本dockerpullmysql:5.7#指定5.7版本#启动mysqldockerrun--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=root-v/root/mysql/conf.d:/etc/mysql/conf.d-v/root/mysql/data:/var/l......
  • 导出mysql数据库,导出远程mysql数据库,使用命令行导出mysql数据库
    一篇博客要使用命令行导出MySQL数据库,您可以按照以下步骤进行操作:打开命令提示符或终端窗口,并导航到MySQL的安装目录。以管理员身份运行命令行界面。在Windows操作系统上,可以按下Shift键,然后单击“开始”菜单,输入“cmd”,右键单击“命令提示符”,然后选择“以管理员身份运行”。在M......
  • MySQL一张表最多添加多少个text字段?
    1背景当用户从oracle迁移到MySQL时,可能由于原表字段太多建表不成功,这里讨论一个问题:一个InnoDB表最多能建多少个text字段。我们后续的讨论基于创建表的语句形如:createtablet(f1text,f2text,…,fNtext)engine=innodb;。1.1「默认配置」在默认配置下,上面的建表语句,N......
  • 在MySQL中插入数据后,对两个数值进行条件性增加
    在MySQL中,可以使用UPDATE语句对插入的数据进行条件性增加。以下是一个示例:假设有一个名为"table_name"的表,其中有两列"column1"和"column2",我们要对"column1"和"column2"的数据进行条件性增加。UPDATEtable_nameSETcolumn1=column1+10,column2=column2+5WHEREcon......
  • MySQL基础篇:掌握数据表操作的基础知识
    表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课程信息,都可以放到表中。另外表都有特定的名称,而且不能重复。表中具有几个概念:列、行、主键。列叫做字段(Column),行叫做表中的记录,每一个字段都有:字段名称/字段数据类型/字段约束/字段长度创建表在MySQL中,......
  • 纯分享:将MySql的建表DDL转为PostgreSql的DDL
    背景现在信创是搞得如火如荼,在这个浪潮下,数据库也是从之前熟悉的Mysql换到了某国产数据库。该数据库我倒是想吐槽吐槽,它是基于Postgre9.x的基础上改的,至于改了啥,我也没去详细了解,当初的数据库POC测试和后续的选型没太参与,但对于我一个开发人员的角度来说,它给我带来的不便主要是......
  • MySQL添加用户并授权
    执行前要确认,授权给这个用户的数据库已经被创建好createdatabase库名charactersetutf8mb4;接下来,可以采用直接授权的方式,能够同时创建用户以及授权grantselect,insert,delete,update,createon库名.*to'用户名'@'%'identifiedby'密码';......