
在程序员的职业生涯中,总会遇到数据库表被锁的情况,前些天就又撞见一次。由于业务突发需求,各个部门都在批量 *** 作、导出数据,而数据库又未做读写分离,结果就是:数据库的某张表被锁了!
用户反馈系统部分功能无法使用,紧急排查,定位是数据库表被锁,然后进行紧急处理。这篇文章给大家讲讲遇到类似紧急状况的排查及解决过程,建议点赞收藏,以备不时之需。
用户反馈某功能页面报502错误,于是第一时间看服务是否正常,数据库是否正常。在控制台看到数据库CPU飙升,堆积大量未提交事务,部分事务已经阻塞了很长时间,基本定位是数据库层出现问题了。
查看阻塞事务列表,发现其中有锁表现象,本想利用控制台直接结束掉阻塞的事务,但控制台账号权限有限,于是通过客户端登录对应账号将锁表事务kill掉,才避免了情况恶化。
下面就聊聊,如果当突然面对类似的情况,我们该如何紧急响应?
想象一个场景,当然也是软件工程师职业生涯中会遇到的一种场景:原本运行正常的程序,某一天突然数据库的表被锁了,业务无法正常运转,那么我们该如何快速定位是哪个事务锁了表,如何结束对应的事物?
首先最简单粗暴的方式就是:重启MySQL。对的,网管解决问题的神器——“重启”。至于后果如何,你能不能跑了,要你自己三思而后行了!
重启是可以解决表被锁的问题的,但针对线上业务很显然不太具有可行性。
下面来看看不用跑路的解决方案:
遇到数据库阻塞问题,首先要查询一下表是否在使用。
如果查询结果为空,那么说明表没在使用,说明不是锁表的问题。
如果查询结果不为空,比如出现如下结果:
则说明表(test)正在被使用,此时需要进一步排查。
查看数据库当前的进程,看看是否有慢SQL或被阻塞的线程。
执行命令:
该命令只显示当前用户正在运行的线程,当然,如果是root用户是能看到所有的。
在上述实践中,阿里云控制台之所以能够查看到所有的线程,猜测应该使用的就是root用户,而笔者去kill的时候,无法kill掉,是因为登录的用户非root的数据库账号,无法 *** 作另外一个用户的线程。
如果情况紧急,此步骤可以跳过,主要用来查看核对:
如果情况紧急,此步骤可以跳过,主要用来查看核对:
看事务表INNODB_TRX中是否有正在锁定的事务线程,看看ID是否在show processlist的sleep线程中。如果在,说明这个sleep的线程事务一直没有commit或者rollback,而是卡住了,需要手动kill掉。
搜索的结果中,如果在事务表发现了很多任务,最好都kill掉。
执行kill命令:
对应的线程都执行完kill命令之后,后续事务便可正常处理。
针对紧急情况,通常也会直接 *** 作第一、第二、第六步。
这里再补充一些MySQL锁相关的知识点:数据库锁设计的初衷是处理并发问题,作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。MySQL中表级别的锁有两种:一种是表锁,一种是元数据锁(metadata lock,MDL)。
表锁是在Server层实现的,ALTER TABLE之类的语句会使用表锁,忽略存储引擎的锁机制。表锁通过lock tables… read/write来实现,而对于InnoDB来说,一般会采用行级锁。毕竟锁住整张表影响范围太大了。
另外一个表级锁是MDL(metadata lock),用于并发情况下维护数据的一致性,保证读写的正确性,不需要显式的使用,在访问一张表时会被自动加上。
常见的一种锁表场景就是有事务 *** 作处于:Waiting for table metadata lock状态。
MySQL在进行alter table等DDL *** 作时,有时会出现Waiting for table metadata lock的等待场景。
一旦alter table TableA的 *** 作停滞在Waiting for table metadata lock状态,后续对该表的任何 *** 作(包括读)都无法进行,因为它们也会在Opening tables的阶段进入到Waiting for table metadata lock的锁等待队列。如果核心表出现了锁等待队列,就会造成灾难性的后果。
通过show processlist可以看到表上有正在进行的 *** 作(包括读),此时alter table语句无法获取到metadata 独占锁,会进行等待。
通过show processlist看不到表上有任何 *** 作,但实际上存在有未提交的事务,可以在information_schemainnodb_trx中查看到。在事务没有完成之前,表上的锁不会释放,alter table同样获取不到metadata的独占锁。
处理方法:通过 select from information_schemainnodb_trxG, 找到未提交事物的sid,然后kill掉,让其回滚。
通过show processlist看不到表上有任何 *** 作,在information_schemainnodb_trx中也没有任何进行中的事务。很可能是因为在一个显式的事务中,对表进行了一个失败的 *** 作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放。从performance_schemaevents_statements_current表中可以查到失败的语句。
处理方法:通过performance_schemaevents_statements_current找到其sid,kill 掉该session,也可以kill掉DDL所在的session。
总之,alter table的语句是很危险的(核心是未提交事务或者长事务导致的),在 *** 作之前要确认对要 *** 作的表没有任何进行中的 *** 作、没有未提交事务、也没有显式事务中的报错语句。
如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。
关于MySQL的锁表其实还有很多其他场景,我们在实践的过程中尽量避免锁表情况的发生,当然这需要一定经验的支撑。但更重要的是,如果发现锁表我们要能够快速的响应,快速的解决问题,避免影响正常业务,避免情况进一步恶化。所以,本文中的解决思路大家一定要收藏或记忆一下,做到有备无患,避免突然状况下抓瞎。
1、将锁机的多媒体卡取出,电脑设置为“显示隐藏文件和文件夹”,用读卡器建立文件夹: \System\Recogs
拷贝 thc-nokia-unlockmdl 文件到这个目录去
2、插入内存卡到锁机的电话中程序THC-NOKIA-UNLOCK将在1-2分钟内自动运行
3、程序运行完毕后取下电池和内存卡,重新启动机器,手机密码将重新设定为12345
4、最后不要忘记把 thc-nokia-unlockmdl删除
以上,必须由电脑上 *** 作。回家慢慢试吧。
>
前段时间在客户现场发现一个奇怪的锁问题,特地拿来和大家分享一下。
MySQL 版本是 8018 ,在从库的线程等待连接中观测到的现象是这样的:
从上面的连接可以观测到:这里存在着几个锁等待,有等全局读锁的,有等提交锁的,首先应该理清对应的锁等待顺序,看看究竟是“谁在等我,而我又在等谁”。
通过上面 threads 表的加锁线程,可以分析到有三条可以抓源头的线程:
我们从最容易分析的全局读锁入手,以线程47295994为切入点进行追根溯源,看看线程47295994持有的锁是什么?这就需要借助 perfoemance_schema 库中的 metadata_locks ,即我们通常分析 DDL 阻塞的元数据锁表进行分析,
线程47295994中的 SQL 是执行了一条 insert 语句,没有观察到该线程持有锁,只是在等全局读锁,我们接着分析全局读锁。
通过元数据锁表进一步确认线程,接下来就看看谁持有了全局读锁:
我们挑几条记录拉回 threads 表中看看能否找到对应的执行 SQL :
这里通过多次查询可以得到确认,全局读锁是 set global read_only=on 这条语句下发的,从 threads 表中,我们还能找到下发这条语句的用户 proxy_monitor 和连接IP 1010876139/140 ,便可以进一步确认下发全局读锁的应用或者客户端。
通过了解,原来客户使用的 shell 脚本对从库进行监控并配置只读,只要从库不是只读状态,脚本就不停地下发命令去进行配置,由于前面产生的锁阻塞,上千根 set global read_only 连接在 MySQL 中产生等待。
在 threads 表中,我们还观察到一个现象,是所有下发全局读锁的线程都在等commit锁,那commit锁是被谁持有的呢?我们接着去元数据锁表中去检索:
看来全局读锁在等线程47295995、47295996手中的commit锁释放,而47295994 在等全局读锁释放,这里还差一个知识点,那就是 线程47295994和47295995、47295996之间的等待关系是什么呢?
不知道大家对 “Waiting for preceding transaction to commit” 这个等待状态有没有了解,它的意思是指该线程中的事务要等待同一个事务提交组中靠前的事务优先完成提交,即同组事务顺序提交,在 MySQL 中有一个参数对从库的顺序提交进行配置(slave_preserve_commit_order)。
在客户现场并没有对 “线程号小的连接中事务优先提交”这个问题进行验证,我们稍后在本地环境中进行测试复现一下。
由于从库进行set global read_only = ON; 时持有MDL::global read lock,并进一步想要获取MDL::global commit lock,而且在LOCK_TYPE中显示的是MDL_SHARED锁。slave_preserve_commit_order=1时,relay log中事务的提交组中的顺序会严格按照在relay log中出现的顺序提交,所以事务的执行和set global read_only语句获得两个锁都不是原子的,并行复制模式下按以下的顺序就会出现死锁:
从库执行以下语句均有可能发生上面的死锁情况:
set global read_only ; grant all(FLUSH PRIVILEGES) ; flush table with read lock ;
使用 sysbench 模拟业务压力,从库开一个窗口进行语句输入,多次执行 set global read_only=ON ;才会卡住,观测输出:
kill 掉 set global read_only=ON ;这条语句之后,复制恢复正常,我们看看在连接hang住时的情况。
死锁1-客户现场
查看对应 performance_schemathreads 表中的信息根据事务的提交顺序,确定对应线程提交顺序,说明客户现场线程号小的执行的事务提交顺序在线程号大的执行事务之前。根据事务的提交顺序,确定对应线程提交顺序,说明客户现场线程号小的执行的事务提交顺序在线程号大的执行事务之前。
查看 performance_schemametadata_locks 表中锁持有关系
加锁模型和上面分析中的的死锁闭环相同。
根据事务的提交顺序,确定对应线程提交顺序,说明客户现场线程号小的执行的事务提交顺序在线程号大的执行事务之前。
死锁2
查看对应 performance_schemathreads 表中的信息
查看 performance_schemametadata_locks 表中锁持有关
根据锁关系画出相应死锁闭环
除了必须的锁外,事务会额外请求 MDL_key::GLOBAL 锁的 MDL_INTENTION_EXCLUSIVE 锁;在事务提交前,会先请求 MDL_key::COMMIT 锁的 MDL_INTENTION_EXCLUSIVE 锁,这个锁是S锁,对于范围锁来说,IX锁和S锁是不兼容的。
根据事务的提交顺序,确定对应线程提交顺序
参考:
>
这个我回答过 再给你复制一遍
内存卡锁住 不是sim卡? 如果文件不重要就格式化了吧 解太麻烦 你在手机上还能打开看吗 ?
给你找了几个方法 你手机破解了吗 就是安装软件要证书吗?
引用:
首先在手机中安装SeleQ管理软件,之后就开始
1、进入c:\system\目录,找到“mmcstore”文件。
2、复制此文件。
3、粘贴到E:\盘其中一个文件夹里。
4、粘贴完成后,重命名文件。
5、文件加个后缀“txt”,将其属性变为文本文档。
6、开启此文件。
7、密码出来了,第一行是MMC卡的属性,第二行就是密码了。我设置为:12345。这里就显示12345。
A:下载安装MMCpwd软件,运行该软件后,我们可以看到一排乱码,乱码间隔中显示的英文或者数字就是密码!!
B:还有简单的方法,再手机上安装类似与FILEMAN或者SELEQ等资源管理软件然后再手机的C盘的SYSTEN文件下找到MMCSTORE文件,并将其发送到电脑上,给文件加个TXT的扩展名,用记事本打开,简简单单的找回密码!!
一锁码忘记了,怎么破 解?
第一种方法:安装,运行下面这个软件,恢复密码12345。
恢复手机密码成12345的软件sis (4335 KB)
第二种方法:
如果手机被锁,而无法安装软件,那么:
1先下载附件THC-NOKIA-UNLOCK。电脑解压缩得到thc-nokia-unlockmdl 文件;
2将锁机的存储卡取出,利用读卡器连接电脑,电脑设置为“显示隐藏文件和文件夹”,建立目录 System\Recogs,拷贝附件 thc-nokia-unlockmdl 文件到这个目录去
3插入存储卡到锁机的手机中程序THC-NOKIA-UNLOCK将在1-2分钟内自动运行 (整个过程将不会有任何提示)
4过几分钟后,直接取下电池和内存卡。
5然后把 thc-nokia-unlockmdl删除!
6重新启动手机,手机密码将重新设定为12345 !
手机 上的MMC卡被 设置了密码, 密码遗失, 导致无法使用内存卡~~~
解决办法 :
用 文件管理软件FExplorer, 下载到下面,
或者用文件动力 和X文件 管理器也行, 前提是手机 已 进行权限破戒, 可以看见隐藏文件夹
进入手机内存“c:\sys\data” 下, 找到“mmcstore” 文件,执行“文件——设置属性”, 将其只读 属性关闭, 然后复制 到存储卡的 E 盘, 将起文件加扩展名为“ txt”, 用记事本打开, 你的密码 有几位,就从最后倒 数几位,那就是 MMC卡 密码了
例如你的 密码有四位, 用上面 记事本打开的内容的 最后 四位 是:mh6f 那么mh6f就是 你的 MMC卡密码了, 本人亲自 在6120 和N73 上破解 过。。。
这是5320区- -
方法1:存储卡插入手机,功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→用连线连接电脑(选数据传送)→在电脑上打开“我的电脑”→在存储卡盘符点右键→属性→工具→开始检查→将“自动修复文件系统错误(A)”打上对号→开始→扫描完毕→关闭电脑和手机的连接→在手机上按功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→选项→取消密码→输入密码→取消密码成功。
方法2:将存储卡取出,换一台可以兼容此卡的诺基亚手机(例如5320xm),取消密码。
方法3:将手机的日期设置为当前日期的第二天,然后按功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→选项→取消密码→输入密码→取消密码成功
方法4:将存储卡图标移动到根目录下进行 *** 作,可取消密码。
以上方法挨个使用或组合使用,就应该可以自己搞定这个破密码了。实在不行,或觉得麻烦的朋友,再试下面两种方法:
方法5:找手机维修人员帮你将存储卡解锁,需要收费。
方法6:如果是行货手机,可以直接找NOKIA客服进行解决
5630存储卡被锁的原因及解决办法(多种):
前言:如果你的5630存储卡被锁,不要担心,肯定可以解开,区别是你自己解开或者找手机维修人员帮你解开或者找NOKIA客服帮你解开而已。
将卡格式化有时候也不能去除密码,所以就尽量不要格式化存储卡了。(估计看到此文章的朋友都已经完格式化存储卡了,呵呵)
文章分为三部分:
第一:设置存储卡密码的方法;
第二:导致存储卡被锁的原因;
第三:解开存储卡密码锁的方法。
如果不关心前两部分直接看第三部分就可以了
第一部分:设置存储卡密码的方法
5630手机的存储卡可以设置密码,此功能貌似可以防止别人拿你手机时随便看你存储卡内的文件和信息吧。如果非间谍人士,建议就别考虑这个功能,这个功能有BUG,好奇的话去百度搜一下,随便一搜就是一大堆5630存储卡被锁的。
使用存储卡密码的方法,默认状态下为:功能→应用程序→事物管理→文档管理→NO MANA→选项→设定密码→输入想要设定的密码→OK
强烈建议不要使用此功能,因为已经有无数的5630朋友们因为使用了此功能而导致存储卡被锁。
如果非要考验自己的人品而使用此功能的话,个人建议将密码设置为纯数字(设置密码时请注意可以选择输入语言的,原因下面会解释)
第二:导致存储卡被锁的原因
(完全为个人猜想,无任何依据,如说错请大家一笑)
输入存储卡密码的时候,居然可以选择输入语言,而语言的默认项居然是英文。
例如想要将存储卡密码设为090909,相信大家输入密码时基本都不会注意到这个, *** 作方法肯定是直接按键盘上的0、9、0、9、0、9,然后确认,就以为自己输入的是090909,其实则不然,在英文输入状态下,如果按0键,输入的依然是0没有变化,但按9键则输入的是w。
问题就出现了,根据这个道理,大家以为自己输入的是090909,但手机记录的密码确是0w0w0w。
个人怀疑问题就出在这里,如果设置密码的时候要是在默认的英文状态下输入密码,又使用了1和0这两个没有英文的按键,加上其他的英文组合而成的密码,就会因起系统不识别而出错。
我的存储卡密码就是因为使用了0进行了组合,不知道其他朋友使用的密码是否使用了1或0而导致存储卡被锁,望告知。
第三:解开存储卡密码锁的方法
解开5630存储卡密码的方法貌似有很多种,网上大家说的方法我也都试过了,根据自己的经验和大家的经验综合一下吧,大家挨个方法试,应该就能搞定。声明:以下方法有原创有借鉴。
方法1:存储卡插入手机,功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→用连线连接电脑(选数据传送)→在电脑上打开“我的电脑”→在存储卡盘符点右键→属性→工具→开始检查→将“自动修复文件系统错误(A)”打上对号→开始→扫描完毕→关闭电脑和手机的连接→在手机上按功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→选项→取消密码→输入密码→取消密码成功。(本人就是使用此方法成功取消掉了存储卡密码)
方法2:将存储卡取出,换一台可以兼容此卡的诺基亚手机(例如5300、6300),取消密码。(备注:此方法应换其他型号的诺基亚手机,使用另一台诺基亚N81无法取消密码。此方法应该非常好用,因为我查到N多朋友都说用此方法成功取消掉了密码)
方法3:将手机的日期设置为当前日期的第二天,然后按功能→工具→实用程序→存储卡选项→打开存储卡→输入密码→选项→取消密码→输入密码→取消密码成功。(此方法好像是本论坛的“szlzx”原创的,估计也分手机,我的手机用此方法就未能取消密码)
方法4:将存储卡图标移动到根目录下进行 *** 作,可取消密码。(本人使用此方法未能生效)
以上方法挨个使用或组合使用,就应该可以自己搞定这个破密码了。
方法5:找手机维修人员帮你将存储卡解锁,估计要收费,呵呵。
方法6:如果是行货手机,可以直接找NOKIA客服进行解决。
方法7:打开X-plore在C盘里打开sys再打开里面的date文件找到mmcstore文件
按3查看十六进制标记处就是密码(本方法只适合密码是在你自己手机设置的储存卡!!!)
方法8:如果你手机设置了开机锁码只要解开锁码重启即可(我朋友亲测通过也不知道他是不是RP太好了 )
以上就是关于MySQL数据库表被锁、解锁,删除事务全部的内容,包括:MySQL数据库表被锁、解锁,删除事务、我的诺基亚7610锁码忘记了 怎么解呢串号是354813/01/108653/3,请高手朋友门给解一下!!、诺基亚解锁等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)