oracle - 百个Oracle实例合并为一个实例的智慧

标签 oracle multiple-instances database-restore

我们的应用程序运行在网络上,主要是一个查询工具,做一些交易。我们托管 Oracle 数据库。该应用程序始终为每个客户提供不同的 Oracle 实例。客户是向我们付款以向公司员工提供服务的公司,通常每位客户有 10,000-25,000 名员工。我们打算有几百个客户。我们每隔几年发布一个主要版本,迁移到新版本具有挑战性:我们可能在客户现场有一个团队几周,解释新功能并设置驱动数据以适合该客户。
我们正在考虑采用多客户端,将我们的所有客户置于一个大型 Windows Server 2008 服务器上的单个共享 Oracle 11g 实例中——以降低成本。我想知道这是否可取。
为每个客户拥有单独的实例有一些优势。 请告诉我这些是不是假的。在我对降低重要性的粗略猜测中:

  • 当对架构进行重大更改时,我们的客户 MyCorp 和 YourCo 可以分别迁移。 (使用多客户端,我们将在一夜之间迁移 300 多个客户!?!)
  • MyCorp 的数据可以轻松备份和 (!!!) 恢复,而不会影响其他客户。
  • MyCorp 的数据与其竞争对手 YourCo 的数据安全分离,无需依赖于开发人员获得正确的代码和/或 DBA 获得正确的配置。
  • 多个实例的风险较低,因为一个客户的灾难(有人不小心将每个人的工资翻了一番,错误是在发薪日后发现的)不会影响其他客户。一场影响到我们所有客户的灾难(哎呀,新 DBA,突然间每个参与者都拥有相同的 SSN!?!)可能会使我们的公司陷入困境。
  • 在一台服务器上拥有一个实例会导致单点故障,如果飓风将建筑物吹倒,我们的整个客户群都会停业。多台服务器上的多个实例允许地理分散:没有灾难会影响我们很大比例的客户,其他地区未受影响的服务器可以承担故障服务器的负载。
  • 性能更好,因为数据库更小(约 50 个表中的 10,000 行与 2,000,000 行)。
  • 如果 MyCorp 的办公室(大部分)只在一个地区,那么 MyCorp 的实例可以在地理上共处一地,因此网络延迟不会影响性能。出于同样的原因,我们可以为全局客户提供更好的服务。
  • 在 MyCorp 想要在内部使用他们的数据库,然后我们可以轻松导出他们的实例,以获取 MyCorp 的数据。
  • 负载平衡更容易,因为实例可以放置在不同的服务器上(这是一个网络农场)。
  • 当需要 DEV 或 QA 实例时,克隆真实实例并匿名化数据会更容易,因为数据要少得多。
  • 由于它们足够小,开发人员可以在本地运行自己的实例,因此他们可以在机场等待和飞行时处理代码,而无需与 VPN 作斗争。

  • Q1: What are other advantages of separate instances?


    我们正在考虑更改数据库架构并将所有客户合并到一个 Oracle 实例中,在一台大型服务器上运行。
    以下是多客户端实例方法的优点,首先是最重要的(我的 WAG)。 如果这些是假的,请狙击:
  • DBA 的工作更少,因为他们只需要维护一个实例而不是数百个实例。更少的 DBA 工作转化为更便宜,这是我们进行此更改的主要动机。
  • 只需一个实例,DBA 就可以更好地优化性能。他们将有时间添加适当的索引并检查我们的 SQL。
  • 开发人员可以更轻松地调试和增强应用程序,因为只有一个架构和一个应用程序(如果有数百个实例,可能会有几十个架构版本,每个架构版本都有不同版本的应用程序) )。这也降低了成本。另一种方法是开始每个调试 session 时 (1) 该客户运行的是哪个版本,以及 (2) 让我们努力重新创建相应的开发环境、代码和数据库。 (我们需要一个包含每个补丁和版本的代码和数据库实例的虚拟机!)
  • 许可 Oracle 更便宜,因为它是按服务器定价的,而不考虑重量(或其他东西——我对这个主题一无所知)。
  • 数据库成为 Web session 数据的可行持久存储,因为只有一个实例。
  • 使用一个多客户端实例可以更轻松地执行某些数据库操作,例如当参与者对他们(或他们的配偶,也许)为哪个客户工作感到模糊时找到他们:所有名称都在一张表中。跨客户报告非常简单。

  • Q2: What are other advantages of having multiple clients in one instance?

    Q3: Which approach do you think is better (why)? Instance per customer, or all customers in one instance?


    我担心拥有一个多客户端实例会使迁移几乎不可能,这是一个交易杀手......
    ...除非有一个折衷的解决方案,比如拥有两个多客户端实例,旧的和新的。在这种情况下,我们会设计跨实例解决方案来寻找参与者、报告等,这样客户就可以从一个多客户端实例转到下一个,而不会出现任何中断。

    最佳答案

    除非您使用 Oracle XE(有限免费版),每台服务器一个数据库会很快变得非常昂贵,即使您购买的是单核、单 CPU 盒。每个服务器拥有多个数据库是低效的,因为每个数据库都会产生 CPU 和 RAM 使用的开销。调整更困难,因为争用更难诊断。

    因此,除了更易于管理之外,单个大型服务器应该比许多离散的小型服务器便宜(没有保证,没有退款!)。确保购买最大、最快的芯片以及尽可能多的可用插槽。这些东西可以在不影响许可成本的情况下为您提供更好的性能。

    如果您负担得起,请考虑分区选项。这将解决您对备份和恢复的担忧,因为每个分区都可以有自己的表空间。因此(根据 client_id 进行分区)可以在不影响其他客户端的情况下备份或恢复单个客户端的数据。我们甚至可以导出和导入单个分区。我对 David 的观察感到惊讶,即分区修剪不适用于 VPD。但我还没有尝试过这种组合,所以我会相信他的话。

    您可能会因整合而失去的一件事是在不同版本的应用程序上支持不同客户端的能力。然而,这不一定是坏事。正如您所观察到的,如果您放弃应用程序的个性化版本,维护数百个客户会容易得多。如果您确实需要提供一些定制功能——即使您只是想对单个客户端的某些功能进行 Beta 测试——那么请查看 Edition-Based Redefinition in 11gR2 : 这是一个非常漂亮的功能。此外,它适用于所有 Oracle 许可证,而不仅仅是 Enterprise。

    关于oracle - 百个Oracle实例合并为一个实例的智慧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405658/

    相关文章:

    sql - 如何在oracle中将sysdate转换为UTC时间

    sql - 是否可以将条件放入oracle中的count函数中?

    java - 在包含插入和更新查询(语句)的 Java 批处理中调用 Oracle 过程

    hadoop - 在同一台机器上运行多个 hadoop 实例

    azure - 将本地 SSAS 数据库还原到 Azure

    IN 子句中的 mysql 条件

    Xpath检查多个空 child

    tomcat - 在服务器上设置多个 Cognos 实例

    MySQL:使用公共(public) ibdata 文件恢复 1 个 InnoDB 表

    couchbase - 如何将 couchbase 恢复到备份状态?