2

我有一些归档日志文件,我想将它们导入 MySQL 数据库,用于归档和查询功能。

这些日志文件中的每一行都代表一种特定类型的事件。为了说明这一点,这里有一个示例,每一行都是不同的事件类型:

2013-01-15 03:30:08 - Failed login attempt for user 'helloworld' by 1.2.3.4
2013-01-15 03:30:08 - User 'helloworld' successfully logged in from 1.2.3.4
2013-01-15 03:30:08 - User 'helloworld' issued command 'randomcommand'

请注意时间戳,因为这与问题相关。

我最初的想法是为每个事件创建一个表 - failed_loginssuccessful_loginscommands等。

这种方法的问题是,当多个事件在同一秒内发生时(时间戳只有秒级精度),因为它们位于不同的表中,我无法知道它们发生的实际顺序。

我的下一个想法是使用一个表,主键保留顺序,但这很快就会与所有事件类型失控。(还有更多。)

CREATE TABLE log_lines (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    type INT, // 1 = failed_login, 2 = command, ...
    failed_logins_user VARCHAR(32),
    failed_logins_ip VARCHAR(15),
    commands_user VARCHAR(32),
    commands_command VARCHAR(128)
);

我觉得有更好的方法来实现这一点。

总而言之,我的目标是让数据可查询,同时保留每个事件在日志文件中发生的顺序。我该怎么办?

4

1 回答 1

0

一种可能的解决方案:每行使用两个表:一个存储所有事件共有的列,如序列号(一AUTO_INCREMENT列)和时间戳,一个特定于事件以提供其他详细信息。您可以先插入到公用表中,然后将那里生成的 ID 用作其他表中的唯一外键。

但也请记住,NULL值通常只占用一位数据,因此具有许多仅用于某些事件类型的列的单个表可能是更好的解决方案。这取决于您的查询:如果您通常按顺序查询所有类型的事件,则单个表会更好,而提取给定类型的特定事件可能更适合使用不同的表。

type INT, // 1 = failed_login, 2 = command, ...

enum对于这种列,您可能会更好。

于 2013-02-25T12:32:15.187 回答