rman不支持直接备份到s3/oss,必须通过sbt接口;关键在于正确加载sbt库(如liboss_sbt.so)、配置oss专属参数(endpoint/region/签名v4)、禁用md5校验以适配oss的etag机制。
rman 本身不支持直接写 s3,必须走 sbt 接口,而 sbt 不是协议而是加载机制——关键在“能加载的库”和“能识别的配置”
确认 RMAN 是否已加载有效的 SBT 库
执行 LIST DEVICE TYPE ALL;,输出中必须包含 sbt_tape。若没有,说明 SBT 库根本没加载成功,不是网络或权限问题,而是路径或符号兼容性卡住了。
-
SBT_LIBRARY环境变量必须在 RMAN 启动前就设好,例如:export SBT_LIBRARY=/opt/oss-sbt/lib/liboss_sbt.so;用脚本调用 RMAN 时,EXPORT要写在脚本最开头,不能只在 shell 里临时执行 - Oracle 19c+ 对 SBT 库的符号表校验更严:若插件依赖旧版
libcurl(如 7.29),而系统装的是 7.8x,curl_easy_setopt符号缺失会导致静默失败——RMAN 启动不报错,但ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt会直接报ORA-19554 - Linux 下用
ldd -r检查库依赖是否全满足,重点关注undefined symbol行
配置 SBT 插件参数时绕开 OSS/S3 差异陷阱
阿里云 OSS 和 AWS S3 表面兼容,实则签名、Endpoint 解析、Bucket 访问方式都不同。插件若硬编码 s3.amazonaws.com 或默认发 v2 签名,就会在 BACKUP 阶段卡住,报 ORA-19511: non-RMAN error from helper HTTP 400 Bad Request 或 403 Forbidden。
- OSS 必须用 DNS-style 访问:
bucketname.oss-cn-hangzhou.aliyuncs.com,禁用 path-style(即不能写成oss-cn-hangzhou.aliyuncs.com/bucketname),插件需显式设withPathStyleAccessEnabled(false) - 签名版本必须为
V4:OSS 已停用 v2,但部分老插件(如早期 oss-sbt)默认发 v2 请求,需在配置文件或环境变量中强制指定signatureVersion=V4 - Region ID 必须匹配 Endpoint,例如
oss-cn-hangzhou对应oss-cn-hangzhou.aliyuncs.com;填错会导致 400 或超时 - 若插件通过
sbtsvc.conf加载参数,注意该文件必须由 Oracle 用户可读,且不能放在 NFS 挂载点上——RMAN 加载时可能因锁等待挂起
关闭 RMAN 的 MD5 校验以适配 OSS ETag 机制
这是最隐蔽的失败点:RMAN 在写完每个备份片(backup piece)后,会主动发起一次 HEAD 请求校验 MD5,但阿里云 OSS 返回的 ETag 值在 multipart upload 场景下是拼接 MD5 的 base64(如 "a1b2c3...-5"),不是原始 MD5 哈希值,导致校验失败并中断备份,错误日志里往往只有模糊的 ORA-19505 或 ORA-19511。
- 必须在插件配置中显式禁用 MD5 校验,常见方式有:
disableMD5=true、skipMD5Check=true或插件特有开关(如 oss-sbt 的oss.md5.check=false) - 不要指望 RMAN 层面关掉它——
CONFIGURE BACKUP OPTIMIZATION或NOFORMAT都不影响这个底层校验行为 - AWS S3 一般无此问题,但若用 MinIO 或 Ceph S3 兼容层,也得确认其 ETag 行为是否与标准 S3 一致;不一致时同样要关 MD5
真正卡住人的从来不是“怎么配”,而是“为什么配了还不认”。SBT 库加载失败、OSS 签名不匹配、ETag 校验断连——这三处任何一个出问题,RMAN 都不会明确告诉你缺哪一环,只会抛一个泛泛的 I/O 错误。动手前先跑通 ALLOCATE CHANNEL 和 LIST DEVICE,比盲目堆参数有用得多。











