Mysql /*!50100 */ 条件编译

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:V3.0.7
  • 【问题描述】:原本业务中很多表分区都带上了条件编译,mydumper到处是否能将这些条件编译转为强制编译

1、请给出原业务中分区表条件编译的示例语句,/* !50100*/ 表示的是在 5.01.00 版本或者更高版本才可以执行。

2、mydumper 提到的强制编译,能否给出示例语句,或者期待的条件转强制编译的示例语句

CREATE TABLE xxx ( Id bigint(18) NOT NULL, CreateTime datetime NOT NULL, … PRIMARY Id ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT /!50100 PARTITION BY RANGE (TO_DAYS(CreateTime)) (PARTITION p0 VALUES LESS THAN (737060) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (737241) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (737303) ENGINE = InnoDB, …) /; 就是其实就是想mydump 出来的xxx-schema.sql 中不会有/!50100 ,/也就是这个在 5.01.00 版本或者更高版本才可以执行的条件取消。

CREATE TABLE xxx ( Id bigint(18) NOT NULL, CreateTime datetime NOT NULL, … PRIMARY Id ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT PARTITION BY RANGE (TO_DAYS(CreateTime)) (PARTITION p0 VALUES LESS THAN (737060) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (737241) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (737303) ENGINE = InnoDB, …); 得到如上,这样在loader导入到Tidb就不再需要修改语句了

你那边使用 tidb 的 mydumper 导出 mysql 数据,并且带有 /* !50100*/ create-schema.sql 的文件,再使用 tidb 的 loader 导入数据到 tidb 中的时候,是报什么错了吗?修改 create-schema.sql 的原因是什么?

对,报错了,具体错误我忘记了,后来我就把createtime-schema.sql 中/!50100 */ 删除就好了

建议复现下报错,上传相关的报错信息,然后再分析看下原因~

复现有点困难,我这边已经都搞好了,还是你们帮我复现下

感谢答复,从您的答复看,可能当时使用的是mydump所以报错. 建议下次问题出现的时候,您可以确认一下,是mydump还是mydumper. 然后我们再具体查看一下问题,多谢

用的官方的mydumper,我很确定

那么请问报错还记得是什么吗? 关键字之类的,多谢.

好像是这个/*!50100 STORAGE MEMORY */

您好: 我这边找了一下,没有找到类似报错,请您下次有这个问题的时候,再发一下报错,我们一起查看一下,多谢.

好的,谢谢

1、这里基本复现了这个问题,在 MySQL 中,只有 NDB 引擎的 table 会使用到 storage 关键字,且该属性对 innodb 存储引擎不生效。详情可见 MySQL 官方文档:

2、请确认下,源 MySQL 表的存储引擎是什么,如果是 NDB,那么在导出时可能会带有该关键字。如果是 innodb ,那么需要确认下目标表的存储引擎是否做过切换,或者在建表时是否引入了 storage,形如:

3、如果是上述表做 mydumper 导出,导出的 sql 文件中也会带有 storage 关键字,并且该关键在目前在 tidb 不兼容:

4、如果方便请提供源 MySQL 目标表的建表语句,确认下上面的推测。

十分感谢我这就去排查一下

我这边查了下是有这个添加,非常感谢,辛苦了

:+1::+1::+1: