首批通过分布式安全可靠测评,为关键业务系统打造
物理恢复失败报错 can not find table key from meta(ret=-4016
更新时间:2026-07-31 09:11
问题现象
恢复任务出现 -4016 错误,同时查看日志出现 can not find table key from meta(ret=-4016 报错信息。
observer.log.20240124123133556:[2024-01-24 12:31:32.188738] WDIAG [STORAGE] inner_init_ (ob_storage_restore_struct.cpp:533) [202143][T2366_TABLET_RE][T2366][YFA30BA2DA6A-00060FA0736E816F-0-0] [lt=33][errcode=-4016] can not find table key from meta(ret=-4016, table_key={tablet_id:{id:246243}, column_group_idx:0, table_type:"MAJOR", scn_range:{start_scn:{val:0, v:0}, end_scn:{val:1705990711226767984, v:0}}})
关键诊断信息
触发条件
问题触发条件比较复杂,需要有备份与 transfer,合并,IO 错误等场景同时并发,导致备份做索引合并的时候使用的 sstable meta 和 sec sstable meta 版本不匹配,导致恢复的时候找不到一致的 sstable meta 导致报错 -4016。
事前巡检
检查是否开启了 enable_transfer 或者检查是否开启了自适应合并 _enable_adaptive_compaction。
事后诊断
在合并、transfer 和备份相互独立的情况下可能会出现问题。可以查询 __all_virtual_backup_skipped_tablet_history,检查是否存在 skipped_type='TRANSFER' 的 tablet 以及备份是否发生过 retry。如果存在这样的记录,则有可能触发之前提到的问题。
MySQL [oceanbase]> SELECT A.task_id
FROM __all_virtual_backup_skipped_tablet_history A
INNER JOIN __all_virtual_backup_ls_task_info_history B ON A.task_id = B.task_id
WHERE A.skipped_type = 'TRANSFER' AND B.retry_id <> 0;
输出结果如下:
+---------+
| task_id |
+---------+
| 1 |
+---------+
1 row in set (0.01 sec)
问题原因
备份、transfer、合并和外部存储介质的 I/O 出现错误这四种情况同时发生,导致备份索引文件上备份记录的 SSTable Meta 版本与 SEC SSTable Meta 版本对应的 SSTable 不是相同版本,从而导致错误。
问题的风险及影响
物理恢复失败,报错-4016。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库企业版 V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.1 BP4(oceanbase-4.2.1.4-104000062024022914)及之后版本。
使用其他正常的备份集进行恢复。
规避方法
该问题发生在备份期间,需要同时进行 transfer、medium compaction 和备份,并且可能会遇到一些可重试错误(例如写入 OSS 失败)。只要其中任何一种因素不发生,这个问题就不会出现。因此以下给出两种在线上规避这个问题的方法。
降低备份和 transfer 并发的概率。
在备份期间可以考虑关闭 Transfer。
obclient> alter system set enable_transfer = false tenant = xxx;降低备份与 medium/major compaction 同时发生的机率。
降低备份与合并同时发生的机率。假若问题暂未出现,可首先在租户级别
_enable_adaptive_compaction配置,并确保数据合并完成后再进行备份,以确保该操作不会相互影响。obclient> alter system set _enable_adaptive_compaction = false tenant = xxx;