MyDumper引发服务不可用故障

时间:2024-03-13 16:15:17

MyDumper 多线程并行全量备份,以其无可比拟的性能优势广泛用于线上数据库的MySQL 备份,当然也可用于 percona db, tidb 等等。

mydumper 详细介绍请参考github地址

问题

在MySQL使用mydumper备份过程中, 发现如下图所示的问题
MyDumper引发服务不可用故障

MyDumper引发服务不可用故障

数据库报警导致主从复制延迟超出阈值引发报警, 业务数据表 (innodb)引擎无法执行insert.

原因

因为mydumper持有 FTWRL(FLUSH TABLES WITH READ LOCK), mydumper启动的时候导致业务方数据的所有读写都必须等待全局读锁释放.

解决

查看 mydumper-0.9.5 版本 源码

# line 1538 
if (have_backup_locks) {
    // do something parameters Using Percona Backup Locks
} else if (lock_all_tables) {
    // do something 
} else {
    // FLUSHT TABLES WITH READ LOCK 
      if (mysql_query(conn, "FLUSH TABLES WITH READ LOCK")) {
        g_critical("Couldn't acquire global lock, snapshots will not be "
                   "consistent: %s",
                   mysql_error(conn));
        errors++;
      }
}

如果开启 参数 lock-all-tables 则mydumper不会执行全局读锁, 从而不会因为全局读锁导致阻塞非innodb的表的读写。

结果

  • 执行的命令
    变更前

    mydumper -h 127.0.0.1 -u %s -p %s -P %s -C -c --long-query-guard 600 --kill-long-queries -r 10000000 -t
    

    修正后

    mysqldp -h 127.0.0.1 -u %s -p %s -P %s -C -c --lock-all-tables --long-query-guard 600 --kill-long-queries -r 10000000 -t
    
  • 效果对比图
    MyDumper引发服务不可用故障
    图左是 执行FTWRL,可以看到红框内明显执行 FTWRL
    执行命令如下

    mydumper -h 127.0.0.1 -u root -p secret -P 3306 -B test -o /tmp/
    

    图右边 执行的是 lock-all-tables, 可以看到红框当中并没有执行 FTWRL 执行命令如下

    mydumper -h 127.0.0.1 -u root -p secret -P 3306 -B test --lock-all-tables -o /tmp/