lealone / Lealone

比 MySQL 和 MongoDB 快10倍的 OLTP 关系数据库和文档数据库
Other
2.45k stars 516 forks source link

insert执行报错 #182

Closed ContyChen closed 1 year ago

ContyChen commented 1 year ago

使用lealone作为nacos的存储数据库,修改配置时报空指针错误 nacos的执行逻辑是先执行insert,捕获DataIntegrityViolationException异常,再执行update 修改同一条记录,同样的操作,有时连续报错,重试几次后正常 image

codefollower commented 1 year ago

这估计是 LobStorage 的 bug

codefollower commented 1 year ago

我用以下测试代码反复模拟你说的场景,无法重现 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();
        }
ContyChen commented 1 year ago

应该是我用的那个数据库有问题了,新建的数据库测试没有问题,而且我这个数据库里有的表不能查询,也不能删除 image

我把数据库备份出来,您方便的时候给分析一下?

codefollower commented 1 year ago

可以

ContyChen commented 1 year ago

mail to codefollower

codefollower commented 1 year ago

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。

zhoujin7 commented 1 year ago

使用lealone作为nacos的存储数据库,修改配置时报空指针错误 nacos的执行逻辑是先执行insert,捕获DataIntegrityViolationException异常,再执行update 修改同一条记录,同样的操作,有时连续报错,重试几次后正常 image

借这个地方问一下, 老哥你的nacos适配lealone是怎么弄的, 能不能提供一些关键信息 或者sql脚本 @ContyChen