表空间加密仅对新写入数据生效,ora-28365源于wallet未open而非配置错误;wallet_root必须显式设绝对路径、chmod 700、重启生效,且cdb/pdb中密钥库open与set key顺序不可颠倒。

直接说结论:表空间加密不会自动加密已有数据,ORA-28365 错误不是配置失败,而是 wallet 没打开——哪怕你已经跑过 SET KEY。
WALLET_ROOT 必须显式设置且重启生效
Oracle 19c 废弃了 ENCRYPTION_WALLET_LOCATION,只认 WALLET_ROOT。不设它,TDE 操作会 fallback 到默认路径(如 $ORACLE_BASE/admin/$DB_UNIQUE_NAME/wallet),但在 CDB/PDB 架构下极易错位,尤其 RAC 环境各节点必须一致。
-
WALLET_ROOT必须是绝对路径,例如/opt/oracle/admin/orcl/wallet - Oracle 用户对该目录需有读写权限:
chmod 700 /opt/oracle/admin/orcl/wallet;属主为oracle:oinstall - 必须用
SCOPE=SPFILE设置并重启数据库:ALTER SYSTEM SET WALLET_ROOT='/opt/oracle/admin/orcl/wallet' SCOPE=SPFILE; - 重启后验证:
SHOW PARAMETER WALLET_ROOT和SELECT WRL_PARAMETER FROM V$ENCRYPTION_WALLET;应返回相同路径 - 若仍为空,补上:
ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE=SPFILE;
密钥库 OPEN 和主密钥生成顺序不能颠倒
创建 keystore(CREATE KEYSTORE)只生成 ewallet.p12,wallet 状态仍是 CLOSED。此时执行 SET KEY 会报 ORA-28365,不是密码错,是根本没打开。
- 先打开密钥库:
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "Oracle123";(注意:不是ALTER SYSTEM SET ENCRYPTION WALLET OPEN) - 再生成主密钥:
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY "Oracle123" WITH BACKUP; - 生产环境推荐 auto-login:
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/opt/oracle/admin/orcl/wallet' IDENTIFIED BY "Oracle123";,会生成cwallet.sso,必须和ewallet.p12同目录、权限600 - 验证状态:
SELECT STATUS, WALLET_TYPE FROM V$ENCRYPTION_WALLET;—— 正常应为OPEN且WALLET_TYPE是AUTOLOGIN或PASSWORD
ALTER TABLESPACE ENCRYPTION 只对新写入数据块生效
执行 ALTER TABLESPACE users ENCRYPTION USING 'AES256' ENCRYPT; 后,V$ENCRYPTED_TABLESPACES 显示已启用,但老数据仍是明文——这不是 bug,是设计行为。TDE 不扫描或重写已有数据块。
- INSERT/UPDATE 新增或修改的数据,落盘即加密
- 存量数据块(包括索引、LOB、未更新的行)保持未加密,
DUMP()仍可见明文十六进制 - 真正完成全量加密需人工介入:
ALTER TABLE t MOVE TABLESPACE encrypted_ts;或DBMS_REDEFINITION - 系统表空间(
SYSTEM、SYSAUX、UNDOTBS1、TEMP)不支持加密,ALTER TABLESPACE temp ENCRYPTION ONLINE必然报 ORA-28370
CDB/PDB 容器中操作必须切对上下文
在多租户环境下,TDE 配置和加密语句必须在正确的容器中执行,否则静默失败或报 ORA-65040。
- 所有 keystore 管理命令(
SET KEYSTORE OPEN、SET KEY)必须在CDB$ROOT中执行 - 加密表空间语句(
ALTER TABLESPACE ... ENCRYPTION)必须在目标 PDB 中执行,先ALTER SESSION SET CONTAINER = ORCLPDB1; - 确认位置:
SHOW CON_NAME;必须显示对应 PDB 名,而非CDB$ROOT - 检查 PDB 是否 open:
SHOW PDBS;,OPEN MODE 应为READ WRITE
最易被忽略的是:wallet 备份比数据备份更关键;cwallet.sso 和 ewallet.p12 必须同目录、同权限、同属主,缺一不可。任何一步跳过或顺序错乱,都会让加密“看似成功、实则无效”。











