Oracle架构设计:具有I / O开销的单独架构?

时间:2010-04-27 09:37:18

标签: oracle database-design oracle11g schema-design

我们正在为基于Oracle 11gR1的新系统设计数据库架构。我们已经确定了一个主模式,它将有近100个表,这些表将从前端Java应用程序访问。

我们要求审核近50个表中已更改的值,这必须在每一行进行。

这意味着,对于MYSYS.T1中的单行,MYSYS_AUDIT.T1_AUD表中可能有50行(或更多甚至更少,但最少1行)。我们可能会使用T1中的每个列条目和新值的旧值。

DBA给出了一个观察,建议反对这种方法,因为他说,单独的模式意味着每个操作的额外I / O 。基本上,AUDIT模式仅用于进行一些分析并输入值(因此SELECTINSERT)。

“单独的架构意味着额外的I / O”是真的吗?我找不到理由。

对我来说这似乎是合乎逻辑的,因为AUDIT数据不应该被篡改,所以单独的架构。

此外,我们设计了一个单独的架构,用于归档MYSYS中的一些表。从MYSYS_ARC开始,表可能会备份到磁带中或在足够的时间后删除。

很少有统计数据:
MYSYS模式中很少有表(接近20,30)可以增长到大约50M行。
我们要求总磁盘空间为4 TB。
MYSYS_AUDIT架构可能是MYSYS的10倍,但我们不会超过3个月。
MYSYS中的少数表将具有以下事务/分钟。

  • INSERT中的MYSYS意味着MYSYS_AUDIT表中的插入次数相同。
  • UPDATE表中的MYSYS表示MYSYS_ADIT表中的插入次数相同。

问题:
鉴于所有这些,你能否建议我做出任何改进?

  1. 单独的架构会影响光盘I / O吗? (每个模式一个额外的I / O?)
  2. 任何一般性建议?
  3. 图:

    +-------------------+          +-------------------+
    |       MYSYS       |          |     MYSYS_AUDIT   |
    |                   |          |                   |
    |    1. T1          |          |     1. T1_AUD     |
    |    2. T2          |          |     2. T2_AUD     |
    |    3. T3          |--------->|     3. T3_AUD     |
    |    4. T4          |(SELECT,  |     4. T4_AUD     |
    |     .             | INSERT)  |      .            |
    |     .             |          |      .            |
    |     .             |          |      .            |
    |  100. T100        |          |    50. T50_AUD    |
    +-------------------+          +-------------------+
            |
            |
            |
            |
            |(INSERT)
            |
            |
            |
            *
    +-------------------+
    |   MYSYS_ARC       |
    |                   |
    |    1. T1_ARC      |
    |    2. T2_ARC      |
    |    3. T3_ARC      |
    |    4. T4_ARC      |
    |     .             |
    |     .             |
    |     .             |
    |  100. T100_ARC    |
    +-------------------+
    

    除此之外,我们还有两个只有只读权限的模式,但主要是出于特殊目的,我们不介意它们的性能。

    建议:
    有几个建议。我们同意以下内容。

    1. 逻辑分离的模式。
    2. TRIGGER用于将数据插入AUDIT表。
    3. 表名称后缀不会为_AUD。 :)
    4. 填充ARCHIVE架构表的过程。
    5. 基于时间间隔的分区。
    6. 我们正在分析......

      1. 工作区管理员选项。
      2. 在接受APC或dpbradely解决方案之前,仍有待进一步提出建议的问题。

5 个答案:

答案 0 :(得分:3)

将对象放在单独的模式中不会导致额外的I / O - 可能存在误解,DBA的意思是说审计的存在会导致额外的I / O,这当然是真的无论你如何实现它。

答案 1 :(得分:3)

拥有单独的架构绝对是可行的方法。除了其他任何内容,这意味着您可以使用相同的表名 - MYSYS.T1MYSYS_AUDIT.T1 - 如果您有长名称的表(> 25个字符),这将非常有用。

但是,单独模式的主要优点是审计表可以防止意外或恶作剧的篡改。

从触发器插入审计行的影响仍然存在,无论谁拥有表。

一般表格设计建议

最好为审计表提供与主表相同的结构。因此,如果您有审计所需的元数据列(例如修订号),请将它们包含在主表中。此外,使用新值填充审计表,而不是旧值。也就是说,当将新记录插入MYSYS.T1时,将匹配的记录插入MYSYS_AUDIT.T1;当现有记录更新为MYSYS.T1时,将新记录插入MYSYS_AUDIT.T1。如果审计表的最新记录与主表中的当前记录相同,则更容易验证和报告审计表。

使用触发器

审计不需要复杂。我们所需要的只是before insert or update or delete trigger中的插入语句。这些很容易从数据字典视图USER_TAB_COLUMNS生成。

答案 2 :(得分:1)

查看审计数据的范围分区。您可能希望将审计数据发送到较便宜的存储。分区使得将数据(例如一个月的数据)发送到另一台服务器变得容易。或删除超过一个月的自动记录。

http://www.orafaq.com/wiki/Interval_partitioning

答案 3 :(得分:1)

除了APC的回答。

可以查看Workspace Manager,可能比触发更好,因为它们可能会失败或被禁用等。

答案 4 :(得分:1)

此外,如果您有钱,请查看Oracle的Total Recall