我有一些归档日志文件,我想将其导入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_logins
,successful_logins
,commands
等。
这种方法的问题是,当多个事件在同一秒内发生时(时间戳只有二级精度),因为它们在不同的表中,我无法知道它们发生的实际顺序。 / p>
我的下一个想法是使用一个表,主键保留顺序,但这很快会与所有事件类型失控。 (还有更多。)
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)
);
我觉得有更好的方法来实现这一目标。
总结一下,我的目标是让数据可查询,同时保留日志文件中每个事件发生的顺序。我应该怎么做呢?
答案 0 :(得分:0)
一种可能的解决方案:为每一行使用两个表:一个用于存储所有事件共有的列,如序列号(AUTO_INCREMENT
列)和时间戳,以及一个特定事件给出其他详情。您可以先插入公用表,然后将其中生成的ID用作其他表中的唯一外键。
但是还要记住,NULL
值通常只占用一位数据,因此只有一些事件类型需要的具有多列的单个表可能是更好的解决方案。这取决于您的查询:如果您通常按顺序查询所有类型的事件,则单个表会更好,而提取给定类型的特定事件可能更适合使用不同的表。
type INT, // 1 = failed_login, 2 = command, ...
对于这种列,您可能最好使用enum
。