cssxsh / mirai-hibernate-plugin

Mirai Console Hibernate/ORM 数据库前置插件
GNU Affero General Public License v3.0
31 stars 1 forks source link

一个比较奇特的问题 #18

Closed Initial-heart-1 closed 1 year ago

Initial-heart-1 commented 1 year ago

我不确定这是不是 Bug...... 使用 MySQL 8,当出现 GroupRecall 事件时插件会产生报错如下:

2023-07-25 00:3*:* W/stderr: ERROR SqlExceptionHelper Data truncation: Data too long for column 'recall' at row 1
2023-07-25 00:3*:* W/mirai-hibernate-plugin: SQLException in Recorder
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'recall' at row 1
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3637)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3501)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3936)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:164)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:612)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:483)
    at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:480)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:329)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1425)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:477)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2234)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:1930)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:439)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.SessionFactory.lambda$fromTransaction$1(SessionFactory.java:221)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.SessionFactory.fromSession(SessionFactory.java:197)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar[shared]//org.hibernate.SessionFactory.fromTransaction(SessionFactory.java:206)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar//xyz.cssxsh.mirai.hibernate.MiraiHibernateRecorder.merge(MiraiHibernateRecorder.kt:30)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar//xyz.cssxsh.mirai.hibernate.MiraiHibernateRecorder.access$merge(MiraiHibernateRecorder.kt:28)
    at mirai-hibernate-plugin-2.7.1.mirai2.jar//xyz.cssxsh.mirai.hibernate.MiraiHibernateRecorder$record$4.invokeSuspend(MiraiHibernateRecorder.kt:86)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

依照报错检查数据表,发现 message_record 表中 recall 字段数据类型被定义为 bit(1),即 1 位 ASCII 0 or 1。 这个表从 2.5.0 或更早版本就在使用。不确定这是否是用户问题,因为我没有手动对表结构进行任何调整。 kt 水平太差,故没有阅码就直接提起此 issue。

Initial-heart-1 commented 1 year ago

这个问题核实是会影响使用,对该错误时间戳及其±1s内的记录尝试检索,该错误时间戳无数据,±1s内没有找到 mirai log 所示消息数据,所以跑来开 issue。

cssxsh commented 1 year ago

recall 的定义是有变动的

你可以参考这个修改表内容

UPDATE `message_record` SET
    recall = 1
WHERE ids = null or ids = '';

UPDATE `message_record` SET
    recall = 2
WHERE recall = target_id;

UPDATE `message_record` SET
    recall = 3
WHERE recall > 12345;

ALTER TABLE `message_record`
CHANGE COLUMN `recall` `recall` TINYINT(4) NOT NULL DEFAULT 0 AFTER `kind`;
Initial-heart-1 commented 1 year ago

OK, 感谢佬解答, 甚至给出了 SQL 参考(汗)