ORA-28365错误源于密钥库未OPEN,须先设WALLET_ROOT为绝对路径并赋权,再OPEN密钥库、生成主密钥,最后在对应容器(CDB/PDB)中执行加密表空间语句。
ora-28365: wallet is not open 是你执行加密表空间语句时最可能遇到的错误,说明密钥库(wallet)没打开——不是配置没做对,而是操作顺序错了。tde 表空间加密在 oracle 19c 中必须满足两个硬性前提:密钥库已创建且处于 open 状态,且主密钥(tde master key)已生成。缺一不可。
密钥库路径必须用 WALLET_ROOT 显式指定(19c 强制要求)
Oracle 19c 废弃了旧版 ENCRYPTION_WALLET_LOCATION 的直接配置方式,改用统一的密钥库根路径管理。不设 WALLET_ROOT,后续所有 TDE 操作都会 fallback 到默认路径($ORACLE_BASE/admin/$DB_UNIQUE_NAME/wallet),但这个路径不可靠,尤其在 CDB/PDB 架构下容易错位。
-
WALLET_ROOT必须是绝对路径,且 Oracle 用户对该目录有读写权限(chmod 700) - 修改后需重启数据库或至少 reload 参数:
alter system set wallet_root='/opt/oracle/admin/orcl/wallet' scope=spfile; - 重启后检查是否生效:
show parameter wallet_root;再确认密钥库位置:select wrl_parameter from v$encryption_wallet; - 如果仍显示空或旧路径,说明
TDE_CONFIGURATION里KEYSTORE_CONFIGURATION没设为FILE,补上:alter system set tde_configuration="KEYSTORE_CONFIGURATION=FILE" scope=spfile;
administer key management 命令必须在密钥库 OPEN 后执行
很多人卡在 set key 报错,其实是因为密钥库本身还没打开。注意:创建密钥库(create keystore)只是生成 ewallet.p12 文件,此时状态是 CLOSED;必须显式打开才能用它生成主密钥。
- 先打开密钥库:
administer key management set keystore open identified by "Oracle123"; - 再设主密钥:
administer key management set key force keystore identified by "Oracle123" with backup; - 若用自动登录(推荐生产环境),则先建 auto_login wallet:
administer key management create auto_login keystore from keystore '/opt/oracle/admin/orcl/wallet' identified by "Oracle123";,之后就无需密码即可 OPEN,但cwallet.sso文件必须和ewallet.p12在同一目录 - 验证状态:
select status, wallet_type from v$encryption_wallet;—— 正常应为OPEN且WALLET_TYPE是AUTOLOGIN或PASSWORD
创建加密表空间前必须确认密钥库已 OPEN,且不能在 RESTRICTED SESSION 下操作
CREATE TABLESPACE ... ENCRYPTION 语句会实时调用密钥库中的主密钥,一旦 wallet 关闭、权限不足、或当前 session 被限制,就会立即报 ORA-28365 或 ORA-28374。
- 确保当前用户是
SYSDBA或拥有ADMINISTER KEY MANAGEMENT和CREATE TABLESPACE权限 - 不要在
startup restrict启动的实例中尝试,否则即使 wallet OPEN 也会失败 - 语句示例(AES-192 是 19c 默认强度):
create tablespace enc_tbs datafile '/u01/oradata/orcl/enc_tbs01.dbf' size 100m encryption using 'aes192' default storage(encrypt); - 创建后立刻验证:
select tablespace_name, encrypted from dba_tablespaces where tablespace_name = 'ENC_TBS';——ENC列应为YES
PDB 场景下密钥库和主密钥必须按容器分别处理
CDB 中每个 PDB 默认共享 CDB root 的密钥库和主密钥,但如果你要为某个 PDB 单独加密(比如多租户隔离需求),就必须在该 PDB 内重新 OPEN wallet 并 SET KEY —— 这个动作不会影响其他 PDB,但要求该 PDB 的密钥库路径已通过 ALTER SESSION SET CONTAINER = pdb_name 切换上下文后,再执行 administer key management 命令。
- 先进入目标 PDB:
alter session set container = orclpdb1; - 确认当前容器 wallet 状态:
select * from v$encryption_wallet;(可能显示CLOSED) - 打开并设主密钥:
administer key management set keystore open identified by "Oracle123";,然后set key - 注意:PDB 的 wallet 不是独立文件,而是 CDB wallet 的逻辑视图,所以物理路径仍是
WALLET_ROOT下的同一个目录
密钥库路径、OPEN 状态、容器上下文这三者必须严格对齐,漏掉任一环,ENCRYPTION 就会静默失败。尤其容易忽略的是:PDB 模式下,v$encryption_wallet 查到的 WRL_PARAMETER 是 CDB 级路径,但实际生效的密钥操作必须在对应 PDB session 中完成。


















