min和max一起取和分开取,执行计划差异很大
麻烦直接给下结果 。min 以及 max 分别是多少。
min=2 max=3079819031,直接查会卡住
请问这个表现在的数据是静止的还是不断有业务写入的?
有数据的写入和读取
读取主要就是 按照上面那个辅助索引读取大概10~40条记录
explain SELECT MIN(id),MAX(id) FROM online_db where id > 0
看下结果。
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);
}
*/
我获取的就是这个分支,只是为了验证才去clone了一下https://github.com/maxbube/mydumper做下对比
好的,感谢反馈。我们复现下。
可否帮忙打一个临时fix的mydumper的包?
- 建议参考下这个 https://github.com/leoppro/mydumper_builder 来初始化 build 的环境。
- 这个是 TiDB 侧的问题。建议更新 TiDB 。更新 Mydumper 并不能完全解决处理这个问题。