【问题标题】:CRUD Application LoggingCRUD 应用程序日志记录
【发布时间】:2014-10-01 05:04:55
【问题描述】:

我正在尝试彻底检查我的 CRUD 应用程序的日志记录架构。它是一个带有 SQL Server 2008 R2 后端的 .NET Winforms 应用程序。

在当前设置中,只要用户按下“保存按钮”,就会调用数据库日志。变更集是使用 .NET 对表示我们存储在 SQL 中的表的类的反射来确定的。

日志存储在两个名为 ActionLogHeader 和 ActionLogDetail 的表中。

标头架构:

ActionLogHeader_id | TableName | PrimaryKey | ActionType | User | ActionDate

详细架构:

ActionLogDetail_id | ActionLogHeader_id | ColumnChanged | PreValue | PostValue

单个标头可以有多个详细信息。每个详细信息行代表表中更改的单个列。 ActionType 是插入/更新/删除/查看。

这通常适用于向用户显示我们数据库中任何一件事发生的更改列表。但是很难从中提取数据来创建一个完整的图片,了解任何时候某物的样子。对特定数据点的这些数据进行聚合是很困难的。

我们已经探索过将这些数据从 SQL Server 转移到 Hadoop/HBase 中,但我觉得我们所做的只是在不改变结构的情况下转移数据。我们已经展平了表并添加了更多列,因此从 SQL 获取数据不会成为问题。但是对数据进行任何类型的分析仍然需要一个 MapReduce 工作,这很难设置。

所以我对其他人在记录日志方面所做的事情很感兴趣。有更好的策略吗?我已经看到很多人喜欢在数据库级别使用触发器来记录更改,但我不知道这会如何影响性能。我不知道从这里去哪里。

【问题讨论】:

  • 有时我们只是将“post”对象序列化为 JSON/XML,为其提供一些元数据,然后将单个条目转储到表中。如果您想知道发生了什么变化,您可以拉出当前行和之前的行,并对序列化数据进行比较,然后将其显示给用户。
  • 我不喜欢您所描述的 EAV 风格的日志记录,因为您正遇到这种情况。创建表的时间点视图几乎是不可能的。触发器是一种选择,但它会变得非常麻烦,因为您必须向每个表添加触发器。这也增加了对新表等的系统测试。当然,如果触发器写得不好,它们会对性能产生重大影响。另一种选择是 CDC(更改数据捕获)。这不是猫的叫声,因为这里也有一些限制,但可能值得探索。
  • @Cory 你是在建议把整行都扔到某个地方?有点像快照?

标签: .net sql-server logging hadoop


【解决方案1】:

看看 Change Data Capture Microsoft CDC docs" 看看您是否可以使用它而不是自己滚动。还有一个article that covers the basics of CDC 作为概述很有用。当然,不管你怎么做都会有开销。

如果您尝试仅记录来自应用程序的内容,您的方法会更可取。

有些人还使用使用事务日志 (.ldf) 进行数据库更改审计的 3-rd 方工具。

添加

记住这篇文章,回复 CDC performance. 如果 MS 是可以信任的,那么性能应该比大多数推出自己的解决方案更好。当然,要证明这一点,您必须自己动手并进行比较。文章的关键段落:

变更数据捕获可以通过异步读取源数据库的事务日志来捕获源系统中的变更。为此,变更数据捕获使用事务复制中使用的相同日志读取器。由于变更数据捕获适用于现有表模式,因此无需更改源数据库或应用程序即可启用变更数据捕获。由于日志读取器作业是异步工作的,因此 DML 事务受到的影响远小于触发器等同步解决方案。对源表的所有更改都记录在特殊的更改表中,因此不需要在源系统和目标系统之间进行更改比较。

添加

其他选择。

好吧,您可以编写触发器等,如您提到的以捕获所有数据更改,降低服务器速度,调试问题等。您可以使用分析日志的 3rd 方 tranlog 分析器 (Apex),您可以继续沿着当前的路径打开漏洞,或者您可以升级到企业版。没有任何东西可以在没有成本和/或努力的情况下神奇地使一切变得美好。

还有其他有效的方法。

查看之前对类似问题的回答

creating-audit-triggers-in-sql-server

best-way-to-implement-an-audit-trail-in-sql-server

【讨论】:

  • 我也需要在数据库级别记录内容。这是我们登录中的一个巨大漏洞,即未在应用程序中完成的大规模更新永远不会被记录。
  • CDC 将记录所有数据更改,如果您正在更改架构,则需要做更多工作才能使 CDC 正常工作。
  • CDC 仅在企业版 SQL Server 中可用。我们在标准。有其他选择吗?
  • 我知道 Enterprise 有点咸——添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2017-06-27
  • 2011-03-19
相关资源
最近更新 更多