我有一些归档日志文件,我想将它们导入 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
等。
这种方法的问题是,当多个事件在同一秒内发生时(时间戳只有秒级精度),因为它们在不同的表中,我无法知道它们发生的实际顺序。
我的下一个想法是使用一个表,主键保留顺序,但这很快就会失去对所有事件类型的控制。 (不止这些。)
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)
);
我觉得有更好的方法来实现这一目标。
总而言之,我的目标是让数据可查询,同时保留每个事件在日志文件中发生的顺序。我该怎么办?
最佳答案
一种可能的解决方案:为每一行使用两个表:一个用于存储所有事件共有的列,例如序列号(AUTO_INCREMENT
列)和时间戳,另一个用于特定于事件提供其他详细信息。可以先insert到公用表,然后用公用表生成的ID作为其他表的唯一外键。
但也请记住,NULL
值通常只占用一位数据,因此具有许多仅某些事件类型需要的列的单个表可能是更好的解决方案。这取决于您的查询:如果您通常按顺序查询所有类型的事件,那么单个表会更好,而提取给定类型的特定事件可能更适合使用不同的表。
type INT, // 1 = failed_login, 2 = command, ...
对于这种列,您最好使用 enum
。
关于mysql - 跨多个表保留插入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064076/