MySQL5.7安装插件导致主库hang住死锁无响应

一、背景

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

二、故障复现

环境:

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

复制步骤:

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

通过分析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);