本文介绍进行逻辑增量备份时因大事务超时报 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;