ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Oracle TDE 下归档压缩备份 费时且无效果

Oracle TDE 下归档压缩备份 费时且无效果

100GB的archivelog ,耗时从3分钟变为48分钟,16倍,但是大小基本没变,

未压缩

archivelog 100GB 3分钟

datafile 30000GB 900分钟 实际191分钟,datafile 更快

INPUT_TYPE OUTPUT_DEVICE_TYP START_TIME ET(Mins) SIZE (GB) STATUS
------------- ----------------- -------------------- ---------- ---------- ----------
DB INCR DISK 20260926 00:16:36 191 30475 COMPLETED
ARCHIVELOG DISK 20260925 23:07:53 48 102 COMPLETED --compress
ARCHIVELOG DISK 20260925 22:32:49 3 110 COMPLETED ---no comp
ARCHIVELOG DISK 20260925 22:20:38 42 87 COMPLETED

原理

rman备份 的dek存放在哪

在 Oracle 数据库中,RMAN 加密备份的 DEK(数据加密密钥)直接存放在备份片(Backup Piece,即生成的备份文件)的头部区域。 [1, 2]

为了确保安全性,这个 DEK 绝对不会以明文形式存储,而是以密文形式(Encrypted Form)内嵌在备份文件里 。其完整的存放与加解密逻辑如下: [1, 2, 3]

🔑 1. 备份生成时:DEK 存放在哪里?

  • 当你执行 RMAN 加密备份时,RMAN 会在内存中为每一个备份集(Backup Set)随机生成一个独立的、专用的 DEK 。
  • 随后,RMAN 会根据你配置的加密模式,用上一层密钥(如 Master Key 或密码)将这个 DEK 加密 。
  • 最终存放点:包装后的 DEK 密文被直接写入到该备份集对应的BKP备份片文件(Backup Piece)的头部。数据体本身则由该 DEK 进行数据块级别的实时加密。 [1, 2, 3, 4, 5]

🛡️ 2. 三种加密模式下,谁来加密 DEK?

根据 RMAN 的加密配置,备份片头部里的 DEK 是被不同的“外壳”保护的:

RMAN 加密模式备份片头部的 DEK 被谁加密?恢复(Restore)时的解密依赖
透明加密 (Transparent)由数据库的TDE 主密钥 (Master Key)加密必须打开匹配的Oracle Wallet 钱包(.p12/.sso)
口令加密 (Password-based)由你在 RMAN 中输入的解密口令加密不需要钱包,输入相同的Password即可
双重模式 (Dual-mode)同时生成两份 DEK 密文,分别用Master Key和口令加密二选一:有钱包或记得密码均可解密恢复

⚠️ 灾难恢复(3 种场景)的重要结论

因为 DEK 已经随备份片一起打包了,所以在进行异地恢复或灾难重建时,你不需要单独寻找 DEK 文件,而是需要解决解密 DEK 的钥匙:

  1. 如果是透明加密:仅仅把 RMAN 备份片复制到新服务器是不够的。你必须把源库的Oracle Wallet 钱包文件(如ewallet.p12)复制到异地并成功打开,因为只有钱包里的 Master Key 才能解开备份片头部的 DEK。 [1, 2, 3]
  2. 如果是口令加密:异地恢复最省心,不需要拷贝钱包。只需在 RMAN 中执行SET DECRYPTION IDENTIFIED BY '你的密码';,即可直接命令 RMAN 解开备份片头部的 DEK。 [1, 2]
  3. 不要与本地 TDE 混淆:哪怕数据库本地的表空间启用了 TDE 加密(其本地 DEK 在DBF数据文件头),在通过 RMAN 备份时,如果你没有配置CONFIGURE ENCRYPTION FOR DATABASE ON;,RMAN 默认生成的备份片是不带备份级 DEK的,备份片里的数据由于顺次读取本地已被加密的数据块,在备份片里直接呈现为混乱的密文。 [1]

您目前是在规划Oracle 异地灾备演练 (Cross-System Restore),还是遇到了"ORA-19913: unable to decrypt backup piece"之类的报错?如果正在编写异地恢复的脚本,我可以为您提供对应的钱包或密码配置命令。

TDE下rman备份需要先解密吗

在 TDE(透明数据加密)环境下,执行 RMAN 备份不需要、也绝对不可以先将数据库解密。

RMAN 在备份时有其独特的底层处理逻辑,具体分为以下两种情况:

1. 默认情况:直接备份(不配置 RMAN 级别加密)

如果你在 TDE 环境下,直接运行普通的 RMAN 备份命令(未开启 RMAN 层的ENCRYPTION),RMAN 的行为如下:

  • 数据块级别直接复制:RMAN 会直接从磁盘上读取已经加密的数据块(Blocks),并原封不动地写入备份片(Backup Piece)中。
  • 安全性:备份片中的数据依然是加密的。
  • 恢复(Restore)依赖:恢复时直接写回磁盘即可。但由于数据块本身是加密的,数据库在运行期读取这些数据块时,必须依赖 TDE 钱包(Wallet)里的 Master Key 才能正常打开和读取。

2. 推荐做法:开启 RMAN 级别加密(AS TRANS_ONLY / CONFIGURE ENCRYPTION)

在实际生产中,为了能让备份文件拥有独立的密钥管理,或者在传输到第三方存储时更安全,通常会配置 RMAN 加密:

  • 双重复合加密:RMAN 在备份时同样不需要你解密数据库。它会直接读取加密的数据,并在 RMAN 备份集层面上再加一把锁。
  • AS TRANS_ONLY的妙用:Oracle 提供了一个关键字叫ONLY或TRANS_ONLY(取决于大版本)。它允许 RMAN直接把 TDE 加密过的数据块打包,同时在备份片头部打上 TDE 相关的加密标记。这样可以避免 RMAN 在备份时对数据进行“先用 TDE 解密、再用 RMAN 加密”的 CPU 损耗,从而极大地节省备份时的 CPU 开销。

🚨 避坑指南:唯一需要确保的一件事

虽然你不需要解密数据库,但在执行 RMAN 备份时,TDE 钱包(Wallet)必须处于打开(OPEN)状态。

如果钱包关闭,RMAN 备份会直接报错(例如ORA-28365: wallet is not open)。这是因为:

  1. RMAN 需要读取数据库的元数据和控制文件。
  2. 如果配置了 RMAN 的透明加密模式,RMAN 需要调用钱包里的 Master Key 来加密备份集自身的 DEK。

📝 总结

在 TDE 环境下做 RMAN 备份,直接备份即可,千万不要去解密数据库。唯一要做的就是在数据库中确认钱包已打开:

sql

SELECT WRL_TYPE, WRL_PARAMETER, STATUS FROM V$ENCRYPTION_WALLET; -- 确保 STATUS 为 OPEN 或 OPEN_NO_DATA_STARTUP

请谨慎使用此类代码。

您目前是在写RMAN 的备份脚本,还是在准备把备份集传输到异地(或者物理备库 Data Guard)进行恢复?如果您需要异地恢复,需要特别注意钱包文件的迁移,我可以为您提供相关的迁移步骤。

TDE下的archivelog 为什么不能压缩

在启用了 TDE(透明数据加密)的环境下,归档日志(Archivelog)并不是绝对不能压缩,而是“压缩几乎完全无效”或者“直接压缩会导致严重的性能暴跌和空间浪费”。

这背后的根本原因在于密码学特性以及 Oracle 底层的加密逻辑:

1. 核心原因:加密数据的“零冗余”特性(密码学原理)

数据的压缩(如gzip,bzip2,zstd或 RMAN 的COMPRESS)依赖于找出数据中的重复模式和冗余结构(例如连续的零、重复的字符串)。

  • 未启用 TDE 的 Archivelog:包含大量的明文 SQL 变更、未填满的数据块空隙(大量的0x00),冗余度极高,通常可以获得4x 到 10x 的超高压缩率。
  • 启用 TDE 后的 Archivelog:TDE 使用 AES 算法对修改的数据块或 WAL/Redo 日志进行加密。加密算法的本质就是将数据彻底随机化(白噪声化)。
  • 结果:加密后的归档日志在二进制结构上几乎没有任何重复模式。如果你尝试去压缩它,压缩软件会消耗大量的 CPU 算力进行极其复杂的字典匹配,最终发现压缩率接近 0%(甚至因为添加了压缩文件头,文件反而变大了)。

2. Oracle RMAN 备份时的特殊限制

如果你在 RMAN 中使用BACKUP AS COMPRESSED BACKUPSET ARCHIVELOG ALL;,会遇到以下尴尬的局面:

  • CPU 暴涨与备份变慢:RMAN 的压缩算法(如 BZIP2/ZLIB)会强行对这些已经随机化的二进制数据块进行扫描和压缩算法重算,导致服务器 CPU 飙升至 100%,备份时间成倍拉长,但文件体积根本没有变小。
  • Oracle 官方的架构建议:Oracle 在最佳实践中明确指出,对于已经通过 TDE 加密的对象(包括加密表空间的数据文件和加密的归档日志),在进行备份时应该关闭 RMAN 压缩,或者改用专门针对加密数据优化的硬件压缩/高级压缩选项(如高级压缩选项中的MEDIUM或HIGH算法,在某些特定硬件组合下能通过识别加密块头跳过无效压缩,但普通压缩依然无效)。

3. 特例:什么时候 TDE 的 Archivelog 还能被压缩一点点?

很多 DBA 会发现,开了 TDE 后,有些 Archivelog 压缩后还是小了 10%~20%,这是为什么?

  • 局部加密:因为 TDE 通常是表空间级(Tablespace-level)加密。如果你的数据库中只有一部分核心业务表空间开了 TDE,而系统表空间(SYSTEM,SYSAUX,UNDOTBS)和部分普通表空间没开,那么归档日志中属于“未加密表空间”的那部分重做数据,依然是可以被成功压缩的。
  • 如果你开启了全库级别的加密,归档日志将彻底失去压缩价值。

💡 生产环境的解法

既然无法通过软件压缩来节省归档日志的空间,业内通常采用以下方案替代:

  1. 缩短归档保留周期:提高 RMAN 备份归档的频率(例如从一天一次改为每 2 小时或每小时一次),备份并验证成功后,立即使用DELETE INPUT删掉本地磁盘上的归档日志。
  2. 利用存储底层的硬件压缩/去重:部分高端存储(如全闪存阵列)具备硬件级的数据缩减技术,虽然对加密数据的压缩率依然有限,但由于是专用芯片处理,至少不会白白消耗数据库服务器的 CPU。

您目前是遇到了归档日志目录(Archive Destination)爆满的问题,还是在调整RMAN 定时备份脚本的压缩参数?如果您正在面对磁盘空间压力,我们可以探讨一下如何优化您的 RMAN 归档清理策略。

为什么TDE下db备份可以压缩

您提到了一个非常深刻且看似矛盾的现象:既然加密数据因为“随机化”无法被压缩,为什么在 TDE 环境下,数据文件(DB)的 RMAN 备份却依然可以被成功压缩?

这并不是因为 TDE 对数据文件放水了,而是因为 Oracle RMAN 在备份 TDE 数据文件时,使用了与处理归档日志(Archivelog)完全不同的底层解密/处理机制。

主要原因有以下三点:

1. 核心差异:RMAN 在备份时有权“提前解密”数据块

这是 DB 备份与 Archivelog 备份最大的区别:

  • 备份 Archivelog 时:RMAN 是直接以流式二进制(Streaming)读取日志文件,不关心也不解析里面的逻辑内容,因此它看到的完全是 AES 加密后的乱码,无法压缩。
  • 备份 Datafile(DB)时:RMAN 是通过 Oracle 数据库引擎去读取数据块(Data Blocks)的。当 RMAN 读取一个 TDE 加密的数据块时,如果数据库的TDE 钱包(Wallet)是打开的,Oracle 会在内存中先将该数据块解密为明文,然后再交给 RMAN。
  • 结果:RMAN 压缩引擎拿到的实际上是未加密的、带有大量冗余和空闲空间的明文数据块。因此,它能够像往常一样进行极高比例的压缩。

(注:解密后压缩并打包进备份片时,RMAN 会用备份级的密钥(如密码或 TDE Master Key)重新对整个备份片进行加密,以确保备份文件的安全。这个过程被称为 RMAN 的透明/口令备份加密。)


2. 数据文件内部存在大量的“白空间”(White Space)

即使不考虑提前解密,数据文件和归档日志的物理结构也完全不同:

  • 归档日志(Archivelog):它是紧凑的、连续的重做记录流。一旦被 TDE 加密,从头到尾塞满了密文,没有任何空隙。
  • 数据文件(Datafile):为了应对未来的数据插入(INSERT),数据块内部通常保留了大量的空闲空间(PCTFREE / Unused Blocks),或者由于删除了数据留下的空洞。
  • 当 RMAN 扫描数据文件时,它能准确识别出哪些数据块是从来没有使用过的(High Water Mark 以上的块)。对于这些空块,RMAN 根本不会去读取或加密它们,而是直接在备份片中进行跳块(Block Skipping)或用极小的标记代替。这种对结构性空闲空间的优化,带来了巨大的“压缩”空间。

3. Oracle Advanced Compression(高级压缩)的智能识别

如果您使用的是 Oracle 的高级安全组件(Advanced Security)和高级压缩(Advanced Compression),RMAN 拥有专门针对 TDE 优化的压缩算法(如MEDIUM或HIGH级别):

  • 这些算法能够识别出 TDE 加密块的头部标识。
  • 如果在某种特殊配置下(如使用了AS TRANS_ONLY导致 RMAN 只能读取密文块),高级压缩引擎会智能放弃对加密数据部分的无用压缩,转而专门去压缩块头、元数据以及未加密的区域。虽然这种情况下压缩率会打折扣,但它通过“聪明地偷懒”避免了 CPU 的无效暴涨。

📝 总结对比

备份对象RMAN 读取时的状态为什么能/不能压缩?
Archivelog (归档)纯粹的底层密文流无法提前解密,数据彻底随机化,无法压缩。
Datafile (DB备份)经钱包在内存中解密后的明文块恢复了数据的冗余性,且能跳过未使用的空闲数据块,可以高效压缩。

您在测试 RMAN 备份压缩时,使用的是普通的BASIC压缩算法,还是购买了高级压缩选项(Advanced Compression)的LOW/MEDIUM/HIGH算法呢?不同的压缩算法级别在 TDE 环境下的CPU 消耗差异非常大,如果您需要,我们可以对比一下它们的性能损耗。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进