使用 PLAN REPLAYER 保存和恢复集群现场信息

    PLAN REPLAYER 主要功能如下:

    • 导出排查现场 TiDB 集群的相关信息,导出为 ZIP 格式的文件用于保存。
    • 在任意 TiDB 集群上导入另一 TiDB 集群现场信息的 ZIP 文件。

    你可以使用 PLAN REPLAYER 来保存 TiDB 集群的现场信息。导出接口如下:

    TiDB 根据 sql-statement 整理出以下集群现场信息:

    • TiDB 版本信息
    • TiDB 配置信息
    • TiDB Session 系统变量
    • TiDB 执行计划绑定信息(SQL Binding)
    • sql-statement 中所包含的表结构
    • sql-statement 中所包含表的统计信息
    • EXPLAIN [ANALYZE] sql-statement 的结果

    注意

    PLAN REPLAYER 不会导出表中数据

    1. use test;
    2. create table t(a int, b int);
    3. insert into t values(1,1), (2, 2), (3, 3);
    4. analyze table t;
    5. plan replayer dump explain select * from t;

    保存和恢复集群现场信息 - 图2

    注意

    ZIP 文件最多会在 TiDB 集群中保存一个小时,超时后 TiDB 会将其删除。

    1. MySQL [test]> plan replayer dump explain select * from t;
    1. | Dump_link |
    2. | replayer_JOGvpu4t7dssySqJfTtS4A==_1635750890568691080.zip |
    3. +------------------------------------------------------------------+
    4. 1 row in set (0.015 sec)

    你同样可以通过 tidb_last_plan_replayer_token 这个会话变量来获取上一次 PLAN REPLAYER dump 执行的结果。

    1. | @@tidb_last_plan_replayer_token |
    2. +-----------------------------------------------------------+
    3. | replayer_Fdamsm3C7ZiPJ-LQqgVjkA==_1663304195885090000.zip |
    4. +-----------------------------------------------------------+
    5. 1 row in set (0.00 sec)

    对于多条 SQL 的情况,你可以通过文件的方式来获取 plan replayer dump 的结果,多条 SQL 语句在文件中以 ; 进行分隔。

    1. plan replayer dump explain 'sqls.txt';
    1. SELECT @@tidb_last_plan_replayer_token;

    因为 MySQL Client 无法下载文件,所以需要通过 TiDB HTTP 接口和文件标识下载文件:

    1. http://${tidb-server-ip}:${tidb-server-status-port}/plan_replayer/dump/${file_token}
    1. curl http://127.0.0.1:10080/plan_replayer/dump/replayer_JOGvpu4t7dssySqJfTtS4A==_1635750890568691080.zip > plan_replayer.zip

    使用 PLAN REPLAYER 导入集群信息

    警告

    PLAN REPLAYER 在一个 TiDB 集群上导入另一集群的现场信息,会修改导入集群的 TiDB Session 系统变量、执行计划绑定信息、表结构和统计信息。

    PLAN REPLAYER 导出的 ZIP 文件后,用户便可以通过 PLAN REPLAYER 导入接口在任意 TiDB 集群上恢复另一集群地现场信息。语法如下:

    1. PLAN REPLAYER LOAD 'file_name';

    以上语句中,file_name 为要导入的 ZIP 文件名。

    示例如下:

    1. mysql> desc t;
    2. | Field | Type | Null | Key | Default | Extra |
    3. +-------+---------+------+------+---------+-------+
    4. | b | int(11) | YES | | NULL | |
    5. +-------+---------+------+------+---------+-------+
    6. 2 rows in set (0.01 sec)
    7. mysql> explain select * from t where a = 1 or b =1;
    8. +-------------------------+---------+-----------+---------------+--------------------------------------+
    9. | id | estRows | task | access object | operator info |
    10. +-------------------------+---------+-----------+---------------+--------------------------------------+
    11. | TableReader_7 | 0.01 | root | | data:Selection_6 |
    12. | └─Selection_6 | 0.01 | cop[tikv] | | or(eq(test.t.a, 1), eq(test.t.b, 1)) |
    13. | └─TableFullScan_5 | 6.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
    14. +-------------------------+---------+-----------+---------------+--------------------------------------+
    15. 3 rows in set (0.00 sec)
    16. mysql> show stats_meta;
    17. +---------+------------+----------------+---------------------+--------------+-----------+
    18. | Db_name | Table_name | Partition_name | Update_time | Modify_count | Row_count |
    19. +---------+------------+----------------+---------------------+--------------+-----------+
    20. | test | t | | 2022-08-26 15:52:07 | 3 | 6 |
    21. 1 row in set (0.04 sec)

    加载并还原所需现场后,即可在该现场诊断和改进执行计划。