MySQL全局锁指的是什么

MySQL全局锁指的是什么

数据库设计的初衷是处理并发问题的,作为多用户共享的资源,当出现并发访问时,数据库需要合理地控制资源的访问规则。而锁就是用来实现这个访问规则的重要数据结构。

我们先来贴一个锁的大概分类的图

MySQL全局锁指的是什么

根据加锁的范围,MySQL 里面的锁大致可以分为全局锁、表锁、行锁。我们主要先来学习这几种锁,这篇我们学习全局锁。

全局锁

全局锁就是对整个数据库加锁。当我们对数据库加了读锁之后,其他任何的请求都不能对数据库加写锁了,当我们对数据库加了写锁之后,后续其他任何的请求都不能对数据库加读锁和写锁了。

FTWRL

MySQL 提供了一个加全局读锁的方法,Flush tables with read lock (FTWRL)。当我们需要让整个库处于只读状态时,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

全局锁的使用场景

全局锁的使用场景:做全库的逻辑备份。逻辑备份也就是把整个库的每个表都 select 出来存成文本。也就是全局锁只有在进行主从备份数据或者导入导出数据的时候才会使用到。

那么为什么需要全局锁呢?

因为我们在做数据备份或者导入导出数据的时候,如果在这个期间还可以同时进行数据的增删改,那么就会出现数据不一致的问题。

以前有一种做法是通过上面提到的 FTWRL 确保在备份的时候不会有其他线程对数据库做更新,注意:这里备份过程中整个库都是完全处于只读状态。

因为全局锁是面向这个数据库的,所以加全局锁听起来很危险:

  • 如果我们在主库上备份,在备份期间都不能执行更新,也就是基本上全部业务暂停。

  • 如果我们在从库上备份,在备份期间主库同步过来的 binlog 从库都不能执行,也就是会导致主从延迟,数据不一致。

如何避免加锁

既然加全局锁影响这么大,我们能不能避免加锁呢?

通过上面的介绍,我们知道加锁是为了解决数据不一致问题。那么是不是只要我们能解决数据不一致的问题,就可以不用加全局锁了。有这样一个思路:如果我们在开始进行数据备份的时候,记录一个操作日志,备份过程中不加锁允许对数据库的增删改查,而在备份过程中,增删改查的操作记录都记到一个日志文件里,等我们备份完成后,再把这段时间日志文件里的操作都执行一遍。这样就能保证备份前后数据的一致性了。

总结,不加锁的话,备份得到数据和主数据不是一个逻辑时间点,这个视图是逻辑不一致的。如果保证逻辑时间点一致即逻辑视图一致就能保证数据一致,由此我们就想到了我们之前学过的事务隔离级别,可重复复读的隔离级别下开启一个事务就是一个一致性视图。

在 MySQL 的默认引擎 InnoDB 里有一个机制可以保证数据一致性。InnoDB 引擎中有数据快照版本的功能,这个功能叫 MVCC,因为 MVCC 保留了历史版本的快照,每个快照都对应一个事务版本号,而在我们备份数据的时候会申请一个事务版本号,在读取数据的时候,只需要读取比自己事务版本号小的数据即可。

–single-transaction 命令加锁

官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

–single-transaction 参数的作用,设置事务的隔离级别为可重复读,即 REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,也就大概保证了在 dump 期间,如果其他 InnoDB 引擎的线程修改了表的数据并提交,对该 dump 线程的数据并无影响。

并且设置 WITH CONSISTENT SNAPSHOT 为快照级别。设想一下,如果只是可重复读,那么在事务开始时还没 dump 数据时,这时其他线程修改并提交了数据,那么这时名列前茅次查询得到的结果是其他线程提交后的结果,而 WITH CONSISTENT SNAPSHOT 能够保证在事务开启的时候,名列前茅次查询的结果就是事务开始时的数据 A,即使这时其他线程将其数据修改为 B,查的结果依然是 A。

single-transaction方法只适用于所有的表使用事务引擎的库。在 mysqldump 过程中,加了–single-transaction 就能保证 InnoDB 的数据是完全一致的,对于MyISAM这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时候就还是需要全局锁的,所以我们就还是需要使用 FTWRL 命令的。

只读设置

我们可能还会有这样一个疑问,既然要全库只读,我们为什么不适用 set global readonly = true 的方式呢?

确实 readonly 方式也可以让全库进入只读状态,但还是会建议用 FTWRL 方式,主要有两个原因:

  • 在有些系统,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改global变量的方式影响面更大。

  • 在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。

而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。

关于“MySQL全局锁指的是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:MySQL全局锁指的是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/29880

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月26日 上午1:52
下一篇 2022年9月26日 上午1:53

相关推荐

  • 电脑提示该内存不能为read如何解决

    电脑提示该内存不能为read的解决方法 1、打开运行窗口。 2、在运行窗口中输入命令cmd,回车确定。 2、将下面代码“for %1 in (%windir%system32*.dll) do regsvr32.exe /s %1”复制粘贴到管理员窗口中。 4、点击回车键,等待程序运行结束。 以上就…

    2022年9月2日
    52100
  • 如何进行Apache Solr JMX服务RCE漏洞复现

    0x00简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 该漏洞源于默认配置文件solr.in.s…

    2022年9月13日
    41800
  • JavaScript怎么取消请求

    取消 XMLHttpRequest 请求 当请求已经发送了,可以使用 XMLHttpRequest.abort() 方法取消发送,代码示例如下: const xhr = new XMLHttpRequest();xhr.open(‘GET’, ‘<http://127.0.0.1:30…

    2022年9月15日
    47100
  • MySQL中的用户创建与权限管理怎么实现

    一、用户管理 在mysql库里有个user表可以查看已经创建的用户 1.创建MySQL用户 注意:MySQL中不能单纯通过用户名来说明用户,必须要加上主机。如hhy@10.1.1.1 基本语法: mysql> create user ‘用户名’@’被允许连接的主机名称或主机的IP地址’ ide…

    2022年9月2日
    44000
  • HTML5导航标签指的是什么

    在HTML5中,nav标签是导航标签;nav的全称是navigation,意为导航,该标签定义导航链接的部分,用于表示HTML页面中的导航,该标签并不是所有的HTML文档都要使用,只是作为标注一个导航链接的区域。 本教程操作环境:windows10系统、HTML5版本、Dell G3电脑。 HTML…

    2022年8月31日
    46200
  • 如何进行授权的APK渗透测试

    作为一个渗透测试小白,本文的目的是希望能为那些和我一样的小白提供一些测试思路。涉及的内容可能比较基础,表哥们见谅。APK 解包拿到 apk 之后直接用 7-Zip 解压可以得到几个文件夹、一个 AndroidManifest.xml 文件、一个dex文件。使用 dex2jar https://sou…

    2022年9月18日
    44700
  • 狩猎内网信息侦察工具Goddi怎么用

    Goddi Goddi 是 NetSPI 使用 Go 语言编写的工具,该工具有助于收集 Active Directory 域信息,被认为是 BloodHound、ADInfo、PowerSploit 和 windapsearch 等其他几种常见工具的替代方案。 Goddi 依赖对域控进行一系列自定义…

    2022年9月26日
    28800
  • 如何分析绕过Tumblr用户注册过程中的reCAPTCHA验证

    今天就跟大家聊聊有关如何分析绕过Tumblr用户注册过程中的reCAPTCHA验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 大家好,下面分享的writeup是作者通过在Tumblr用户注册过程中,发现Tumblr的“人机身份验证”机制(…

    2022年9月15日
    64000
  • excel页面布局位置在哪

    excel页面布局位置: 1、双击打开WPS 2、点击新建进入,选择新建excel空白文档 3、选择打印预览功能 4、点击“页面布局” 5、点击查看整体页面布局即可 到此,关于“excel页面布局位置在哪”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想…

    2022年8月27日
    43800
  • MySQL约束与多表查询实例分析

    本篇内容主要讲解“MySQL约束与多表查询实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL约束与多表查询实例分析”吧! 1.约束 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和…

    2022年9月18日
    66700
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部