mdl

Mysql全局锁、表锁和Innodb行锁

二次信任 提交于 2019-12-15 12:35:59
锁 数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁的典型使用场景是,做全库逻辑备份 。也就是把整库每个表都select出来存成文本。 让整库都只读,听上去就很危险: 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。 对于全部是InnoDB引擎的库,我建议你选择使用–single-transaction参数,对应用会更友好。

06.全局锁和表锁

橙三吉。 提交于 2019-12-12 00:17:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是flush tables with read lock(FTWRL),执行这个命令后就可以使整个库处于只读状态(断开此连接后,全局锁会自动释放,也可以执行unlock tables进行主动解锁),其它线程的以下语句会被阻塞:数据库更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构)和更新类事务的提交语句。全局锁的典型的使用场景是做全库逻辑备份,执行FTWRL后确保不会有其它线程对数据做更新,然后对整个库做备份,注意在备份过程中整个库完全处理只读状态。 mysqldump 是官方自带的逻辑备份工具,当mysqldump使用参数-single-transaction的时候,导数据之前会启动一个事务,来确保拿到一致性视图,而由于MVCC的支持,这个过程中数据是可以正常更新的。有了这个功能,为什么还需要FTWRL呢?一致性读是好,但是前提是引擎要支持这个隔离级别,比如,对于MySAM这种不支持事务的引擎,如果备份数据中有更新,总是能取到最新的数据,那么就破坏了备份的一致性,这时我们就需要使用FTWRL了。 所以 -single

对于MySQL你必须要了解的锁知识

倾然丶 夕夏残阳落幕 提交于 2019-12-09 14:32:31
一、前言 MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍行锁。 二、全局锁 MySQL 提供全局锁来对整个数据库实例加锁。 语法: FLUSH TABLES WITH READ LOCK 这条语句一般都是用来备份的,当执行这条语句后,数据库所有打开的表都会被关闭,并且使用全局读锁锁定数据库的所有表,同时,其他线程的更新语句(增删改),数据定义语句(建表,修改表结构)和更新类的事务提交都会被阻塞。 在mysql 8.0 以后,对于备份,mysql可以直接使用备份锁。 语句: LOCK INSTANCE FOR BACKUP UNLOCK INSTANCE 这个锁的作用范围更广,这个锁会阻止文件的创建,重命名,删除,包括 REPAIR TABLE TRUNCATE TABLE, OPTIMIZE TABLE 操作以及账户的管理都会被阻塞。当然这些操作对于内存临时表来说是可以执行的,为什么内存表不受这些限制呢?因为内存表不需要备份,所以也就没必要满足这些条件。 三、表锁 Mysql的表级别锁分为两类,一类是元数据锁(Metadata Lock,MDL),一种是表锁。 元数据锁(MDL) 不需要显式使用,在访问一个表的时候会被自动加上

truncate被Waiting for table metadata lock的解决方法

跟風遠走 提交于 2019-12-07 03:34:08
场景 调研环境下,对一张千万条数据的表做了一个truncate操作,发现长时间无反应。 解决思路 操作一直执行,决定查询下正在执行的sql的状态 shop processlist; 发现truncate操作的状态是: Waiting for table metadata lock。 查询正在执行的事务: select * from information_schema.innodb_trx\G 找到了操作表的那个事务,有insert语句没有提交,查看事务的trx_mysql_thread_id,然后执行kill [id]删除。 卡住的sql就都执行成功了。 思考 MDL是为了保护database objects而设计的。 MDL和事务的关系是,在事务中,当访问一个database object时都先要获得其MDL,在事务结束后才会释放MDL。 这样做有几个目的: 第一是为了进一步保证事务的一致性,比如事务A对某一行记录进行了更新,还没有提交,但这时另外一个会话2要修改表名,如果事务 A 持有MDL,那另一个会话2将无法修改,show processlist会发现它在Waiting for table metadata lock。直到事务 A 提交或回滚后,才能获得MDL修改成功。 第二是为了解决 binlog 同步的一个 bug,这个和上面的原因一样。binlog

truncate被Waiting for table metadata lock的解决方法

放肆的年华 提交于 2019-12-06 16:35:39
场景 调研环境下,对一张千万条数据的表做了一个truncate操作,发现长时间无反应。 解决思路 操作一直执行,决定查询下正在执行的sql的状态 shop processlist; 发现truncate操作的状态是: Waiting for table metadata lock。 查询正在执行的事务: select * from information_schema.innodb_trx\G 找到了操作表的那个事务,有insert语句没有提交,查看事务的trx_mysql_thread_id,然后执行kill [id]删除。 卡住的sql就都执行成功了。 思考 MDL是为了保护database objects而设计的。 MDL和事务的关系是,在事务中,当访问一个database object时都先要获得其MDL,在事务结束后才会释放MDL。 这样做有几个目的: 第一是为了进一步保证事务的一致性,比如事务A对某一行记录进行了更新,还没有提交,但这时另外一个会话2要修改表名,如果事务 A 持有MDL,那另一个会话2将无法修改,show processlist会发现它在Waiting for table metadata lock。直到事务 A 提交或回滚后,才能获得MDL修改成功。 第二是为了解决 binlog 同步的一个 bug,这个和上面的原因一样。binlog

技术分享 | 快速定位令人头疼的全局锁

人盡茶涼 提交于 2019-12-05 15:36:50
作者:洪斌 背景 在用 xtrabackup 等备份工具做备份时会有全局锁,正常情况锁占用时间很短,但偶尔会遇到锁长时间占用导致系统写入阻塞,现象是 show processlist 看到众多会话显示 wait global read lock,那可能对业务影响会很大。而且 show processlist 是无法看到哪个会话持有了全局锁,如果直接杀掉备份进程有可能进程杀掉了,但锁依然没释放,数据库还是无法写入。这时我们需要有快速定位持有全局锁会话的方法,杀掉对应会话数据库就恢复正常了。 通常这种紧急情况发生,需要 DBA 有能力快速恢复业务,如果平时没有储备,现找方法肯定是来不及的,所以我整理了几种方法,在实际故障中帮助我快速的定位到锁会话恢复了业务,非常有效,与大家分享。 方法 方法1:利用 metadata_locks 视图 此方法仅适用于 MySQL 5.7 以上版本,该版本 performance_schema 新增了 metadata_locks,如果上锁前启用了元数据锁的探针(默认是未启用的),可以比较容易的定位全局锁会话。过程如下。 开启元数据锁对应的探针 mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME = 'wait/lock/metadata

Material Design Lite ,简洁惊艳的前端工具箱。

帅比萌擦擦* 提交于 2019-12-02 08:05:30
Material Design Lite简介 本文主要介绍Material Design设计语言的HTML/CSS/JS部分实现。 对应每一小节的在线练习地址如下,大家可以去试试。 http://www.hubwiz.com/course/55adae643ad79a1b05dcbf77/ 一、设计语言 github项目地址: https://github.com/google/material-design-lite 拟真 vs. 扁平 在iso7之前,Apple采用的是拟真化设计语言,期望通过模拟现实世界的物体,给用户 身临其境的感觉。自metro和ios7开始的扁平化设计语言则相反,它着意去掉冗余的装 饰效果(比如透视、纹理、渐变等等能做出3D效果的元素),让“信息”本身重新作为核心 被凸显出来。 从下面的对比图中,我们可以体会到两种设计语言的差异: Material Design 如果说拟真代表设计语言的一个极端,而扁平代表设计语言的另一个极端,那么Material Design则居于两者之间更偏右的位置: 在Material Design中,屏幕里看上去平整的一个 App 界面,事实上不同控件之间都拥有 着层级关系。不同控件之间的层级关系会使用阴影作为表示,而阴影的深浅,代表的正是这个 控件在 Z 轴的高度: 二、材料/Material Material Design

解决power designer 不能自动生成注释 commont 的解决办法只需要3步:

孤街醉人 提交于 2019-12-01 09:48:50
解决power designer 不能自动生成注释的解决办法只需要3步: 一、快捷键 Ctrl+Shift+X 打开脚本编辑器;(快捷键不能执行的话可以从这个路径执行:Tools --> Excute commands --> Edit/Run Script) 二、将下面天蓝色的字体脚本添加到脚本编辑器里面; Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get the current active model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox "There is no current Model " ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then MsgBox "The current model is not an Physical Data model. " Else ProcessFolder mdl End If ' This routine copy name into comment for each table, each column and each view ' of the current

Mysql心路历程:Mysql各种锁机制(入门篇)

此生再无相见时 提交于 2019-11-29 12:06:21
这一篇文章是本人数据库的第二篇,也是对数据库学习的阶段性总结。对于数据库锁的了解,是区分程序员,尤其是Java程序员,中高级的一个重要标志。也是日常,我们开发中,经常碰到坑的地方。往往,我们无脑的CURD过程中,其实已经出现问题了,锁问题,但是我们并没有发现,你那是没有被大访问量冲击。一旦一朝我们冲击到了,那损失和锅,是要自己承担下来的。不多说,我们接下来就来一步步看看Mysql的锁机制。 一、Mysql锁的类型 整体上,Mysql锁的类型,从全局的到细节的,包含如下几个: 全局锁 表级锁 普通的表锁 MDL (元数据锁) 行锁 读锁(共享锁) 写锁(排他锁、叉锁) 间隙锁 Next-key lock 大概上,我们日常生产学习中,所能接触到的就这几大种类了(个人的脑容量也就能掌握这么多了,(⊙﹏⊙)b),接下来,我们一个个的说说。 二、 全局锁 顾名思义,全局锁就是对整个数据库实例加锁。Mysql提供了一个加锁的语句:Flush tables with read lock (FTWRL)。它能使整个实例上面,只读,所有的写和更新,都会被阻塞。全局锁的使用经典的使用场景是 做全局的数据备份使用 ,具体的操作,可能平时我们碰到不多,不过要了解几点: 每次全局备份过程中,如果是InnoDB引擎完全可以通过MVCC创建一致性视图,来保证不受备份中,其他操作的影响

技术分享 | 快速定位令人头疼的全局锁

核能气质少年 提交于 2019-11-29 08:11:45
作者:洪斌 背景 在用 xtrabackup 等备份工具做备份时会有全局锁,正常情况锁占用时间很短,但偶尔会遇到锁长时间占用导致系统写入阻塞,现象是 show processlist 看到众多会话显示 wait global read lock,那可能对业务影响会很大。而且 show processlist 是无法看到哪个会话持有了全局锁,如果直接杀掉备份进程有可能进程杀掉了,但锁依然没释放,数据库还是无法写入。这时我们需要有快速定位持有全局锁会话的方法,杀掉对应会话数据库就恢复正常了。 通常这种紧急情况发生,需要 DBA 有能力快速恢复业务,如果平时没有储备,现找方法肯定是来不及的,所以我整理了几种方法,在实际故障中帮助我快速的定位到锁会话恢复了业务,非常有效,与大家分享。 方法 方法1:利用 metadata_locks 视图 此方法仅适用于 MySQL 5.7 以上版本,该版本 performance_schema 新增了 metadata_locks,如果上锁前启用了元数据锁的探针(默认是未启用的),可以比较容易的定位全局锁会话。过程如下。 开启元数据锁对应的探针 mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME = 'wait/lock/metadata