4

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

我们需要审核在近 50 个表中更改的值,这必须在每一行中完成。

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

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

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

对我来说这似乎是合乎逻辑的,因为不应篡改 AUDIT 数据,因此是一个单独的模式。

此外,我们设计了一个单独的模式来归档来自MYSYS. 可能会从MYSYS_ARC表中备份到磁带中或在足够的时间后删除。

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

  • 100表示插入表INSERT的次数相同。MYSYSMYSYS_AUDIT
  • UPDATE表中的1000MYSYS表示表中插入的数量相同MYSYS_ADIT

问题:
鉴于所有这些,您能建议我做些改进吗?

  1. 单独的架构会影响磁盘 I/O?(每个模式都有一个额外的 I/O 吗?)
  2. 有什么一般性的建议吗?

数字:

+-------------------+          +-------------------+
|       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. 基于间隔的分区。

我们正在分析...

  1. 工作区管理器选项。

在接受 APC 或 dpbradely 的解决方案之前,该问题仍有待进一步建议。

4

5 回答 5

3

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

于 2010-04-27T10:38:27.130 回答
3

拥有一个单独的模式绝对是要走的路。除此之外,这意味着您可以使用相同的表名 -MYSYS.T1并且MYSYS_AUDIT.T1- 如果您有长名称(> 25 个字符)的表,这将很有帮助。

但是分离模式的主要优点是可以保护审计表免受意外或恶作剧的篡改。

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

一般表设计建议

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

触发器的使用

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

于 2010-04-27T11:00:07.033 回答
1

看看审计数据的范围分区。您可能希望将审计数据发送到成本较低的存储。分区可以轻松地将例如一个月的数据传送到另一台服务器。或删除超过一个月的 autiting 记录。

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

于 2010-04-27T11:17:22.457 回答
1

除了 APC 的回答。

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

于 2010-04-27T11:19:44.597 回答
1

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

于 2010-04-27T23:49:46.033 回答