在之前的文档《故障诊断 Oceanbase “ORA-00600: internal error code, arguments: -4013, No memory or reach tenant memory limit” 特烦恼》记录过一个Oceanbase V3时的内存异常增加限制的案例,我们知道Oceanbase V4对一些View相比V3做了重构,这里记录几个V4中常用的SQL和案例。
1, 分析内存 列每个租户的TOP MEMUSED
# sys 租户
obclient(root@sys)[oceanbase]> select mem.*,tenant_name,tenant_type,STATUS,TENANT_ROLE
from (select * from (SELECT tenant_id,svr_ip,svr_port,ctx_name,mod_name,format(hold,0),used, row_number() over(partition by tenant_id,svr_ip order by used desc) rn FROM v$ob_memory) where rn<=10) mem,dba_ob_tenants ots
where mem.tenant_id=ots.tenant_id;
+-----------+---------------+----------+-------------------+-----------------+----------------+-----------+------+-------------+-------------+--------+-------------+
| tenant_id | svr_ip | svr_port | ctx_name | mod_name | format(hold,0) | used | rn | tenant_name | tenant_type | STATUS | TENANT_ROLE |
+-----------+---------------+----------+-------------------+-----------------+----------------+-----------+------+-------------+-------------+--------+-------------+
| 1 | 172.20.22.215 | 2882 | PLAN_CACHE_CTX_ID | SqlPhyPlan | 314,406,784 | 280744162 | 1 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | MEMSTORE_CTX_ID | Memstore | 278,822,912 | 278695344 | 2 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MysqlRequesReco | 146,243,584 | 146019200 | 3 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | CO_STACK | CoStack | 129,540,096 | 129299136 | 4 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | CACHE_MAP_NODE | 54,099,968 | 54073344 | 5 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | LogGroupBuffer | 41,963,520 | 41943040 | 6 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | ASHListBuffer | 31,477,760 | 31458304 | 7 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | SqlPlanMon | 31,580,160 | 29766912 | 8 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MinorMergeMgr | 32,366,592 | 28770304 | 9 | sys | SYS | NORMAL | PRIMARY |
| 1 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | ServerObjecPool | 22,532,096 | 22462464 | 10 | sys | SYS | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | CO_STACK | CoStack | 91,865,088 | 91694208 | 1 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | MEMSTORE_CTX_ID | Memstore | 54,099,968 | 54075216 | 2 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | LogGroupBuffer | 41,963,520 | 41943040 | 3 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | PLAN_CACHE_CTX_ID | SqlPhyPlan | 32,723,008 | 29733121 | 4 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MysqlRequesReco | 20,324,352 | 20177472 | 5 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | OmtTenant | 15,005,440 | 14876065 | 6 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | CACHE_MAP_NODE | 14,565,376 | 14558208 | 7 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MinorMergeMgr | 15,851,520 | 14090240 | 8 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | FreeTbltStream | 8,777,728 | 8760064 | 9 | META$1034 | META | NORMAL | PRIMARY |
| 1033 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | SqlDtlBuf | 9,510,912 | 8523159 | 10 | META$1034 | META | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | LogGroupBuffer | 167,854,080 | 167772160 | 1 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | CO_STACK | CoStack | 105,799,680 | 105602880 | 2 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MysqlRequesReco | 102,547,456 | 102344576 | 3 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | PLAN_CACHE_CTX_ID | SqlPhyPlan | 92,865,024 | 82623912 | 4 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | TX_DATA_TABLE | MEMTABLE_ARENA | 55,709,440 | 55606528 | 5 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | MEMSTORE_CTX_ID | Memstore | 47,857,664 | 47835768 | 6 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | CACHE_MAP_NODE | 31,211,520 | 31196160 | 7 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MinorMergeMgr | 20,201,472 | 17956864 | 8 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | SqlDtlBuf | 18,874,368 | 16914176 | 9 | orcldb | USER | NORMAL | PRIMARY |
| 1034 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | OmtTenant | 15,005,440 | 14876065 | 10 | orcldb | USER | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | CO_STACK | CoStack | 95,477,760 | 95300160 | 1 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | MEMSTORE_CTX_ID | Memstore | 56,180,736 | 56155032 | 2 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | LogGroupBuffer | 41,963,520 | 41943040 | 3 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | PLAN_CACHE_CTX_ID | SqlPhyPlan | 38,865,664 | 35504847 | 4 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MysqlRequesReco | 24,485,888 | 24336960 | 5 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | OmtTenant | 15,005,440 | 14876065 | 6 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | CACHE_MAP_NODE | 14,565,376 | 14558208 | 7 | META$1038 | META | NORMAL | PRIMARY |
| 1037 | 172.20.22.215 | 2882 | DEFAULT_CTX_ID | MinorMergeMgr | 15,335,424 | 13631488 | 8 | META$1038 | META | NORMAL | PRIMARY |
...
2, 分清租户
报错里一般会提示租户信息,如果是在业务租户中的DML SQL或query通常是在业务租户呢,但是如果是DDL或BACKUP系统操作,可能是SYS租户或业务对应的 meta租户。
登录系统租户,查询
DBA_OB_TENANTS视图即可查看所有的租户。TENANT_TYPE表示租户类型:SYS为系统租户,META为 Meta 租户,USER为用户租户。租户 ID 为 1 的是系统租户。租户 ID 大于 1000 的租户中,偶数的是用户租户,奇数的是 Meta 租户,并且用户租户的租户 ID 比其对应 Meta 租户大 1。

3, 日志分析
oceanbase的日志较多,对于这个报错的查询关键字,如1002是租户ID
grep ‘malloc_allocator.*tenant: 1002’ observer.log*
4, 如果是SQL执行报错
查询相关的SQL运行时信息,如案例2,gv$ob_sql_audit中SQL执行耗时GET_PLAN_TIME的值较大,接近ELAPSED_TIME的时间,REQUEST_MEMORY_USED的内存值达到了90G。
select * from gv$ob_sql_audit
5, 如果是META 租户
登录META租户查询
select a.zone, a.SVR_IP,a.SVR_PORT, b.status,cpu_capacity,cpu_assigned_max,cpu_capacity-cpu_assigned_max as cpu_free,round(memory_limit /1024/1024/1024 ,2) as memory_total_gb,round((memory_limit-mem_capacity) /1024/1024/1024 ,2) as system_memory_gb,round(mem_assigned /1024/1024/1024 ,2) as mem_assigned_gb,round((mem_capacity-mem_assigned) /1024/1024/1024 ,2) as memory_free_gb,round(log_disk_capacity /1024/1024/1024 ,2) as log_disk_capacity_gb,round(log_disk_assigned /1024/1024/1024 ,2) as log_disk_assigned_gb,round((log_disk_capacity-log_disk_assigned) /1024/1024/1024 ,2) as log_disk_free_gb,round((data_disk_capacity /1024/1024/1024 ),2) as data_disk_gb,round((data_disk_in_use /1024/1024/1024 ),2) as data_disk_used_gb,round((data_disk_capacity-data_disk_in_use) /1024/1024/1024 ,2) as data_disk_free_gb from gv$ob_servers a join oceanbase.DBA_OB_SERVERS b on a.zone=b.zone\G;
已知问题
- 1, SQL中有大量的in list
现象: SqlExecutor优化器模块占用内存大
原因: 内核bug
当前规避方式: 将in 优化关闭: alter system set _enable_in_range_optimization = 0;
风险:有些大in的场景可能会内存开销增加。
2. insert all into values 内存膨胀
现象: OBServer日志内存信息如下,DEFAULT_CTX_ID的内存占用高达近200G。
insert all into values 类型 SQL 后跟大量多行数据时,在硬解析时,内存膨胀,另外行数不固定,可能导致不能命中 plan_cache,出现并发硬解析时,同时占用内存就很大,导致租户内存被挤占。
规避方案
- 改写为insert into values 多行,控制500-1000条提交一次,避免一次插入条数调大。
影响版本
数据库版本:OceanBase 4.2.1.10
3, 备份失败或DDL失败
现象: DDL挂起,备份挂起, 《案例 Oceanbase备份失败 status一直处理”PENDING”》
原因:SYS租户配置的资源过低
规避方案: 增加SYS租户的配置,建议32G以上。
持续更新…