【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】oceanbase 4.2.4.0
【问题描述】采用 JDBC方式插入数据库,每秒大概20000条,但没到凌晨00点-5点就会有报插入错误,不知道是什么原因?凌晨数据库有合并的操作吗?该怎么优化?
参考下,发下完整的observer.log,另外可使用obdiag分析下日志 obidag analyze log --from xxxx --to xxxx
https://www.oceanbase.com/docs/common-obdiag-cn-1000000001102497
https://www.oceanbase.com/knowledge-base/odc-1000000000262291?back=kb
减少插入速度吧,OB在应对大批量数据插入时是会存在这个问题的,当你数据写入速度大于OB转储速度时可能会存在这个问题,主要解决方案可以参考一下:
1.增加租户内存(空间换时间)
2.降低转储阈值(freeze_trigger_percentage),让数据库转储的速度更快一点
3.降低写入速度
4.增加转储线程数(compaction_high_thread_score),也是让转储更快,尽早释放内存
估计凌晨的时候还有其他写入导致租户的增量内存用尽。配置一下租户的写入限速看看,做到宁可慢点但不要报错。
租户下参数:
show parameters like 'writing_throttling_trigger_percentage';
show parameters like 'freeze_trigger_percentage';
前者调高到 90%,后者调低到 20%。
原理也需要了解一下,可以参考: OB 内存分配概述 (qq.com) 。4.2 原理大致相同。
这两个参数是一样的
当遇到大量写入且数据转储跟不上写入速度的时候就会报这种错误,该问题的紧急应对措施是增加租户内存。如果确实因为业务规模增长导致租户内存不足以支撑业务时,需要根据转储的频度设置合理的租户内存大小。
可根据楼上的建议调整下参数观察下,如果内存很小,需要减小freeze_trigger_percentage,这样设置后会加快转储的次数,释放内存。
另外建议使用obdiag巡检下并发下observer.log以便于进一步分析原因。
freeze_trigger_percentage 设置为20还不行,另外该租户的内存设置是50G,怎么判断租户的内存实际需要多少?参数应该设置多少?
writing_throttling_trigger_percentage 看下是多少 开启下写入限速
系统默认是60,针对该租户已经调整为100