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

相关推荐

  • pr如何修改视频里的文字

    pr修改视频里的文字的方法: 1、首先点击左上角的字幕,然后选择新建字幕,再点击“默认静态字幕”。 2、然后输入自己需要的文字大小和相关的颜色。 3、建议大家使用常规的字体,不然容易出现不完整的情况。 4、添加之后可以将字幕的原件直接拖拽到上面的视频图层中。 5、然后就可以看到文字已经添加成功了。 …

    2022年8月29日
    1.9K00
  • 电脑0x000007b蓝屏如何修复

    启动无限蓝屏0x000007b修复方法: 方法一: 1、先强制重启电脑,等待开机画面出现后按下快捷键“F12”进入bios系统中。 2、进入bios启动项设置界面,用方向键将光标移动到“advanced”。 3、然后再次选择“SATA Configuration”并按下回车键进行确认。 4、之后会出…

    2022年9月16日
    77800
  • 如何实现APT32样本分析

    一、基本信息 样本MD5 bb3306543ff********9372bb3c72712 样本文件大小 3.29 MB (3,449,856 字节) 样本类型 后门程序 样本描述 利用Office恶意宏加载木马模块 分析时间 2019年12月 二、分析 2.1简介 该恶意文档,共被植入了三段恶意宏…

    2022年9月18日
    57500
  • MySQL外键约束知识点有哪些

    一、MySQL外键约束作用 外键约束(Foreign Key)即数据库中两个数据表之间的某个列建立的一种联系。这种联系通常是以实际场景中含义完全相同的字段所造成的。MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强,也更符合显示情况。下面,我举一个例子来说明MySQL外键约束的作用。 假…

    2022年9月15日
    1.2K00
  • 如何分析Haproxy端口复用

    本文作者:Spark(Ms08067内网安全小组成员) 一、概述 Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。类似frp,使用一个配置文件+一个server就可以运行。优点: 大型业务领域应用广泛 支持四层代理(传输层)以及七层代…

    2022年9月10日
    75600
  • windows Office365excl表格冻结窗口在哪

    Office365excl表格冻结窗口位置: 1、首先打开office365,点击新建一个excel表格。 2、然后选中自己需要操作的表格进行编辑。 3、点击上方工具栏中的“视图”。 4、最后点击“冻结窗格”即可完成操作。 关于“windows Office365excl表格冻结窗口在哪”的内容就介…

    2022年9月20日
    50800
  • Burpsuit结合SQLMapAPI产生的批量注入插件是怎样的

    1.1变动: 增加过滤设置 优化显示结果 增加运行提示信息 增加域名正则匹配 整个插件分为三个面板:任务面板、sqlmapapi参数配置面板、过滤条件面板。 任务面板 Server : SQLmapapi服务的IP和端口 THREAD:同时检测的任务数量 Domain:需要检测的域名,支持正则匹配 …

    2022年9月20日
    55400
  • cad块如何创建

    cad块创建方法: 1、首先打开CAD图纸,然后去绘制一个方格图形。 2、然后在命令栏中输入图块命令“B”按下空格键。 3、然后去选择你要创建的图形,编辑名称后点击确定即可创建。 4、最后只要双击你的鼠标,就可以看到属性了,即可成功创建块。 到此,关于“cad块如何创建”的学习就结束了,希望能够解决…

    2022年8月30日
    33800
  • MySQL的rollback实例分析

    本文主要介绍“MySQL的rollback实例分析”的相关知识,文中所提到的一些操作方法不仅实用性强,且操作简单、快捷,不仅能帮助大家取得一定工作成果,而且还能提升工作效率,如果感兴趣的话,请耐心阅读! 事务回滚 事务是关系型数据库里的执行单位,可以通过最后阶段控制选择提交或回滚。在各种无法保证完整…

    2022年6月27日
    56300
  • SolarWinds供应链APT攻击事件安全风险的示例分析

    背景 12月13日,美国拔尖安全公司FireEye(中文名:火眼)发布报告称,其发现一起全球性入侵活动,命名该组织为UNC2452。该APT组织通过入侵SolarWinds公司,在SolarWinds Orion商业软件更新包中植入恶意代码,进行分发,FireEye称之为SUNBURST恶意软件。该…

    2022年9月8日
    52700
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部