美文网首页
ElasticJob启动时报错:Index column siz

ElasticJob启动时报错:Index column siz

作者: 王月亮17 | 来源:发表于2022-08-28 10:40 被阅读0次

    最近初用ElasticJob,启动项目时出现了一个非常棘手的错误,在本地环境报错如下:

    [main] 10-10 18:24:24 ERROR 66376 com.dangdang.ddframe.job.event.JobEventBus - Elastic job: create JobEventListener failure, error is: 
    com.dangdang.ddframe.job.event.JobEventListenerConfigurationException: java.sql.SQLException: Index column size too large. The maximum column size is 767 bytes.
        at com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration.createJobEventListener(JobEventRdbConfiguration.java:48) ~[elastic-job-common-core-2.1.5.jar:na]
    ...
    Caused by: java.sql.SQLException: Index column size too large. The maximum column size is 767 bytes.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084) ~[mysql-connector-java-5.1.30.jar:na]
    ...
    

    因为不影响使用,便上了正式环境,在正式环境报错如下(不知道为什么不一样):

    10-17 12:07:57 [main][ERROR][com.dangdang.ddframe.job.event.JobEventBus.register():60] - Elastic job: create JobEventListener failure, error is:
    com.dangdang.ddframe.job.event.JobEventListenerConfigurationException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
            at com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration.createJobEventListener(JobEventRdbConfiguration.java:48) ~[elastic-job-common-core-2.1.5.jar!/:na]
    ...
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_181]
    ...
    

    google了好久,答案全都是说索引超过了767字节,有让修改数据库配置的(这个确实可以解决问题,但是我们只是后端,还是不劳烦别人了),有让找过大索引和主键的(这个所有表都找了,确实没有)。
    最后同事发现了问题原因所在:
    ElasticJob首次启动时会自动生成两张表:job_execution_log 和 job_status_trace_log,然后在项目启动时,它会自动地给job_status_trace_log表创建索引"TASK_ID_STATE_INDEX",字段包括了表中的task_id和state,但是task_id默认类型为varchar,长度为255,在MySQL中占用了2553 = 765个字节,state类型varchar,长度20占用了203 = 60字节,加起来就超过了767的限制。所以每次启动项目,ElasticJob都回去创建索引,然后创建失败,报错。
    解决办法也很简单,手动创建这个索引,把task_id长度设置为191,即可。

    SQL如下:
    CREATE INDEX TASK_ID_STATE_INDEX ON job_status_trace_log(task_id(191),state);
    

    相关文章

      网友评论

          本文标题:ElasticJob启动时报错:Index column siz

          本文链接:https://www.haomeiwen.com/subject/cnrvbrtx.html