ora-28365错误源于密钥库未open,须先显式设置wallet_root为绝对路径并赋权700,重启数据库后open密钥库、生成主密钥,再于目标cdb/pdb容器中执行加密表空间语句。
ora-28365 是最常卡住你的错误,不是配置漏了,而是密钥库根本没打开——哪怕你已经跑过 administer key management set key。
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 set key 报错,其实是因为密钥库还处于 CLOSED 状态。创建密钥库(create keystore)只生成 ewallet.p12,不代表它已可用。
- 先打开密钥库:
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 - 真正加密存量数据需手动重写:对大表执行
alter table t move tablespace encrypted_ts;或使用DBMS_REDEFINITION - 加密后首次访问依赖该表空间的对象(如物化视图日志、LOB 段)会隐式触发加密初始化,可能短暂卡住 DML,可查
v$session_longops中的encryption initialization项 - 备份时,
cwallet.sso和ewallet.p12比 RMAN 备份更关键——没 wallet,RMAN 备份的数据文件无法解密
CDB/PDB 架构下必须在目标容器中单独操作
在多租户环境中,WALLET_ROOT 和主密钥都在 CDB 层配置,但加密表空间语句必须在对应 PDB 内执行,否则会作用于 CDB$ROOT 或报错。
- 先
alter session set container=ORCLPDB1;(替换为你的真实 PDB 名) - 再确认该 PDB 的密钥库状态:
select status from v$encryption_wallet;—— 若为CLOSED,需在该 PDB 内重新set keystore open - 最后执行:
create tablespace encrypted_ts datafile '/path/to/file.dbf' size 100M encryption using 'AES256' default storage(encrypt); - 若要加密已有表空间:
alter tablespace users encryption encrypt;—— 注意这仅影响后续写入
最容易被忽略的是:密钥库路径权限、属主(必须是 oracle)、以及 CDB/PDB 容器上下文切换——这三个点出错,ORA-28365 就会反复出现,跟密码或语法无关。











