问题现象
OceanBase 数据库 V4.x 版本挂载对象存储路径,报错 -4103 导致报错失败。
关键日志信息(其中对象存储侧可以获取 RS 日志中返回的 aos_ret->error_msg=NULL, aos_ret->req_id=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx,进行排查)。
[2024-07-26 18:22:51.187960] WDIAG get_oss_file_meta (ob_storage_oss_base.cpp:625) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx] [lt=15][errcode=0] fail to head object(bucket_ob_string=ob6a-backup, object_ob_string=6aarchive/check_file, ret=0)
[2024-07-26 18:22:51.187977] WDIAG print_oss_info (ob_storage_oss_base.cpp:673) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=15][errcode=0] oss info (aos_ret->code=404, aos_ret->error_code=UnknownError, aos_ret->error_msg=NULL, aos_ret->req_id=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx, delay_time=, oss_account_.oss_domain_=http://xxxx.xxxx.com.cn:8060, oss_endpoint_=http://xxxx.xxxx.com.cn:8060, oss_account_.oss_id_=xxxxxx)
[2024-07-26 18:22:51.246803] INFO mk_parent_dir (ob_backup_io_adapter.cpp:246) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=15] found parent dir(i=38, path="oss://ob6a-backup/6aarchive/check_file")
[2024-07-26 18:22:51.250484] WDIAG write (ob_storage_oss_base.cpp:2288) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=16][errcode=-4103] fail to upload one object(bucket_=ob6a-backup, object_=6aarchive/check_file/1002_connect_file_20240726T182251.obbak, ret=-4103)
[2024-07-26 18:22:51.250504] ERROR issue_dba_error (ob_log.cpp:1875) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=17][errcode=-4388] Unexpected internal error happen, please checkout the internal errcode(errcode=-4103, file="ob_storage_oss_base.cpp", line_no=669, info="oss info ")
[2024-07-26 18:22:51.250564] EDIAG print_oss_info (ob_storage_oss_base.cpp:669) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=58][errcode=-4103] oss info (aos_ret->code=400, aos_ret->error_code=InvalidDigest, aos_ret->error_msg=NULL, aos_ret->req_id=xxxxx-xxxxx-xxxxx-xxxxx-xxxxx, delay_time=, oss_account_.oss_domain_=http://xxxx.xxxx.com.cn:8060, oss_endpoint_=http://xxxx.xxxx.com.cn:8060, oss_account_.oss_id_=xxxxxx) BACKTRACE:0x13523f5c 0x582be45 0x58fb20b 0x58fad6f 0x7bffd9c 0x593754d 0x12fb0e72 0x12fbb306 0x12f8547e 0x12fe0728 0x11bf4de2 0x11cb27d6 0x11be0d50 0x11cb4c03 0x11d1134d 0x11d0985c 0x9570251 0xae196c9 0x5960cf5 0x548628c 0x546b0b4 0xa715284 0x137ddb00 0x7f82b9b0ff2b 0x7f82b9a476bf
[2024-07-26 18:22:51.250678] WDIAG [STORAGE] write (ob_storage.cpp:1822) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=113][errcode=-4103] failed to write(ret=-4103)
[2024-07-26 18:22:51.250685] WDIAG write (ob_object_device.cpp:699) [25514][T1_L0_G0][T1][xxxxx-xxxxx-xxxxx-xxxxx]] [lt=7][errcode=-4103] fail to do overwrite write!(ret=-4103)
关键诊断信息
触发条件
用户自建对象存储不支持 MD5 或不符合 MD5 标准,无法进行日志归档和数据备份。
事前巡检
可以先通过 ob_admin 来测试是否能够正常读写,具体用法参见:test_io_device。
事后诊断
如果设置备份目的端时报错 -4103,或者日志里有 content md5 length is incorrect,则触发了该问题。
问题原因
OceanBase 数据库 V4.x 版本的 OBServer 备份文件,在上传至对象存储时会带 MD5 验证,若对象存储不支持 MD5 验证则会报错 -4103。
说明
上传涉及的对象存储接口:
- oss_do_upload_part_from_buffer
- oss_append_object_from_buffer
- oss_put_object_from_buffer
上传涉及的 S3 接口:
- PutObject
- UploadPart
问题的风险及影响
无法进行日志归档和数据备份。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库 V4.2.1 BP7(oceanbase-4.2.1.7-107000112024052920)及之后版本、V4.2.3(oceanbase-4.2.3.0-100000052024041220)及之后版本、V4.3.0(oceanbase-4.3.0.0-100000072024020200)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.1 BP10(oceanbase-4.2.1.10-110000072024111216)及之后版本、V4.2.5(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.3 GA(oceanbase-4.3.3.0-100000362024093001)及之后版本。
规避方式
对于当前版本的 OBServer,在第一次进行归档/备份/恢复之前先使用 ob_admin 测试能否正常读写备份介质,见本文 事前巡检 这一小节。
如果当前版本的备份恢复是正常的,建议不要升级到有问题的版本(V4.2.1 BP7 ~ BP9,V4.2.3 ~ V4.2.4,V4.3.0 ~ V4.3.2)。
如果无法通过测试,并确定是 MD5 的兼容性问题,则升级到指定版本,然后再发起归档/备份/恢复。