ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

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 COMPLETEDARCHIVELOG DISK 20260925 23:07:53 48 102 COMPLETED --compressARCHIVELOG DISK 20260925 22:32:49 3 110 COMPLETED ---no compARCHIVELOG 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 的钥匙如果是透明加密仅仅把 RMAN 备份片复制到新服务器是不够的。你必须把源库的Oracle Wallet 钱包文件如ewallet.p12复制到异地并成功打开因为只有钱包里的 Master Key 才能解开备份片头部的 DEK。 [1, 2, 3]如果是口令加密异地恢复最省心不需要拷贝钱包。只需在 RMAN 中执行SET DECRYPTION IDENTIFIED BY 你的密码;即可直接命令 RMAN 解开备份片头部的 DEK。 [1, 2]不要与本地 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 层的ENCRYPTIONRMAN 的行为如下数据块级别直接复制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。这是因为RMAN 需要读取数据库的元数据和控制文件。如果配置了 RMAN 的透明加密模式RMAN 需要调用钱包里的 Master Key 来加密备份集自身的 DEK。 总结在 TDE 环境下做 RMAN 备份直接备份即可千万不要去解密数据库。唯一要做的就是在数据库中确认钱包已打开sqlSELECT 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 后的 ArchivelogTDE 使用 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和部分普通表空间没开那么归档日志中属于“未加密表空间”的那部分重做数据依然是可以被成功压缩的。如果你开启了全库级别的加密归档日志将彻底失去压缩价值。 生产环境的解法既然无法通过软件压缩来节省归档日志的空间业内通常采用以下方案替代缩短归档保留周期提高 RMAN 备份归档的频率例如从一天一次改为每 2 小时或每小时一次备份并验证成功后立即使用DELETE INPUT删掉本地磁盘上的归档日志。利用存储底层的硬件压缩/去重部分高端存储如全闪存阵列具备硬件级的数据缩减技术虽然对加密数据的压缩率依然有限但由于是专用芯片处理至少不会白白消耗数据库服务器的 CPU。您目前是遇到了归档日志目录Archive Destination爆满的问题还是在调整RMAN 定时备份脚本的压缩参数如果您正在面对磁盘空间压力我们可以探讨一下如何优化您的 RMAN 归档清理策略。为什么TDE下db备份可以压缩您提到了一个非常深刻且看似矛盾的现象既然加密数据因为“随机化”无法被压缩为什么在 TDE 环境下数据文件DB的 RMAN 备份却依然可以被成功压缩这并不是因为 TDE 对数据文件放水了而是因为 Oracle RMAN 在备份 TDE 数据文件时使用了与处理归档日志Archivelog完全不同的底层解密/处理机制。主要原因有以下三点1. 核心差异RMAN 在备份时有权“提前解密”数据块这是 DB 备份与 Archivelog 备份最大的区别备份 Archivelog 时RMAN 是直接以流式二进制Streaming读取日志文件不关心也不解析里面的逻辑内容因此它看到的完全是 AES 加密后的乱码无法压缩。备份 DatafileDB时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 CompressionRMAN 拥有专门针对 TDE 优化的压缩算法如MEDIUM或HIGH级别这些算法能够识别出 TDE 加密块的头部标识。如果在某种特殊配置下如使用了AS TRANS_ONLY导致 RMAN 只能读取密文块高级压缩引擎会智能放弃对加密数据部分的无用压缩转而专门去压缩块头、元数据以及未加密的区域。虽然这种情况下压缩率会打折扣但它通过“聪明地偷懒”避免了 CPU 的无效暴涨。 总结对比备份对象RMAN 读取时的状态为什么能/不能压缩Archivelog (归档)纯粹的底层密文流无法提前解密数据彻底随机化无法压缩。Datafile (DB备份)经钱包在内存中解密后的明文块恢复了数据的冗余性且能跳过未使用的空闲数据块可以高效压缩。您在测试 RMAN 备份压缩时使用的是普通的BASIC压缩算法还是购买了高级压缩选项Advanced Compression的LOW/MEDIUM/HIGH算法呢不同的压缩算法级别在 TDE 环境下的CPU 消耗差异非常大如果您需要我们可以对比一下它们的性能损耗。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表