0

我有七个 1G MySQL binlog 文件,我必须使用它们来检索一些“丢失”的信息。我只需要从日志中获取某些 INSERT 语句(例如,语句以“INSERT INTO table SET field1 =”开头)。如果我只运行一个 mysqlbinlog(即使每个数据库并使用 --short-form),我会得到一个数百兆字节的文本文件,这使得几乎不可能使用任何其他程序进行解析。

有没有办法从日志中检索某些 sql 语句?我不需要任何辅助信息(时间戳、自动增量 #s 等)。我只需要与某个字符串匹配的 sql 语句列表。理想情况下,我希望有一个仅列出这些 sql 语句的文本文件,例如:

INSERT INTO table SET field1='a';
INSERT INTO table SET field1='tommy';
INSERT INTO table SET field1='2';

我可以通过将 mysqlbinlog 运行到文本文件然后根据字符串解析结果来获得它,但是文本文件太大了。它只会使我运行的任何脚本超时,甚至无法在文本编辑器中打开。

提前感谢您的帮助。

4

1 回答 1

2

我从来没有收到答案,但我会告诉你我做了什么。1. 将 mysqlbinlog 运行到文本文件 2. 创建一个 PHP 脚本,使用 fgets 读取日志的每一行 3. 在循环每一行时,脚本使用 stristr 函数对其进行解析 4. 如果该行与我正在查找的字符串匹配因为,它将行记录到文件中

运行 mysqlbinlog 和 PHP 脚本需要一段时间,但它不再超时。我最初在 PHP 中使用 fread,但它会将整个文件读入内存并导致脚本在大型 (1G) 日志文件上崩溃。现在,它需要几分钟才能运行(我还将 max_execution_time 变量设置为更大),但它的工作原理就像一个魅力。fgets 一次获取一行,因此它几乎不会占用太多内存。

于 2010-06-16T02:15:29.417 回答