问题现象
备租户在切换为主租户后,出现了无法回滚原主租户上未提交的事务的情况,这些事务的行锁无法释放,后续 DDL、DML 语句因为无法获取行锁而卡住。
关键诊断信息
触发条件
备租户切为主租户。
事前巡检
无 。
事后诊断
发现由原主库创建的事务长时间无法结束,并且日志中能查询到 transaction rpc error(rcode={code:-5150。
示例如下:
observer.log.20231201225442067:[2023-12-01 22:53:50.384670] WDIAG [STORAGE.TRANS] process (ob_trans_rpc.h:261) [146903][pnio1][T1004][xxxxx-xxxxx-xxxxx-xxxxx] [lt=45][errcode=0] transaction rpc error(rcode={code:-5150, msg:"", warnings:[]}, sender_ls_id={id:1}, receiver_ls_id={id:9223372036854775807}, trans_id={txid:386357}, dst="xxx.xxx.xxx.xxx:xxxx", msg_type=61)
问题原因
内核 BUG:备库切为主库后,需要回滚原主库上未提交的事务,目前是通过和事务的协调者通信来回滚事务,但备库上恢复出来的事务上下文中记录的是原主库的事务协调者信息,该协调者的 OBServer 上可能没有备库租户的资源,因此会返回 OB_TENANT_NOT_IN_SERVER(5150) 的错误码,目前没有对该错误码进行处理,因此备库始终无法回滚事务。
问题的风险及影响
事务无法结束,长期占有行锁,可能导致系统卡住,无法执行语句。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户,对于 MySQL 租户无影响。
影响的版本
OceanBase 数据库企业版 V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 BP2(oceanbase-4.2.1.2-102010012023120119)及之后版本。
解决方法及规避方式
解决方法:
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.1 BP3(oceanbase-4.2.1.3-103000052023122809)及之后版本。
目前安全的解决方法是等待事务超时。
规避方式:
只有原备库能够联系上原主库的
scheduler,但该scheduler上又没有原备库租户的资源时才会出现无法回滚事务的问题,因此可以避免将主备租户配置在一个集群中,使得原备库无法联系原主库的scheduler机器。