Wallet文件必须放在共享存储上,否则RAC节点间无法同步密钥;推荐使用ASM磁盘组或集群文件系统,确保所有节点读写同一份wallet,并在各节点单独执行OPEN或用srvctl统一管理。
Wallet文件必须放在共享存储上,否则RAC节点间无法同步密钥
oracle rac环境下,tde的ewallet.p12和cwallet.sso不能放在本地文件系统(比如/u01/app/oracle/admin/$oracle_sid/wallet),否则每个节点读取的是各自副本,密钥不一致会导致跨节点查询报ora-28365: wallet is not open或解密失败。
- 共享路径推荐使用ASM磁盘组(如
+DATA/WALLET/)或集群文件系统(OCFS2、ACFS),确保所有实例能同时读写同一份wallet文件 - 创建wallet前先确认ASM别名或挂载点权限:所有RAC节点的
oracle用户需对路径有读写执行权限,且UID/GID一致 - 用
orapki wallet create时指定-wallet参数指向共享路径,例如:orapki wallet create -wallet +DATA/WALLET/ -auto_login - 不要用
mkstore单独在某个节点更新密钥——它不会触发集群同步,必须通过统一wallet路径操作
SQL*Plus中OPEN WALLET命令对RAC是节点级生效,不是全局
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "xxx"只打开当前连接所在节点的wallet,其他节点仍处于CLOSED状态。这意味着:归档日志加密、Data Guard同步、物化视图刷新等跨节点操作可能因wallet未开而失败。
- 必须在每个RAC节点上分别执行OPEN命令,或用
srvctl统一控制:srvctl modify wallet -db <dbname> -wallet <path> -pwd <password></password></path></dbname>(19c+支持) - 检查状态不能只查当前实例:
SELECT * FROM v$encryption_wallet需在所有节点上运行,确认WALLET_STATUS均为OPEN - 自动打开依赖
sqlnet.ora中的WALLET_LOCATION配置,该配置必须在所有节点的$ORACLE_HOME/network/admin/sqlnet.ora中完全一致,且路径指向共享位置
主密钥轮换(KEY ROTATION)会中断RAC节点间加密一致性
执行ADMINISTER KEY MANAGEMENT SET KEY后,新密钥仅写入当前节点打开的wallet,其他节点若未同步reload,就会出现“同一列数据在不同节点解密结果不一致”的问题,典型表现为ORA-28374: typed master key not found in wallet。
- 轮换前确保所有节点wallet已OPEN且状态一致;轮换后立即在每个节点执行:
ALTER SYSTEM SET ENCRYPTION WALLET RELOAD IDENTIFIED BY "xxx" - 避免在业务高峰期轮换,因为RELOAD期间该节点所有TDE加密列访问会短暂阻塞
- 12.2+建议启用
AUTO_LOGIN_LOCALwallet类型替代AUTO_LOGIN,它允许各节点独立加载wallet但共享主密钥,减少reload依赖 - 验证是否真正同步:在各节点分别查
v$encryption_keys,确认KEY_ID和ACTIVATION_TIME一致
监听器与tnsnames.ora配置错误导致客户端连上节点却打不开wallet
客户端通过SCAN连接时,可能被负载均衡到wallet未OPEN或路径配置错误的节点,报错ORA-28365,但DBA在该节点手动连却正常——本质是tnsnames.ora里ADDRESS没指向正确的VIP或监听配置缺失wallet路径。
- 每个节点的
listener.ora中,ENCRYPTION_WALLET_LOCATION必须显式声明,例如:ENCRYPTION_WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = +DATA/WALLET/))) - tnsnames.ora中服务名条目要包含
SERVER = DEDICATED,避免共享服务器模式下wallet上下文丢失 - 监听器重启后必须验证:
lsnrctl status输出里应显示Encryption Wallet Location字段,且路径可访问
事情说清了就结束。最常被忽略的是:wallet路径在sqlnet.ora、listener.ora、orapki命令、以及srvctl配置里四者必须严格一致,差一个字符都会导致某节点静默失效。










