mysql怎么加全局锁 mysql 设置全局变量( 四 )


方法2:利用 events_statements_history 视图此方法适用于 MySQL 5.6 以上版本 , 启用 performance_schema.eventsstatements_history(5.6 默认未启用,5.7 默认启用),该表会 SQL 历史记录执行,如果请求太多 , 会自动清理早期的信息,有可能将上锁会话的信息清理掉 。
方法3:利用 gdb 工具如果上述两种都用不了或者没来得及启用,可以尝试第三种方法 。利用 gdb 找到所有线程信息,查看每个线程中持有全局锁对象,输出对应的会话 ID,为了便于快速定位,mysql怎么加全局锁我写成了脚本形式 。也可以使用 gdb 交互模式,但 attach mysql 进程后 mysql 会完全 hang 住,读请求也会受到影响 , 不建议使用交互模式 。
方法4:show processlist
如果备份程序使用的特定用户执行备份 , 如果是 root 用户备份,那 time 值越大的是持锁会话的概率越大,如果业务也用 root 访问,重点是 state 和 info 为空的,这里有个小技巧可以快速筛?。?筛选后尝试 kill 对应 ID,再观察是否还有 wait global read lock 状态的会话 。
方法5:重启试试!
mysql中的锁都有哪些MySQL 中有哪些锁?
数据库中锁的设计初衷处理并发问题,作为多用户共享资源,当出现并发访问的时候,数据库需要合理控制资源访问规则 。锁就是实现这些访问规则中的重要数据 。
锁的分类
根据加锁范围,MySQL 里面的锁可以分成 全局锁 、 表级锁 、 行锁 三类 。
全局锁
全局锁,就是对整个数据库实例加锁,MySQL 提供了一个加全局读锁的方法,命令是:
Flush tables with read lock (FTWRL)
当需要整个库只读状态的时候,可以使用这个命令,之后其他线程的:数据更新语句(增删改),数据定义语句(建表,修改表结构)和更新事务的提交语句将会被阻塞 。
全局锁的使用场景
全局锁的定型使用场景,做 全库逻辑备份。也就是把整个库每个表都 Select 出来,然后存成文本 。
如何整个库都只读,会有什么问题?如果你在主库上备份,那么在备份期间都不能执行更想,业务就基本上停摆 。如果在从库上备份,那么备份期间从库不能执行主库同步过来的 binlog ,会导致从延迟 。既然要全库只读,为什么不使用set global readonly=true的方式呢?
readonly 方式也可以让全库进入只读状态,但我还是会建议你用FTWRL方式,主要有两个原因:
一是,在有些系统中, readonly的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库 。因此,修改global变量的方式影响面更大,我不建议你使用 。二是,在异常处理机制上有差异 。如果执行FTWRL命令之后由于客户端发生异常断开 ,  那么MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态 。而将整个库设置为readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个库长时间处于不可写状态 ,  风险较高表级别锁
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lok, MDL) 。表锁的语法是 :
lock tables ... read/write
与 FTWRL 类似,可以使用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放 。需要注意的是,lock tables语法除了会限制别的线程的读写外 , 也限定了本线程接下来的操作对象 。
MDL 表级锁
MDL 不需要显示使用 , 在访问一个表的时候自动加上,MDL 保证读写的正确性,也就是说在查询数据时,不允许有其他线程对这个表结构做变更 。
什么操作会加 MDL 锁?
在MySQL 5.5版本中引入了MDL,当对一个表做增删改查操作的时候,加 MDL读锁 ;当要对表做结构变更操作的时候,加 MDL写锁。

推荐阅读