love wife & love life —Roger 的Oracle技术博客

Phone:18180207355 提供专业Oracle数据恢复、性能优化、迁移升级、紧急救援等服务

Oracle Wallet 实施的一次悲惨经历

本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客

本文链接地址: Oracle Wallet 实施的一次悲惨经历

前几天一个运营商客户被某O记忽悠之后,准备上一个安全解决方案,其目的是为了

能够对rman备份文件进行加密处理。我们这里姑且不论rman 备份就可以进行加密。只讨论这里的wallet 实施方案。

当时的实施步骤如下(主库为4节点rac,dg备库是2节点rac):

1、停主库业务、停adg同步

2、主库创建wallet目录mkdir /u01/app/oracle/admin/crmdbn/wallet

3、配置主库grid用户的sqlnet.ora,添加如下内容:

4、在主库设置安全码

alter system set encryption key identified by “Oracle_xxx”;

5、主库打开wallet

alter system set encryption wallet open identified by “Oracle_xxx”;

这里只在一个主库rac节点1执行了,其他几个节点并未执行;

6、在adg备库创建wallet

mkstore -wrl /u01/app/oracle/admin/crmdbns/wallet -create

7、在dg备库打开wallet

 

然后启动dg的时候,很显然会报错。实际上上述的操作步骤是有问题的;有如下几点操作不对:

1)如果主库是rac,wallet必须存放在共享磁盘上;否则在其中一个节点创建之前,就先将其他节点停掉,避免产生归档日志。

2)当主库rac其中一个节点创建好wallet之后,将wallet目录中的key scp拷贝到rac的其他节点对应wallet目录中。

当然,如果wallet存在共享磁盘上,也不需要这么麻烦了。

3)在dataguard备库上创建wallet根本就不需要操作,只需要创建对应的wallet目录(如果备库是rac,一样建议是共享目录来存放),然后将主库wallet master key 通过scp拷贝到备库wallet目录中(建议提前配置好备库监听的sqlnet.ora文件)。

4)备库启动wallet即可;另外对于wallet的创建,建议使用auto login 方式(直接创建wallet目录,并通过alter database 命令open wallet的方式,这并非自动打开wallet模式)。建议通过如下命令进行修改,将其修改为auto login方式(当然也可以使用owm图形界面来进行管理)

orapki wallet create -wallet /u01/app/oracle/admin/crmdbns/wallet -auto_login

 

由于最开始的方案有问题,导致后面adg无法同步,启动mrp进程就报错,如下是错误:

我们可以看出,Oracle 在启动mrp进程时提示在备库的wallet中找不到对应的master key。在开始我并不明白,及时最开始mkstore 的操作是多余的,那么将主库的key文件scp到备库之后,不就完全一样了吗?为什么会提示找不到key呢?

而且我通过如下的方式对比了主库和备库的wallet内容信息,发现是匹配的,如下:

由此可见,上述这个报错应该另有隐情。我们需要进一步研究分析Oracle wallet打开之后,会做哪些事情。

我们不难看出,当wallet打开之后,Oracle其实会产生2种key,一种是db的key一种是talespace 级别的key。如下是关于2个x$试图的说明:

x$kcbtek – for tablespaces
x$kcbdbk – the controlfile holds a copy of the master key ID as well.

这2个试图的信息其实都来源于控制文件,这一点我通过10046 trace跟踪可以进行确认,如下是跟踪的结果:

换句话讲,Oracle这里判断key是否匹配只是通过controlfile来判断的。

在其中进行恢复的过程中,进行了多次增量,我们可以基于scn进行全库级别或者文件级别的增量,如下:

最后我们通过替换了system文件和重建standby controlfile来完美解决这个问题,如下:

    分享到:
18180207355
加Q咨询