如何在Sql Server中存储Web服务器日志的'n'天?


18

为了更快地进行报告和性能分析,我们希望将Web服务器日志插入Sql Server。这将使我们能够实时查看流量模式,问题和速度下降。

我们有一个守护程序,用于侦听来自负载均衡器的请求/响应事件,并将批量插入数据库。

但是,我们每天可获得大约1 GB的日志,而我们只需要保留大约一周的时间(至少以这种原始形式)。

存储此数据的最佳方法是什么,删除旧条目的最佳方法是什么?

我们已经讨论过将每天的数据存储在自己的表中,例如,Log_2011_04_07将具有当天的所有条目,然后删除最旧的表。可以创建一个视图来涵盖所有的日间表格,以方便查询。可行吗?


是一个非常相似的问题,但对于Oracle而言。语法将有所不同,但这是按日期分区的经典应用。无需重新发明轮子:-)
Gaius

Answers:


17

您应该查看分区。

http://technet.microsoft.com/zh-cn/library/dd578580%28SQL.100%29.aspx

关于分区的最酷的事情是,您只有一个表名(与多表方法相对),因此您的插入语句保持静态。它适用于每个应用程序-对查询完全透明。您不必担心如果最终在每个表上使用不同的索引或统计信息会发生什么。

您创建一个分区函数,该函数决定如何将表拆分为后台的多个表。该函数只能有一个输入参数/字段,在您的情况下,它将是日期字段。该功能可以按日期,星期,月份或年份对表格进行细分-在您的情况下,您希望使用24小时制的日期。

然后构建一个SQL Server代理作业,该作业每天使用T-SQL换出最后一个分区。删除成为元数据操作,并且速度很快。交换分区,然后删除旧的分区。


我要研究一下-是否允许删除单个分区,因此删除可以快速进行?
Jarrod Dixon

3
是的,您应该专门研究“自动滑动窗口分区”概念。您可以在SQLServerCentral上找到一系列不错的文章:part1part2part3
玛丽安

7

6年前,我们开发了一个webstatistic日志记录产品,该产品可让我们跟踪用户访问的每次点击。

我们要做的是记录您每次写的访问,并让计划的守护程序解析日志并标准化数据以供以后查找。解析数据/记录后,便立即将其删除以保持较低的数据结构。

对于该产品的下一版本,我们将在网站上分别分发大容量收集器,然后使用守护程序收集数据,然后通过向大容量服务发出命令来清理数据。

这样,我们可以处理“计划的维护”而不会丢失数据。

关于中央服务器上的清理问题,我们当前的计划是添加“时间戳”,以便能够在例如之后对数据进行存档。3个月。

我们认为这就像3D游戏/渲染中的MIP-MAP纹理一样。您获得的越近,数据越详细,距离越远,“分组”就越详细。

因此,我们可以每天观察访问者的模式,但是三个月后这些数据并没有什么实际意义,因此我们将数据压缩为较少的细节。

我们尚未决定是否将数据库拆分成多个块,以保持“详细程度”分开。数据库。但是我们可能会这样,因为如果我们在同一数据库中存储不同级别的文件,则会存在一些命名问题。

希望您可以将其用于某些东西?我不能为您提供示例代码作为我们公司产品的一部分。


1

用两列创建另一个表Daily_tables:Table_name和Date_table_created。在用于创建新的每日表(加载Web日志)的代码中,添加另一个条目以使用创建的表的名称和时间戳(当前日期时间)填充Daily_tables表。创建一个SQL代理作业,该作业每周运行一次TSQL脚本。TSQL应该从Daily_tables中删除所有表名(Table_name),其Date_table_created时间戳早于7天。

希望这就是您想要的:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.