ElasticJob启动时报错:Index column size too large. The maximum column size is 767 bytes|Specified key w...
最近初用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);