如何把TIDB5.1版本(A集群)中全部的bind执行计划,方便的迁移到TIDB7.5版本(B集群)?

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.1.4–>v7.5.2
【复现路径】
【遇到的问题:问题现象及影响】
问题:如何把TIDB5.1.4版本(A集群)中全部的bind执行计划,方便的迁移到TIDB7.5版本(B集群)?
我有两个集群 A集群(5.1.4),B集群(7.5.2)。两个集群的表相同,我希望把A集群的全部binding计划(>100个)迁移到高版本的B集群。

相关尝试:

  1. 我尝试把A集群(5.1版本)的 mysql.bind_info表中信息–> 导到B集群(7.5版本),发现两个版本的表结构有变化。
    7.5增加了sql_digest,plan_digest两个字段。故不能直接导出/导入到7.5版本的集群。
备份binding执行计划
mysql -uroot -h127.0.0.1 -P4000 -p -NBe "select * mysql.bind_info\G" > /home/db/tidb/bing_info$(date +"%m%d").txt

反向创建binding执行计划
mysql -uroot -h127.0.0.1 -P4000 -p -NBe "SELECT concat('use  ', default_db,';', 'CREATE GLOBAL BINDING for ', original_sql ,' using ', bind_sql ,';') from mysql.bind_info  order by create_time" > /home/db/tidb/bind_info$(date +"%m%d").sql

恢复则通过 source 进行恢复即可,涉及到 sql_digest,plan_digest 应该可以传入 '' 空值,因为不是必须的,只为新版本为了方面绑定执行计划精确,可以通过 SQL 执行计划演进的功能,结合 v7 版本的下推计算等优化,重新演进新的执行计划提升查询性能。

另外可以尝试 BR 提供的 备份恢复绑定执行计划的功能 恢复系统表中存储的执行计划绑定信息

1 个赞

original_sql是参数化过的,可以直接这样建吗

我记得是可以的哦,binding 信息还是手工重建比较好,不建议跨版本使用 br 恢复 binding 信息

可以的哈

动手太快了,我还没抽出来时间测一下呢 :call_me_hand:

bing不建议用

恢复系统表中存储的执行计划绑定信息 。 这个链接很好。

最后我的操作过程是:

  1. 备份band信息
    mysqldump -h ip -P 4000 -t mysql bind_info --skip-lock-tables --set-gtid-purged=OFF >band_info-mysqldump.sql

  2. 修改sql文件
    删除band_info-mysqldump.sql 中mysqldump注释信息,如/*!40101 *!50112等.
    修改SQL指定bind_info中列名,导入新的 tidbip

3.导入
mysql -h ip_new -P 4000 mysql < band_info-mysqldump.sql

4.检查信息
参考 恢复系统表中存储的执行计划绑定信中内容
– 确保 mysql.bind_info 表中 builtin_pseudo_sql_for_bind_lock 的记录仅 1 行,如果多于 1 行,需要手动删除
select * from mysql.bind_info;
SELECT count(*) FROM mysql.bind_info WHERE original_sql = ‘builtin_pseudo_sql_for_bind_lock’;
DELETE FROM bind_info WHERE original_sql = ‘builtin_pseudo_sql_for_bind_lock’ LIMIT 1;

  1. – 强制重新加载绑定信息
    ADMIN RELOAD BINDINGS;
  2. 检查
    SHOW GLOBAL BINDINGS;