删除大量数据时 log 满的问题

我们的系统用的是 ASE 15.5。在做 delete 等操作时,都会自动生成 log。我们的问题就是应用程序想在一个表中删除很大量的数据时会失败,提示 log 空间不够,于是事务回滚,没有删除任何数据。

我们尝试过使用 set rowcount 100,使得每次删除操作之删除 100 行,然后循环地去调用它,直到数据清空为止。当时也是失败了。

比如数据库原来有 10000 行数据,一次性删除需要 10 MB log 空间,而我们只配了 5 MB。未改动前一行数据也无法删除;用了上诉方法倒是能删除前面 5000 条数据,不过 log 依然会被塞满。

网上找了些相关资料,都说用 dump tran 来清空 log。但是执行这句指令需要 sa_role 或 oper_role,在 production environment 我们显然没有这样的权限。另外有人说开启 trunc log on chkpt 这个选项,这个也不合适,它会每分钟自动清空日志,产品线上并不推荐这么做。而且应用程序执行删除操作肯定小于一分钟,所以即使真的开启也无济于事。

现在看起来,只能通过增大 log 空间来解决。不过我感觉这不是长久之计,因为我们也无法估计到底需要多少日志空间。我们要对产品线上做修改需要美国那边做一堆 Approval,相当麻烦。如果我们这次说增大 100MB,结果发现又不行,然后又要好几天 Approval。

请问大家对这样的问题有没有什么想法?有什么方便的解决方案吗?

作者: redraiment   发布时间: 2011-05-10

sybase以及其它rdbms都是先记录日志再改数据。必须保证影响数据的日志先写完才能真正去改数据内容。

你们的数据库的日志小到不能容纳一次delete操作的日志内容。这的确是个麻烦事。

既然你要删除大量的数据, 能否:将被删除表中的不需要删除的数据拷贝到一张临时表中,truncate表后再从临时表导回数据。

作者: andkylee   发布时间: 2011-05-11

回复 andkylee

谢谢你的回复!不过这个办法应该不行,且不说 truncate table 也有权限问题。我们要删除的数据对于那个 Table 来说也只是冰山一角,既然 delete 这点东西都不成功,更何况要 insert 更大量的数据。

作者: redraiment   发布时间: 2011-05-11