在我的办公室,我们有一个遗留的会计系统,它将所有数据存储在具有固定宽度记录的纯文本文件(TXT 扩展名)中。每个数据文件都被命名为例如 FILESALE.TXT。我的目标是将这些数据带入我们的 MySQL 服务器,以供许多其他无法与旧版软件交互的程序只读使用。每个文件本质上是一个表。
我总共需要访问大约 20 个文件,大约 1gb 的总数据。每行可能有 350-400 个字符宽并且有 30-40 列。拉入数据后,没有一个 MySQL 表比 100mb 大得多。
遗留会计系统可以修改文本文件中的任何行,删除旧行(它有一个已删除的记录标记——0x7F),并随时添加新行。
几年来,我每 5 分钟运行一次 cron 作业:
- 检查每个数据文件的最后修改时间。
- 如果文件没有被修改,跳过它。否则:
- 解析数据文件,清理所有问题(仅非常简单的检查),然后输出我需要的列的制表符分隔文件(我只是忽略了一些列)。
截断表并将新数据导入我们的 MySQL 服务器,如下所示:
START TRANSACTION; TRUNCATE legacy_sales; LOAD DATA INFILE '/tmp/filesale.data' INTO TABLE legacy_sales; COMMIT;
cron 脚本并行运行每个文件检查和解析,因此整个更新过程并不需要很长时间。最大的表(不经常更改)需要大约 30 秒来更新,但大多数表需要不到 5 秒的时间。
这一直工作正常,但存在一些问题。我猜它会混淆数据库缓存,所以每次我必须 TRUNCATE 和 LOAD 一个表时,其他使用 MySQL 数据库的程序一开始很慢。此外,当我切换到并行运行更新时,数据库可能会在几秒钟内处于稍微不一致的状态。
这整个过程似乎效率低下!有没有更好的方法来解决这个问题?关于可能值得研究的优化或程序的任何想法?遇到类似情况的人有什么巧妙的技巧吗?
谢谢!