MySQL5.7主库安装半同步插件导致主库hang住无响应

1. 背景

MySQL 1主2从,半同步复制,主库有较高的写入量,此时在主库重复安装半同步插件,可能导致主库hang住,无响应,只能通过重启数据库来恢复。

MySQL版本:Percona Server 5.7.19
操作系统:Red Hat Enterprise Linux Server release 6.3

2. 复现步骤

  1. 准备环境MySQL 5.7.19 1主2从,半同步复制
  2. 使用sysbench往主库写数据
  3. 在主库循环执行安装半同步插件命令:
    a) INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    b) INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  4. 在应用机器上连接到主库,多线程循环执行:
    a) select @@session.tx_read_only
  5. 运行一段时间,复现故障。
    a) 主库无法连接,无响应
    b) 从库Slave_IO_Running: Connecting

3. 原因分析

通过分析MySQL源码,安装半同步插件过程中,加锁顺序为:

//sql/sql_plugin.cc
mysql_mutex_lock(&LOCK_plugin);
mysql_rwlock_wrlock(&LOCK_system_variables_hash);
…
if (plugin_find_internal(name_cstr, MYSQL_ANY_PLUGIN))
  {
    mysql_mutex_unlock(&LOCK_plugin);
    report_error(report, ER_UDF_EXISTS, name->str);
    mysql_mutex_lock(&LOCK_plugin);
    DBUG_RETURN(TRUE);
  }
…
mysql_rwlock_unlock(&LOCK_system_variables_hash);
mysql_mutex_unlock(&LOCK_plugin);

在发现半同步插件已经安装的情况下,会先释放锁 mysql_mutex_unlock(&LOCK_plugin); 然后报告错误(report_error) ,也就是常见到的 Function 'rpl_semi_sync_master' already exists, 之后再加锁mysql_mutex_lock(&LOCK_plugin);
这个释放锁,报告错误信息,再加锁的间隙,LOCK_plugin 可能会被其他线程拿到。

其他线程加锁顺序为:

mysql_mutex_lock(&LOCK_plugin);
mysql_rwlock_rdlock(&LOCK_system_variables_hash);

拿到第一个锁,等LOCK_system_variables_hash, 而LOCK_system_variables_hash这个锁被安装半同步插件线程持有,导致死锁。

扩展一下,安装插件,除了插件已经存在之外,无法打开动态库(Can't open shared library)和 动态库无法找到符号入口(Can't find symbol in library),都有可能与业务SQL产生死锁。

mysql_mutex_unlock(&LOCK_plugin);
report_error(report, ER_CANT_OPEN_LIBRARY, dl->str, 0, buf);
mysql_mutex_lock(&LOCK_plugin);
mysql_mutex_unlock(&LOCK_plugin);
report_error(report, ER_CANT_FIND_DL_ENTRY, name->str);
mysql_mutex_lock(&LOCK_plugin);

另外,除了半同步插件外,其他的插件,如审计插件(Audit)等,都有可能会触发死锁。


Percona Server 5.7.25 已修复该Bug。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容

  • 一、复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。 在2000年,MySQL 3.23...
    张伟科阅读 11,316评论 0 9
  • (第二十一周作业) 1、对数据库实现lvm2的备份和慢查询优化 1.1 LVM2备份操作 配合lvm2实现数据库备...
    haoxi2018阅读 391评论 0 1
  • MySQL运维实践 5.1-MySQL日志系统 什么是日志 日志(log)是一种顺序记录事件流水的文件 记录计算机...
    极客圈阅读 1,418评论 1 11
  • MariaDB是MySQL的一个主要的开源分支。由于oracle收购MySQL之后,担心将其闭源,MySQL之父m...
    家里蹲大叔阅读 1,841评论 0 1
  • 时间:2019.3.18~2019.3.124 谁享受谁快乐,谁坚持谁痛苦 【上周计划 2019.3.12~201...
    腾飞的叶子阅读 246评论 0 0