Oracle RMAN压缩比不固定,取决于数据特征、块使用率、配置及版本;启用有效压缩需区分默认未使用块压缩与显式AS COMPRESSED BACKUPSET,并确认COMPATIBLE≥10.2、本地管理表空间、DISK设备等四前提。
oracle rman 的压缩比不是固定值,它高度依赖实际数据特征、块使用率、rman配置和数据库版本。盲目套用“70%压缩率”或“4:1”这类宣传数字,容易导致空间预估严重偏差或备份窗口失控。
如何判断当前是否启用了有效压缩
RMAN 有两层“压缩”机制:默认的 UNUSED BLOCK COMPRESSION(未使用块压缩)和显式启用的 AS COMPRESSED BACKUPSET。前者在 BACKUP DATABASE 无额外参数时自动生效(需满足兼容性≥10.2、本地管理表空间、DISK设备等条件),后者才是真正调用算法压缩数据内容的选项。
常见误判点:
- 执行
backup database;后发现备份集比数据文件小——这大概率只是UNUSED BLOCK COMPRESSION过滤了空块,不是算法压缩 -
show all;中没看到CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET;,但误以为已全局开启压缩 - 在 SBT(磁带)设备上执行
AS COMPRESSED BACKUPSET,实际无效(磁带备份不支持该压缩模式)
实测压缩比前必须确认的 4 个前提
不做这些检查,直接跑 backup as compressed backupset 测出来的数字参考价值极低:
- 确认数据库
COMPATIBLE参数 ≥ 10.2(SELECT value FROM v$parameter WHERE name = 'compatible';) - 确认目标表空间为本地管理(
SELECT extent_management FROM dba_tablespaces WHERE tablespace_name = 'SYSTEM';应返回LOCAL) - 确保备份目标是
DISK(CONFIGURE DEFAULT DEVICE TYPE TO DISK;),SBT 不支持二进制压缩 - 避免归档日志混入同一备份命令——归档日志本身已压缩,会拉低整体压缩比统计
AS COMPRESSED BACKUPSET 对备份性能的实际影响
压缩不是免费的。实测表明,在中等负载服务器上启用该选项,典型代价是:
- CPU 使用率峰值上升 40%~60%,
top或vmstat可观察到明显波动 - 备份耗时增加约 35%~45%,尤其在高 I/O 延迟或 CPU 资源紧张时更显著
- 恢复时无需额外解压步骤,但若备份集损坏,压缩后校验失败概率略高于非压缩备份(因单个 bit error 影响更大)
示例对比(10g R2 环境):
非压缩:backup database format '/bkp/full_%U.bkp'; → 耗时 1m15s,输出 1.55G<br>压缩:backup as compressed backupset database format '/bkp/full_comp_%U.bkp'; → 耗时 2m25s,输出 328M
压缩比估算不能只看 dba_data_files 总和
用 SELECT SUM(bytes) FROM dba_data_files; 减去 dba_free_space 得出“已用空间”,再除以压缩比(比如 3),这种算法误差常超 ±50%。真实压缩效果取决于:
- LOB、BLOB 字段占比(高则压缩率下降明显)
- UNDO 表空间活跃度(11g+ 对 UNDO 有专门优化,但仅限全备)
- 块内重复模式(纯随机数据几乎不压缩)
- 是否启用
SECTION SIZE并行分片(影响压缩上下文连续性)
更靠谱的做法:先对一个典型表空间(如 USERS)做小规模测试:
RMAN> backup as compressed backupset tablespace users format '/tmp/test_comp.bkp';<br>RMAN> backup tablespace users format '/tmp/test_nocomp.bkp';<br>然后对比两个文件大小即可获得该环境下的真实基准压缩比
真正决定压缩比上限的,从来不是 RMAN 命令本身,而是你数据库里那些被反复 update 却从不 delete 的 LOB 列、填充了大量空格的 CHAR 字段、以及长期未 shrink 的索引——这些细节在 AS COMPRESSED BACKUPSET 面前毫无保留。











