本文介绍进行逻辑增量备份时因大事务超时报 6312 错误的解决方法。
影响版本
OceanBase 数据库 V2.2.50 及以前使用逻辑备份恢复的版本。
问题现象
增量备份因大事物超时,增量备份异常。
检查增量日志,发现错误代码 6312。
可能原因
环境出现大事务以及其他原因的超时时,会导致增量备份卡住,无法正常备份,出现备份断点及空洞的情况。
排查步骤如下。
查看是否存在长事务。
对于 OceanBase 数据库 V1.x 版本,使用以下 SQL 查询。
obclient> SELECT t1.tenant_id,t2.tenant_name,t1.svr_ip,t3.user,t3.db,t1.session_id,t3.info FROM oceanbase.__all_virtual_trans_lock_stat t1 JOIN oceanbase.__all_tenant t2 ON t1.tenant_id=t2.tenant_id JOIN information_schema.processlist t3 on t1.session_id=t3.id;对于 OceanBase 数据库 V2.x 版本,使用以下 SQL 查询。
obclient> SELECT t2.tenant,t1.svr_ip,t2.user,t2.db,t1.session_id,t1.trans_id,t2.info FROM oceanbase.__all_virtual_trans_lock_stat t1 JOIN oceanbase.__all_virtual_processlist t2 on t1.session_id=t2.id;如果查询结果不为空,则说明存在长事务;如果查询结果为空,则需要查看备份恢复情况。
登录 OBServer 所在的服务器,查询 clog 与 ilog 最新的时间。
[admin@hostname ~]$ cd oceanbase/store/ilog [admin@hostname ~]$ ls -al [admin@hostname ~]$ cd ../clog [admin@hostname ~]$ ls -al查询最新的时间,格式如下。
-rw-r--r-- 1 admin admin 67108864 Oct 9 19:41 07查看增量备份的状态是否为运行,checkpoint 位点信息与 clog、ilog 的最新时间是否相同。
obclient> SELECT cluster_name, checkpoint,status,stop_flag from inc_data_backup; +--------------+----------------------------+---------+-----------+ | CLUSTER_NAME | CHECKPOINT | STATUS | STOP_FLAG | +--------------+----------------------------+---------+-----------+ | xxxxxxxxx | 2020-10-09 19:44:06.534108 | RUNNING | 0 | +--------------+----------------------------+---------+-----------+ 1 row in set (0.01 sec)如果 checkpoint 位点信息与 clog、ilog 的最新时间不同,这说明出现了备份空洞。
解决方法
对于长事务未执行完成的情况,您需要结合实际业务,确认事务执行完成后再发起增量备份。
对于存在增量备份空洞的情况,按以下步骤解决。
查看最近一次合并的时间,时间的格式为
YYYY-MM-DD HH:MM:SS.FFFFFF。obclient> SELECT /*+ READ_CONSISTENCY(WEAK),query_timeout(100000000) */ value1 version,value2 zone, date_format(min(gmt_create),'%Y-%m-%d %H:%i:%s.%f') start_time, date_format(max(gmt_create),'%Y-%m-%d %H:%i:%s.%f') finish_time, timestampdiff(MINUTE,min(gmt_create),max(gmt_create)) merge_time_minute,module,event FROM __all_rootservice_event_history WHERE gmt_create < now() AND gmt_create > usec_to_time(time_to_usec(now())-172800000000) AND module IN ('major_freeze','daily_merge') AND event IN ('start_merge','all_partition_merged') GROUP BY value1,value2 ORDER BY start_time;调整增量备份空洞。
暂停增量备份任务,其中
cluster_name为集群名称。obclient> UPDATE inc_data_backup SET stop_flag=1 WHERE cluster_name='<cluster_name>' AND tenant_white_list='*';更新增量备份中 checkpoint 位点到新的时间点,其中
cluster_name为集群名称。obclient> UPDATE inc_data_backup SET checkpoint='YYYY-MM-DD HH:MM:SS.FFFFFF' WHERE cluster_name='<cluster_name>' AND tenant_white_list='*';重新开启增量备份任务,其中
cluster_name为集群名称。obclient> UPDATE inc_data_backup SET stop_flag=0 WHERE cluster_name='<cluster_name>' AND tenant_white_list='*';注意
以上操作的目的是将 OBServer 调整到未释放的时间点。
观察增量备份状态。
如果为
RUNNING则表示增量备份已经恢复。obclient> SELECT cluster_name, checkpoint,status,stop_flag from inc_data_backup;