Closed ContyChen closed 1 year ago
这估计是 LobStorage 的 bug
我用以下测试代码反复模拟你说的场景,无法重现 bug。 你看看能不能单独写个测试代码重现你说的场景,然后发出来我再调试一下找找原因。
Connection conn = getConnection();
Statement stmt = conn.createStatement();
// stmt.executeUpdate("DROP TABLE IF EXISTS JdbcBlobTest");
stmt.executeUpdate(
"CREATE TABLE IF NOT EXISTS JdbcBlobTest (f1 int primary key, f2 long, f3 blob)");
JdbcBlob blob = (JdbcBlob) conn.createBlob();
String blobStr = "blob-test";
StringBuilder buff = new StringBuilder(1000 * blobStr.length());
for (int i = 0; i < 1000; i++)
buff.append(blobStr);
blobStr = buff.toString();
// 从1开始
blob.setBytes(1, blobStr.getBytes());
PreparedStatement ps = conn
.prepareStatement("INSERT INTO JdbcBlobTest(f1, f2, f3) VALUES(1, 2, ?)");
ps.setBlob(1, blob);
try {
ps.executeUpdate();
} catch (Exception e) {
ps = conn.prepareStatement("UPDATE JdbcBlobTest set f3=? WHERE f1 = 1");
ps.setBlob(1, blob);
ps.executeUpdate();
}
应该是我用的那个数据库有问题了,新建的数据库测试没有问题,而且我这个数据库里有的表不能查询,也不能删除
我把数据库备份出来,您方便的时候给分析一下?
可以
mail to codefollower
mysql 的 text 类型在 lealone 中都对应 clob 类型, clob 类型的字段不会存在原始表中,而是放在一个统一的 Lob Storage 里面, Lob Storage 由 lobData、lobMap、lobRef 组成,把 clob 字段切成一块块放到里面。 我调试了一下,是 lobRef 出问题了,估计是对 lobRef 自动做 Compact 和 Save 时数据出错了,root node page 的子 page 的位置指向了一个错误的 chunk。
这个问题得好好排查一下,有点复杂,db_5\lobRef\c_1_356 这个就是 chunk 文件,356 代表 lobRef 的数据保存过 356 次了,中间的数字 1 代表 chunk id,执行 Compact 后 chunk id 会重复使用,出错的是 c_13_268。
使用lealone作为nacos的存储数据库,修改配置时报空指针错误 nacos的执行逻辑是先执行insert,捕获DataIntegrityViolationException异常,再执行update 修改同一条记录,同样的操作,有时连续报错,重试几次后正常
借这个地方问一下, 老哥你的nacos适配lealone是怎么弄的, 能不能提供一些关键信息 或者sql脚本 @ContyChen
使用lealone作为nacos的存储数据库,修改配置时报空指针错误 nacos的执行逻辑是先执行insert,捕获DataIntegrityViolationException异常,再执行update 修改同一条记录,同样的操作,有时连续报错,重试几次后正常