我有七个 1G MySQL binlog 文件,我必须使用它们来检索一些“丢失”的信息。我只需要从日志中获取某些 INSERT 语句(例如,该语句以“INSERT INTO table SET field1=”开头)。如果我只运行 mysqlbinlog(即使每个数据库并使用 --short-form),我会得到一个数百兆字节的文本文件,这使得几乎不可能用任何其他程序进行解析。
有没有办法从日志中检索某些sql语句?我不需要任何辅助信息(时间戳、自动增量#等)。我只需要一个与某个字符串匹配的 sql 语句列表。理想情况下,我想要一个仅列出这些 sql 语句的文本文件,例如:
INSERT INTO table SET field1='a';
INSERT INTO table SET field1='tommy';
INSERT INTO table SET field1='2';
我可以通过将 mysqlbinlog 运行到一个文本文件,然后根据字符串解析结果来实现这一点,但文本文件太大了。它只会使我运行的任何脚本超时,甚至使其无法在文本编辑器中打开。
感谢您提前提供的帮助。
最佳答案
我从未收到过答复,但我会告诉你我是如何度过的。 1. 将 mysqlbinlog 运行到文本文件 2. 创建一个 PHP 脚本,使用 fgets 读取日志的每一行 3. 在循环每一行时,脚本使用 stristr 函数对其进行解析 4. 如果该行与我正在查找的字符串匹配,则会将该行记录到文件中
运行 mysqlbinlog 和 PHP 脚本需要一段时间,但不再超时。我最初在 PHP 中使用 fread,但这会将整个文件读入内存并导致脚本在大型 (1G) 日志文件上崩溃。现在,运行需要几分钟(我还将 max_execution_time 变量设置得更大),但它的工作方式就像一个魅力。 fgets 一次获取一行,因此它不会占用那么多内存。
关于MySQL BinLog语句检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032486/