rman不支持直接写对象存储,因其device type disk仅识别本地路径,不理解s3/oss的分段上传、签名鉴权等语义;必须通过sbt插件或fuse挂载实现间接对接。

RMAN 不能直接把备份写入对象存储(S3/OSS/OCI Object Storage),所谓“上传”其实是误用概念——RMAN 没有 UPLOAD 命令,也不支持 HTTP 协议或签名鉴权。必须通过中间层抽象,否则 BACKUP DATABASE FORMAT 's3://bucket/...' 会立刻报错 RMAN-06172: no channel to restore from 或静默失败。
为什么 RMAN 不支持直接写对象存储
RMAN 的 DEVICE TYPE DISK 只认操作系统级路径(如 /u01/backup),它不理解分段上传、预签名 URL、ETag 校验、v4 签名这些对象存储语义。试图绕过中间层直连,等于让汽车开上云——引擎没接口,轮子没路。
-
DEVICE TYPE sbt是唯一合法入口,但要求加载兼容的 SBT 库(如liboss_sbt.so),不是所有插件都适配 Oracle 19c+ 的符号校验 -
DEVICE TYPE DISK下挂载 FUSE(如s3fs、oci-fss、ossfs)是更稳的路径,但挂载点必须由 Oracle 用户可读写,且禁用内核缓存(noatime,nonempty,use_cache=/tmp) - OCI 原生支持通过
Oracle Database Cloud Backup Module(ODCBM)对接 OCI Object Storage,但它本质仍是 SBT 封装,需单独安装备份模块并配置libopc.so
用 SBT 接入 OSS/S3 最容易卡住的三个地方
即使你已下载了 oss-sbt 插件,ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt 还是报 ORA-19554?大概率栽在这三处:
-
SBT_LIBRARY环境变量未在 RMAN 启动前生效:必须在rman target /前 export,不能只在 shell 里设完就进 SQL*Plus 再调 RMAN - OSS Endpoint 写成
https://oss-cn-hangzhou.aliyuncs.com—— 错,要删掉https://,只留oss-cn-hangzhou.aliyuncs.com;S3 同理,不能带https://s3.us-east-1.amazonaws.com,得是s3.us-east-1.amazonaws.com - 插件配置里没关 MD5 校验:
disableMD5=true必须显式设置,否则 RMAN 写完分片后比对本地 MD5 和 OSS 返回的 ETag(实际是 multipart upload 的 MD5 拼接值)必然失败
用 FUSE 挂载对象存储当本地盘的实操要点
比 SBT 更易调试、更少依赖插件版本,适合快速验证或中小库迁移。但要注意权限和挂载参数:
- 挂载命令示例(OSS):
ossfs bucket-name /mnt/oss -ourl=oss-cn-hangzhou.aliyuncs.com -oallow_other -oumask=000 -ocredentials_file=/etc/passwd-ossfs;其中-oallow_other让 oracle 用户能访问,-oumask=000避免权限拒绝 - 挂载后必须测试写入:
su - oracle -c "echo test > /mnt/oss/test.txt",失败则查dmesg | tail是否有 fuse 权限或 DNS 解析错误 - RMAN 脚本中使用标准磁盘通道:
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/mnt/oss/%U'; BACKUP DATABASE;,别碰sbt相关命令 - 挂载点不能在 NFS 上(RMAN 加载时可能触发锁等待),也不能用 root 用户挂载后 chown 给 oracle——fuse 要求挂载用户与访问用户一致
真正难的从来不是“怎么配”,而是搞清 RMAN 在哪一层干活:它只管块、路径、设备类型;对象存储的协议、签名、重试、断点续传,全得甩给 SBT 插件或 FUSE 层扛。漏掉任一环,备份就会卡在“正在分配通道”或“写入 piece 0%”。











