Mydumper新版本全量备份oom断开

min和max一起取和分开取,执行计划差异很大

麻烦直接给下结果 。min 以及 max 分别是多少。

min=2 max=3079819031,直接查会卡住

请问这个表现在的数据是静止的还是不断有业务写入的?

有数据的写入和读取

读取主要就是 按照上面那个辅助索引读取大概10~40条记录

explain SELECT MIN(id),MAX(id) FROM online_db where id > 0 看下结果。


直接执行 ERROR 1317 (70100): Query execution was interrupted

explain SELECT MIN(id),MAX(id) FROM online_db where id is not null 这样看下

没有什么变化的感觉

另外,那个导出正常的表,其实使用的索引也不是主键,估计只是数据量相对小,所以没有出错吧

嗯。是的。这个 min 以及 max 的获取超时导致了 mysqldumper -r 以及 -F 失效了。 SELECT MIN(id),MAX(id) FROM online_db where id < 1500000000 看下能否正常查出来。

还是失败了

SELECT MIN(id),MAX(id) FROM online_db where id < {id} 现在的策略是建议尝试使用 id 范围来限制这个查询的范围,减少 scan 的影响 ,使用 Mydumper 的 where 参数暂时绕过该问题。SELECT MIN(id),MAX(id) FROM online_db 的性能问题这边已经修复。新版本会 fix 。拆分的时候注意 Mydumper 要指定 --tidb-snapshot 保证是基于同一个 snapshot 来备份。

手动拆分感觉还是比较麻烦,我改了下mydumper的源码,使用

select min(id), max(id) from ((select id from table1 order by id limit 1) union (select id from table1 order by id desc limit 1)) a

替代

select min(id), max(id) from table1

目前执行计划看着没什么问题,但是make的时候报错:

[root@b6bd12232e74 mydumper]# make
[ 10%] Linking C executable myloader
/usr/bin/ld: attempted static link of dynamic object `/usr/lib64/mysql/libmysqlclient.so'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/myloader.dir/build.make:134: myloader] Error 1
make[1]: *** [CMakeFiles/Makefile2:99: CMakeFiles/myloader.dir/all] Error 2
make: *** [Makefile:130: all] Error 2

我直接clone: GitHub - mydumper/mydumper: Official MyDumper Project make却成功了

请问下是什么原因?c不是很懂,改动如下,但是上面make的时候是直接clone后没有任何改动的报错

g_string_printf(query_string, "SELECT %s MIN(`%s`),MAX(`%s`) FROM ((select `%s` from `%s`.`%s` order by `%s` limit 1) union (select `%s` from `%s`.`%s` order by `%s` desc limit 1)) a",
                    select_hint, field, field, field, database, table, field, field, database, table, field)
    /*
    g_string_printf(query_string, "SELECT %s MIN(`%s`),MAX(`%s`) FROM `%s`.`%s`", select_hint, field, field, database, table);
    if (where_clause) {
        g_string_append_printf(query_string, " WHERE %s", where_clause);
    }
    */

我们这边先测试一下,看能否重现,另外如果需要备份 TiDB 请 clone PingCAP 的分支: https://github.com/pingcap/mydumper

我获取的就是这个分支,只是为了验证才去clone了一下https://github.com/maxbube/mydumper做下对比

好的,感谢反馈。我们复现下。

可否帮忙打一个临时fix的mydumper的包?

  1. 建议参考下这个 https://github.com/leoppro/mydumper_builder 来初始化 build 的环境。
  2. 这个是 TiDB 侧的问题。建议更新 TiDB 。更新 Mydumper 并不能完全解决处理这个问题。