分类: Oracle
2008-04-23 11:31:39
首先,我要提供一个对Oracle Portal 的快速介绍,以帮助你了解我们的情况。这个Portal实际上是连接到一个J2EE容器(Oracle Container for Java,OC4J)和一个Oracle数据库来保存元数据库的Apache服务器。这个库是一个schemas集合,其中存储着页面和文档形式的Portal内容。
而Portal的用户验证和一些内部配置是由一个叫做Oracle Internet Directory(OID)的系统来完成的,这又增加了这个问题的复杂度。这个系统是一个LDAP服务器,但是(令人惊奇的),你不能使用一个标准的LDAP,因为这个Portal系统的一些部分依靠这个LDAP的内部执行而不是依靠于纯粹的LDAP接口。而且,这个执行恰好是另一个Oracle数据库的schema。
所以这就是我们遇到的情况:我们分别用于测试和产品portal的元数据库都运行在同一个物理硬件服务器上。(我知道这样不好,但是我沿用了这个架构——显然他们想尽可能减少构建这个Portal的费用。)我们的Portal不断扩展,并且支持的用户数量在不断的增加。上个星期,它开始整个崩塌:我们的服务器因为在同一个硬件上运行两个数据库而开始变得歇斯底里。我们的数据库管理员最终将产品稳定下来(通过从Oracle技术支持获得的一些帮助),但是我们不能再冒险让测试元数据库运行在同一台机器上,所以我们必须要将它快速地转移到一个新的服务器上。
我们仍然保留原来的测试元数据库,只是数据库软件被卸载了。我们的计划是拷贝数据文件并在新的硬件上生成一个新的Oracle实例。我们认为将Portal的中间层(Apache和J2EE和PL/SQL组件)重新配置指向新的数据库是非常容易的。
这是Oracle技术支持所不能帮助我们的。因为我们不能在文档中找到任何关于这个确切情形的描述,我们向技术支持部门请求给予一些建议。当然,他们也指出了我们要进行这个迁移到一个新的元数据服务器的巨大而可怕的过程。
我觉得它不可能是这么麻烦且有这么多步骤,所以我在Portal的管理界面中寻找。结果发现有一个地方是你可以选择它从哪个元数据库来进行加载的。
起初,我不能指出Portal是在哪里列出元数据库的。在一个Oracle 系统上,通常有一个tnsnames.ora 文件将用户友好的名称像“Test”和“Production”匹配到物理连接字符串。我们的Portal 中间层没有将这些列在它的tnsnames.ora 文件中。
我意识到这一定是它从OID获得的一部分,所以,我登陆到我们的OID服务器上运行Oracle Directory Manager (ODM),它是管理存储在OID中LDAP目录的管理界面。
在ODM中,打开“进入管理”节点,然后打开“Oracle上下文”节点。你应该看到你使用OID注册的所有元数据库的一个列表。选一个你想编辑的(在我们的例子中,是“测试”)。其中一个属性是orclnetdescstring :它正是你通常在tnsnames.ora 文件中所具有的登入种类。检查这个文本直到你看到HOST=old_test_server,并用你新的测试服务器主机名替代old_test_server主机名。
打开“测试”节点并进入它的子节点。找到子节点DESCRIPTION_0 -- > ADDRESS_LIST_0 -- > ADDRESS_0,你会看到一个orclnetaddressstring 属性。用你旧数据库的新拷贝替换HOST=进入。
保存这个进入就可以了。你可能需要重启OID服务(尽管我不确定我们为什么要做这一步)。现在重启中间层,它应该采用新的LDAP登入并在新的元数据库中记录日志,就好像什么都没发生一样。