女朋友问我:什么是 MySQL 的全局锁、表锁、行锁?(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 女朋友问我:什么是 MySQL 的全局锁、表锁、行锁?

01 前言


小胖真的让人不省心。继上次小胖误删数据之后,这次这货直接给我把整个表锁住了。页面无响应,用户疯狂投诉,我特么脸都绿了。。。


事情是这样的,线上有个数据库几十万的数据,由于一开始没做好规划并没有给热点字段加索引。我就让小胖有空加个索引,没想到这货在用户使用高峰期加。。。


知道原因,我还是比较淡定的。毕竟最近都在研究 MySQL,对于 MySQL 锁的问题解决起来还是得心应手。小胖见我三两下就解决了问题,客户也给出了卧槽,牛逼的肯定,忙问我怎么解决的,我点燃手中 82 年的华子深深吸了一口,花了几个小时写了这篇文章给它。


全文 6618 字,从下午两点写到晚上九点,先上张思维导图镇楼:


640.png


1.1 往期精彩


1、小胖问我:select 语句是怎么执行的?

2、女朋友问我:MySQL 索引的原理是怎样的?

3、小胖问我:MySQL 日志到底有啥用?

4、老王问我:MySQL 事务与 MVCC 原理是怎样的?


02 全局锁


全局锁是对整个数据库实例加锁,让其处于只读状态。MySQL 可以通过  Flush tables with read lock (FTWRL) 实现, PS:unlock tables 可以解除只读状态


执行该命令之后,数据更新语句(DML)数据的增删改操作以及数据操纵语句(DDL)修改表结构等操作将被阻塞。


2.1 全局锁的应用场景


最典型的要数全库逻辑备份,就是把整个库的所有表都 select 出来存成文本


假设现在我的数据库是读写分离的:主写从读。有一种思路是使用 FTWRL 定时备份 + binlog 恢复增量数据。


用 FTWRL 确保备份期间不会有其他线程对数据库做更新操作,然后整库备份。这时数据库实例会处于只读状态,就会造成两个问题:


  • 在主库备份,备份期间不能写入,业务就会收到严重影响。


  • 在从库备份,备份期间不能执行主库同步的过来的 binlog(锁住了,不能写入),就会导致主从延迟,业务也会受到影响。


如果非要用这种方式,那么建议是在一个月黑风高,系统最少用户在使用的时候。


2.2 为什么要加锁?


上面说了,利用全局锁备份会造成两个问题。那不加锁行吗?废话,肯定是不行的。不加锁,你养我呀(备份出问题被开除)?


不加锁同样会出现意想不到的问题:举个栗子,看电影买票,系统有个余额表和用户已购票表。


640.png


锁?


现在我要备份,期间有人买票。逻辑上:余额表减掉相应金额,已购票表加上一张票。备份就会出现两个问题:


  • 先备份余额表,用户购买,再备份用户表。这是会怎样呢?方便理解,我画张图:


从上图,我们也大概知道发生了啥。我来捋一捋:


T1 时刻是备份前两个表的数据状态;T2 时刻开始备份,只备份了余额表;T3 时刻,由于没有加锁,用户买票;T4 时刻是买完票后的状态;T5 时刻备份到已购票表。

看最终的备份状态你发现没有???用户钱没少,票却多了一张(用户窃喜,程序员苦逼)。


以上就是不加锁的下场,它会导致数据前后不一致。这还是先备份余额表后备份已购票表的情况出现的问题。


如果,备份的顺序颠倒一下就会出现:用户钱少了,票却没增加(你指定被投诉,程序员还是苦逼)。


通过上面分析知道,不加锁的话。备份得到的库不是同一个逻辑时间点,才会造成这种后果。那怎么保证是同一逻辑时间点呢?


这时候就要引入上篇文章提到的一致性视图。


2.3 一致性视图备份


上篇说到在可重读隔离级别下开启一个事务,会创建一致性视图


PS:不了解事务,看这里肯定一脸懵。建议看这篇:《MySQL 事务与 MVCC 原理》


你可能会问:狗狗你说得,我都知道。问题是怎么在备份的时候开启事务呢?


是这样,MySQL 自带的逻辑备份工具是 mysqldump 。它使用参数 -single-transaction 可以启动一个事务,从而确保拿到一致性视图。并且由于 MVCC 的支持,备份期间数据库仍可以写入。比如像这样:


// 详细参数见:cnblogs.com/markLogZhu/p/11398028.html
// 格式:mysqldump [选项] --数据库名 [选项 表名] > 脚本名
mysqldump -uroot -p test -single-transaction > /backup/mysqldump/test.db


这时好学的朋友可能会说:既然有了这功能,那不用 FTWRL 命令行不行呀?


答案是:可以的,前提是你的数据库引擎要支持可重复读隔离级别,比如:InnDB;如果是 MyLSAM,那么很抱歉,你还是得用 FTWRL,不然备份拿到的视图还是不一致。就会出现上面数据不一致的问题。


2.4 readonly = 1 的方式行么?


提到全库只读你可能想到这个命令:


mysql> set global read_only=1;


能使用它来让全库只读么?不行或者说是不建议,主要原因有三点:


  • 影响业务逻辑;set global read_only=1 可能会用于一些业务判断,比如:主从的判断,从库只读。


  • 异常不释放状态;FTRWL 命令在异常发生时,会自动释放全局锁;而 set global read_only=1 在异常时,数据库会一直保持只读状态,这时候业务就完犊子了。


  • set global read_only=1 这个命令对超级管理员角色无效;备份期间,超管更新数据库还是会导致数据不一致问题。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
监控 关系型数据库 MySQL
MySQL锁机制与解决死锁问题
MySQL锁机制与解决死锁问题
42 5
|
10天前
|
存储 SQL 关系型数据库
MySQL 的锁机制,那么多的锁,该怎么区分?
MySQL 的锁机制,那么多的锁,该怎么区分?
21 0
|
1月前
|
关系型数据库 MySQL 数据库
Mysql的锁
本文介绍了MySQL中表级锁和行级锁的区别,其中MyISAM仅支持表级锁,而InnoDB支持表级锁和行级锁,默认为行级锁。表级锁锁定整个表,实现简单,资源消耗少,但并发度低;行级锁仅锁定相关记录,减少冲突,提高并发度,但加锁开销大。此外,还介绍了共享锁和排他锁的概念及意向锁的作用。
|
2月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
2月前
|
关系型数据库 MySQL 数据库
MySQL MVCC和间隙锁有什么区别?
【8月更文挑战第24天】MySQL MVCC和间隙锁有什么区别?
56 0
|
23天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
25天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
190 11
|
1天前
|
SQL 关系型数据库 MySQL
|
21天前
|
存储 SQL 关系型数据库
MySQL的安装&数据库的简单操作
本文介绍了数据库的基本概念及MySQL的安装配置。首先解释了数据库、数据库管理系统和SQL的概念,接着详细描述了MySQL的安装步骤及其全局配置文件my.ini的调整方法。文章还介绍了如何启动MySQL服务,包括配置环境变量和使用命令行的方法。最后,详细说明了数据库的各种操作,如创建、选择和删除数据库的SQL语句,并提供了实际操作示例。
59 13
MySQL的安装&数据库的简单操作
|
26天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
121 14
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案