从 MySql binlog 中查找多行

从 MySql binlog 中查找多行

我有来自 MySQL 的 binlog,我需要将特定时间范围输出到单独的文件中,我该怎么做?

以下是 binlog 文件内容的示例:

# at 460
#130120  0:09:17 server id 1  end_log_pos 487   Xid = 79514636
COMMIT/*!*/;
# at 487
#130120  0:09:17 server id 1  end_log_pos 560   Query   thread_id=248447    exec_time=0 error_code=0

我正在寻找以下内容:

#130120  0:09:17 server id 1  end_log_pos 487   Xid = 79514636
COMMIT/*!*/;
# at 487

我已经尝试过了pcregrep -M,但是到目前为止还没有任何运气,我的正则表达式技能并不像我想象的那样,这是我的实际行:

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | pcregrep -M '130120(\n|.*)\ at\ '
# 

* 更新 *

  • 不同查询之间的行数有所不同。

*更新2*

这确实起到了作用...

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#

答案1

真正的答案是使用命令行选项来mysqlbinlog

mysqlbinlog --start-datetime=datetime --stop-datetime=datetime /path/to/mysql-bin.001036

答案2

这本来可以很容易地完成awk

例如

mysqlbinlog mysql-bin.001 | awk '($1 == "130120") {print $0}' > results.txt

这表示awk在第一列中找到匹配的内容 130120 确切地然后打印整行。

如果你需要一分钟第二确切地,然后您可以执行以下操作:

awk '(($1 == "130120") && ($2 == "0:09:17")) {print $0}'

如果你只是需要一分钟,你可以使用如下方法:

awk '(($1 == "130120") && ($2 ~ "^0:09:")) {print $0}'

答案3

这完成了工作:

# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#

答案4

grep -C 1 COMMIT filename

-C 是上下文,前 1 行,后 1 行

-A 在之后

-B 之前

相关内容