逻辑增量备份因大事务超时,错误代码 6312怎样处理?

本文介绍进行逻辑增量备份时因大事务超时报 6312 错误的解决方法。

影响版本

OceanBase 数据库 V2.2.50 及以前使用逻辑备份恢复的版本。

问题现象

增量备份因大事物超时,增量备份异常。

检查增量日志,发现错误代码 6312。

可能原因

环境出现大事务以及其他原因的超时时,会导致增量备份卡住,无法正常备份,出现备份断点及空洞的情况。

排查步骤如下:

  1. 查看是否存在长事务:
  2. 对于 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;

  1. 对于 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;

  1. 如果查询结果不为空,则说明存在长事务;如果查询结果为空,则需要查看备份恢复情况。
  2. 登录 OBServer 所在的服务器,查询 clog 与 ilog 最新的时间。

[admin@hostname ~]$ cd oceanbase/store/ilog [admin@hostname ~]$ ls -al [admin@hostname ~]$ cd …/clog [admin@hostname ~]$ ls -al

  1. 查询最新的时间,格式如下:

-rw-r–r-- 1 admin admin 67108864 Oct 9 19:41 07

  1. 查看增量备份的状态是否为运行,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)

  1. 如果 checkpoint 位点信息与 clog、ilog 的最新时间不同,这说明出现了备份空洞。

解决方法

  • 对于长事务未执行完成的情况,您需要结合实际业务,确认事务执行完成后再发起增量备份。
  • 对于存在增量备份空洞的情况,按以下步骤解决。
  1. 查看最近一次合并的时间,时间的格式为

    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;

  1. 调整增量备份空洞。

  2. 暂停增量备份任务,其中

    cluster_name

    为集群名称。

obclient> UPDATE inc_data_backup SET stop_flag=1 WHERE cluster_name=’<cluster_name>’ AND tenant_white_list=’*’;

  1. 更新增量备份中 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=’*’;

  1. 重新开启增量备份任务,其中

    cluster_name

    为集群名称。

obclient> UPDATE inc_data_backup SET stop_flag=0 WHERE cluster_name=’<cluster_name>’ AND tenant_white_list=’*’;

  1. 说明以上操作的目的是将 OBServer 调整到未释放的时间点。

  2. 观察增量备份状态。

  3. 如果为

    RUNNING

    则表示增量备份已经恢复。

obclient> SELECT cluster_name, checkpoint,status,stop_flag from inc_data_backup;