必须先显式设置WALLET_ROOT为绝对路径并重启数据库,再OPEN密钥库、生成主密钥,否则所有TDE操作均报ORA-28365;WALLET_ROOT无默认值,废弃ENCRYPTION_WALLET_LOCATION,CDB/PDB下不设则易错位。

必须先设 WALLET_ROOT 并显式打开密钥库,否则所有 TDE 操作都会卡在 ORA-28365: wallet is not open ——这不是配置遗漏,是操作顺序错了。
WALLET_ROOT 必须显式设为绝对路径且重启生效
Oracle 19c 废弃了 ENCRYPTION_WALLET_LOCATION,只认 WALLET_ROOT。不设它,TDE 会 fallback 到默认路径(如 $ORACLE_BASE/admin/$DB_UNIQUE_NAME/wallet),但在 CDB/PDB 架构下极易错位。
-
WALLET_ROOT必须是绝对路径,例如:/opt/oracle/admin/orcl/wallet - Oracle 用户需对该目录有读写权限:
chmod 700 /opt/oracle/admin/orcl/wallet - 必须用
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 和主密钥生成顺序不能颠倒
执行 administer key management create keystore 只生成 ewallet.p12,此时密钥库状态仍是 CLOSED。后续所有加密操作(包括 set key 或 alter tablespace encryption)都会失败。
- 先打开密钥库:
administer key management set keystore open identified by "Oracle123"; - 再生成主密钥:
administer key management set key force keystore identified by "Oracle123" with backup; - 生产环境推荐自动登录:
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 只加密新写入数据块
TDE 表空间加密不是“一键全量重写”,它只对后续 INSERT/UPDATE 产生的数据块生效。存量数据仍为明文,除非触发物理重写。
- 加密前确认表空间类型:
SYSTEM、SYSAUX、UNDO、TEMP不支持加密,会报ORA-44001: invalid tablespace - 执行加密语句后,
V$ENCRYPTED_TABLESPACES显示已启用,但查老数据仍见明文——这不是 bug,是设计行为 - 真正加密存量数据需手动重写:对大表执行
alter table ... move或alter table ... shrink space等触发物理块重写的操作 - 注意容器范围:若在 CDB 中操作,需明确指定
container=all或切换到目标 PDB 再执行
RAC 和 DG 环境下 WALLET_ROOT 必须严格一致
在 RAC 或 Data Guard 场景中,WALLET_ROOT 不只是参数,更是共享信任链的起点。一处不一致,整个加密链就断裂。
- RAC 所有节点的
WALLET_ROOT值必须完全相同,且目录实际存在、属主为oracle:oinstall、权限700 - DG 主备库的密钥库**不能复用**:各自独立创建,证书
-dn必须匹配备库真实主机名(hostname -f输出),否则归档会静默降级为明文 TCP -
sqlnet.ora中的WALLET_LOCATION仅作兜底,必须写绝对路径,不能是软链;大小写、斜杠方向都要和WALLET_ROOT完全一致 - Wallet 备份比数据备份更关键:丢了
ewallet.p12+cwallet.sso,加密数据等于永久不可读
最容易被忽略的是:密钥库状态是动态的,不是“配完就永远 OK”。数据库重启后,auto-login wallet 虽可自动加载,但若 cwallet.sso 权限被误改、或目录被清理,v$encryption_wallet 就会显示 CLOSED,而错误日志里往往只报 ORA-28365,不提示具体原因。


















