OCP API 调用报错

【 使用环境 】测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
接口链接
发起租户恢复-V4.3.5-文档-分布式数据库使用文档

/api/v2/ob/clusters/1000001/backup/restore

body参数:
{“backupTenantStatus”:“OFFLINE”,
“restoreOfflineTenantRequiredParam”:{
“restoreClusterId”:1741227764,“backupMode”:“PHYSICAL_BACKUP”,“backupClusterName”:“obcluster435arm”,“backupTenantName”:“orac”,
“obBackupStorageBaseInfo”: {“s3AccessKey”: {“accessKeyId”: “uYkYwtyTvZz0U9V5jNxG”,“accessKeySecret”: “mtCTkFLHGt8wep9qfc1i1vbXE1ceDWbf5lMcXoiK”,“endpoint”: “http://10.1.132.250:9000/"},"backupStorageType”: “BACKUP_STORAGE_S3”,“storageUrl”: “lyr/obcluster435arm/1741227765/tenant_incarnation_1/1288”},
“restoreEndTime”: “2020-11-11T00:50:00.215+08:00”,
“restoreTenantInfoParam”:{“name”:“oarcZ”,“zones”:[{“name”:“zone1”,“replicaType”:“FULL”,“resourcePool”:{“unitSpecName”:“S1_unit_config”,“unitCount”:1}}],“primaryZone”:“zone1”}
}
}

报错:
{“duration”:64,“error”:{“message”:“Unhandled exception, type=NullPointerException”},“server”:“20c887d1c3”,“status”:500,“successful”:false,“timestamp”:“2025-12-03T16:32:53.51+08:00”,“traceId”:“44449f8928d3d6e9”}

参数测试了很多次,我感觉应该不是参数的问题。备份的api正常使用。
麻烦看看是不是ocp api接口内部程序的问题。

OCP哪个版本?

再操作一次,发下ocp-server.log

1 个赞

请问 ocp-server.log 从哪获取?

目前版本是:
版本号: 4.3.3-20241216144756
发布日期: 2024年12月16日

oceanbase 的版本为4.3.5

1 个赞

默认在 /home/admin/ocp/log,如果不在这里就全局搜下

find / -name "ocp-server.log"

这边提示新用户无法上传附件。

那你先活跃一下,多回复下帖子之类的,应该很快就可以发了

看起来可以发了

ocp-server.0.out.txt (33.3 MB)

从日志中看,obcluster435arm 集群的连接存在问题:

2025-12-03 17:13:47.691 ERROR 9 — [obsdk-init-thread-1,1e8f57c059cbab39,5a706963f70b0736] c.o.o.o.c.impl.AbstractConnector : [obsdk] init druid datasource failed. connectProperties=ConnectProperties(connectionMode=proxy, address=127.0.0.1, port=2888, obsAddrList=null, username=ocp_monitor, tenantName=sys, clusterName=obcluster435arm, obClusterId=1741227765, proxy=null, odpSocketConfig=OdpSocketConfig(obproxyConfigServerUrl=http://10.1.79.220:8080/services?Action=GetObProxyConfig&User_ID=admin&UID=alibaba, automaticMatchWorkThread=false, workThreadNum=8, proxyMemLimited=1G, enableStrictKernelRelease=false, logDirSizeThreshold=1G, syslogLevel=INFO, enableMetaUsed=false, routeDiagnosisLevel=0), vpcId=1, compatibilityMode=MYSQL, database=oceanbase), error message:Could not connect to 127.0.0.1:2888 : Could not connect to 127.0.0.1:0 : ObproxyVCSocket(cs_id:-1, fd:140295179932224) native read function failed

这个集群连接正常吗?

{
  "backupTenantStatus": "OFFLINE",
  "restoreOfflineTenantRequiredParam": {
    "backupMode": "PHYSICAL_BACKUP",
    "backupClusterName": "obcluster435arm",
    "backupObClusterId": null,  ← **关键问题:为null**
    "backupTenantName": "orac",
    "backupObTenantId": null,    ← **关键问题:为null**
    "restoreClusterId": 1000001,
    "obBackupStorageBaseInfo": {
      "backupStorageType": "BACKUP_STORAGE_S3",
      "storageUrl": "lyr/obcluster435arm/1741227765/tenant_incarnation_1/1288",
      "s3AccessKey": {
        "region": null,
        "endpoint": "http://10.1.132.250:9000/",
        "accessKeyId": "uYkYwtyTvZz0U9V5jNxG"
      }
    },
    "restoreEndTime": "2020-11-10T16:50:00.215Z",  ← **可疑:2020年的时间**
    "restoreTenantInfoParam": {
      "name": "oarcZ",
      "primaryZone": "zone1",
      "zones": [{
        "name": "zone1",
        "replicaType": "FULL",
        "resourcePool": {
          "unitSpecName": "S1_unit_config",
          "unitCount": 1
        }
      }]
    },
    "storageId": null,
    "addSource": false
  }
}
  1. backupObClusterId=null:备份集群的OB集群ID为空
  2. backupObTenantId=null:备份租户的OB租户ID为空

由于ID为null,导致空指针异常,可能原因:
后端可能尝试根据 backupClusterName=obcluster435arm 查询对应的 backupObClusterIdbackupObTenantId,但查询失败或集群不存在,导致ID为null, 从日志中可以看到,obcluster435arm 集群的连接存在问题

接口文档上面标注为:
参数 类型 必选 说明
backupObClusterId Long 否 备份集群 OceanBase 侧 ID。
backupObTenantId Long 否 备份租户 OceanBase 侧 ID。

按我的理解是可以不用填的。 obcluster435arm确实存在问题,已经故障了,所以我现在将其中备份的一个租户恢复到另一个集群。 作为离线恢复,不应该再去找原来的备份集群获取信息吧。

我选择的状态是: “backupTenantStatus”: “OFFLINE”,

应该跟恢复时间无关,我改过很多次,这是其中一版copy文档的。其他尝试是填的合理的。

看报错,离线恢复场景下代码仍然尝试使用 backupObClusterIdbackupObTenantId,直接使用这些ID来获取备份连接信息,即使它们是null,我联系研发看下

BackupStorageConnectManager$PhysicalBackupStorageInfoGetter.getBackupConnectInfo(BackupStorageConnectManager.java:89)

研发反馈 集群离线要传入一个可以解析这个备份集的主机,也就是hostIdList这个参数,backupObClusterId,backupObTenantId 这两个不传,传一下hostIdList 试一下呢?

例如

{
	"backupTenantStatus": "OFFLINE",
	"restoreOfflineTenantRequiredParam": {
		"obBackupStorageBaseInfo": {
			"backupStorageType": "BACKUP_STORAGE_FILE",
			"storageUrl": "/obbackup/"
		},
		"hostIdForParse": 3,
		"restoreEndTime": "2025-12-04T16:00:00.000000+08:00",
		"restoreClusterId": 2,
		"restoreTenantInfoParam": {
			"name": "test",
			"zones": [{
				"key": "39",
				"checked": true,
				"name": "zone1",
				"replicaType": "FULL",
				"resourcePool": {
					"unitSpecName": "S5",
					"unitCount": 1
				}
			}]
		},
		"backupMode": "PHYSICAL_BACKUP",
		"backupObClusterId": 1704259811,
		"backupClusterName": "ob_3245",
		"backupTenantName": "mysql",
		"backupObTenantId": 1001,
		"hostIdList": [3]
	}
}

学习学习

目前有两个问题
一、
可以解析这个备份集的主机是哪种主机,是意味着原本这个集群的三个节点所在的主机吗? 但是现在这三个主机都故障无法登录,就不能进行离线恢复了吗? 而且这个必填项并没有体现在文档里。API的文档感觉很不全,远没有obclient黑屏的文档全面,是否考虑更新一下。

二、
请问下我这边主机页面没有找到 “主机id”. 咋去找呢。

一、可以解析这个备份集的主机是 只要是能访问到这个备份介质s3 的当前在线的主机id,当然需要有权限访问备份集所在的bucket,不要求原集群所在的主机

二、如何找“主机ID”,点开这个“+”

三、文档问题会反馈优化

麻烦再看看报错:
2025-12-05 14:23:43.492 INFO 9 — [http-nio-0.0.0.0-8080-exec-2,7deefdd7858c946e,400e0037ed29248c] c.o.ocp.service.audit.AuditEventService : begin create audit event, param:CreateAuditEventParam(operationEvent=START_CLUSTER_RESTORE_TENANT, eventType=BACKUP_RESTORE, method Signature=com.oceanbase.ocp.server.common.controller.ObClusterBackupController.startRestoreTenant, resourceType=OB_TENANT, resources=[CreateAuditEventParam.AuditResourceParam(resourceId=null, resourceName=oarcZ, parentResource=null)], operatorId=100, operatorName=admin, stat us=FAILED, failedReason={“errorCode”:“BAK41001”,“errorMessage”:“解析备份文件异常,内容为null”}, taskId=null, eventInfo={“param”:{“backupTenantStatus”:“OFFLINE”,“restoreOfflineTenantRequiredParam”:{“addSource”:false,“backupClusterName”:“obcluster435arm”,“backupMode”:“PHYSICAL _BACKUP”,“backupTenantName”:“orac”,“hostIdList”:[1000005,1000003],“obBackupStorageBaseInfo”:{“backupStorageType”:“BACKUP_STORAGE_S3”,“s3AccessKey”:{“accessKeyId”:“uYkYwtyTvZz0U9V5jNxG”,“accessKeySecret”:"******",“endpoint”:“http://10.1.132.250:9000/"},“storageUrl”:“lyr/”},"r estoreClusterId”:1000001,“restoreEndTime”:“2025-12-01T08:43:00.215Z”,“restoreTenantInfoParam”:{“name”:“oarcZ”,“primaryZone”:“zone1”,“zones”:[{“name”:“zone1”,“replicaType”:“FULL”,“resourcePool”:{“unitCount”:1,“unitSpecName”:“S1_unit_config”}}]}}},“id”:1000001}, executionType= NEW, requestUrl=http://10.1.79.220:8080/api/v2/ob/clusters/1000001/backup/restore, clientIp=10.8.0.19, serverIp=10.1.79.220, startTime=2025-12-05T14:23:40.910+08:00, endTime=2025-12-05T14:23:43.492+08:00, role=null, aliUid=null)

路径参数:lyr/ 和 lyr/obcluster435arm/1741227765/tenant_incarnation_1/1288 都试过。

存储介质:

测了很多遍,不知道又是哪个参数出问题了。主机是可以访问s3的。

发下完整的ocp-server.log吧,这个文件压缩发下,应该还有其它报错信息