使用delete 删除表中大概一千万的数据时报 transcation is killed

【 使用环境 】 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】delete from tif_vouchinfo b where exists (select 1 from tif_transinfo a where a.vc_acct_wm = ‘XXX’ and b.l_date >=a.l_bus_date) 删除大概一千万的数据 报 transcation is killed
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

1 个赞

@论坛小助手

在尝试通过 DELETE 语句删除大量数据时遇到 transcation is killed 错误,这通常是因为事务超时或资源不足导致的。对于 OceanBase 数据库来说,一次删除一千万条记录的事务非常大,可能超过系统默认的事务大小限制。为了避免此类错误,建议您采取以下措施:

  1. 分批删除:通过 WHERE 子句分批次删除数据,而不是一次性删除所有数据。
  2. 使用 TRUNCATE TABLE:如果不需要记录删除操作的日志,可以考虑使用 TRUNCATE TABLE 语句来快速清空表。
  3. 调整事务超时时间:如果确实需要一次性删除大量数据,可以考虑调整事务超时时间,但这需要谨慎操作,避免影响其他业务。

示例分批删除语句:

obclient [test]> DELETE FROM tif_vouchinfo WHERE EXISTS (SELECT 1 FROM tif_transinfo a WHERE a.vc_acct_wm = 'XXX' AND b.l_date >= a.l_bus_date) LIMIT 10000;

重复执行上述语句,直到没有更多记录被删除。

如果您需要进一步的帮助,建议收集诊断信息并联系技术支持。

具体信息可参考以下文档:

  1. 使用 MySQL 租户做常见数据库开发
  2. 删除数据

调整一下ob_trx_timeout试试