Mysql 全局锁入门
全局锁顾名思义,全局锁就是对整个数据库实例加锁
。
如何手动使用全局锁?
MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)
。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:
数据更新语句(数据的增删改)、
数据定义语句(包括建表、修改表结构等)
更新类事务的提交语句。
全局锁的用途?
全局锁的典型使用场景是,做全库逻辑备份
。也就是把整库每个表都 select 出来存成文本。
FTWRL加锁的缺点?
以前有一种做法,是通过 FTWRL 确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态
。
但是让整库都只读,听上去就很危险:
如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;
如果你在从库上备份,那么备份期间从库不能执行主库同步过来的 binlog,会导致主从延迟。
看来加全局锁不太好。但是细想一下,
备份为什么要加锁呢?
我们来看一下不加锁会有什么问题。
假设你现在要维护“极客时间”的购买系统,关注的是用户账户余额表
和用户课程表
。现在发起一个逻辑备份。假设备份期间,有一个用户,他购买了一门课程,业务逻辑里就要扣掉他的余额,然后往已购课程里面加上一门课
。如果时间顺序上是先备份账户余额表 (u_account),然后用户购买,然后备份用户课程表 (u_course),会怎么样呢?你可以看一下这个图:
可以看到,这个备份结果里,用户 A 的数据状态是“账户余额没扣,但是用户课程表里面已经多了一门课”。如果后面用这个备份来恢复数据的话,用户 A 就发现,自己赚了。
作为用户可别觉得这样可真好啊,你可以试想一下:如果备份表的顺序反过来,先备份用户课程表再备份账户余额表,又可能会出现什么结果?也就是说,不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的
。
说到视图你肯定想起来了,我们在前面讲事务隔离的时候,其实是有一个方法能够拿到一致性视图的,对吧?是的,就是在可重复读隔离级别下开启一个事务。
备注:如果你对事务隔离级别的概念不是很清晰的话,可以再回顾一下第 3 篇文章《事务隔离:为什么你改了我还看不见?》中的相关内容。
官方自带的逻辑备份工具是 mysqldump
。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
你一定在疑惑,有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别
。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。
所以,single-transaction 方法只适用于所有的表使用事务引擎的库
。如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL 方法。这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。
为什么不用set global readonly=true设置全库只读?
你也许会问,既然要全库只读,为什么不使用 set global readonly=true
的方式呢?确实 readonly 方式也可以让全库进入只读状态,但我还是会建议你用 FTWRL 方式,主要有两个原因:
一是,在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库
。因此,修改 global 变量的方式影响面更大,我不建议你使用。
二是,在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 read,这样会导致整个库长时间处于不可写状态,风险较高。
总结
- 全局锁不能改表结构,加字段之类
- 备份时需要上全句锁
- 备份可以用官方工具mysqldump
Mysql 全局锁入门相关推荐
- MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁
# 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...
- mysql 全局锁_Mysql全局锁和表级锁
以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁. 一 全局锁 Mysql的全局锁是对整个实例加锁,加锁之后,数 ...
- MySQL全局锁、表级锁、行级锁介绍演示(详细)
目录 介绍 分类 1.全局锁 1.1介绍 1.2场景 1.3语法 1.4演示 2.表级锁 2.1介绍 2.2分类 2.3语法 2.4演示 3.行级锁 3.1介绍 3.2分类 3.3场景 介绍 锁是计算 ...
- MySQL全局锁、表锁、行锁、间隙锁
1.全局锁 学习丁奇(林晓斌)老师MySQL实战45讲课程后提炼的笔记!!! 根据加锁的范围,MySQL里面的锁大致可以分成全局锁.表级锁和行锁三类. 全局锁就是对整个数据库实例加锁.Flush ta ...
- MySQL 全局锁和表锁
日常读书笔记 全局锁 含义和命令行 典型使用场景 注意点 问题:备份一定要加锁吗? 问题:既然备份不一定要加锁,那全局锁存在的意义是什么? 表级锁 表锁 命令行 所释放时机 锁时的具体细节 元数据锁 ...
- mysql 全局权限入门
为了便于说明,我先创建一个用户: create user 'ua'@'%' identified by 'pa'; 这条语句的逻辑是创建一个用户'ua'@'%',密码是 pa. 注意,在 MySQL ...
- Mysql 行锁入门
MySQL 的行锁是在引擎层由各个引擎自己实现的.但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁.不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一 ...
- mysql 写锁需要等待读锁释放吗_Mysql实战45讲笔记:5、全局锁和表锁
全局锁: 对整个数据库实例加锁. MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL) 这个命令可以使整个库处于只读状态.使用该命令之后,数据更新语句. ...
- mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)
MySQL实验室 1.?MySQL 中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作.一 ...
最新文章
- 目标检测算法基础概念:边框回归和NMS
- 百练OJ:2764:数根
- machit r语言_机器学习应该准备哪些数学预备知识?
- 第四范式重磅发布企业级AI操作系统Sage AIOS
- 带有Prometheus的弹簧靴和千分尺第5部分:旋转Prometheus
- Excel中PMT计算月供函数的java实现
- WCF创建WebService正确操作步骤详解
- 基于S函数的BP神经网络PID控制器及simulink仿真
- 计算机安全性分析建模,计算机网络安全性分析建模研究
- 程序员如何切入区块链去中心化应用开发 1
- Introduction to Computer Networking学习笔记(九):error detection 错误探查 Checksum、CRC、MAC
- unix系列系统镜像下载
- 【数据结构与算法】车辆路径问题(Vehicle Routing Problem,VRP)
- python 改变图片像素值
- 合宙Luat | 嘿~合宙刚办了一场「大型网友见面会」
- CINTA:陪集与拉格朗日定理
- 《windows 程序设计》读书笔记 三
- 跟我学AngularJs:Directive指令用法解读(上)
- Docker Jar项目启动慢
- 7-6 最热门的职业
热门文章
- 磁盘阵列(RAID)-很详细的介绍
- linux on android 项目,好累,终于完成了 Android-on-Yeeloong 项目的搭建
- matlab如何判断两个矩阵的元素是否相同_蚁群算法及其MATLAB实现
- linux mysql cpu 查看工具_Linux监控工具-Nmon命令行:Linux系统性能的监测利器
- java 计时器_【java内存】内存结构
- 去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息
- Failed to find Build Tools revision 28.0.3
- Android Studio实现简单的QQ应用
- 项目后台运行关闭_iOS到底有没有必要上滑强制关闭APP?
- echarts y轴只显示5个刻度_ECharts 解决双Y轴刻度不一致问题