A verdadeira resposta é usar as opções de linha de comando para mysqlbinlog
mysqlbinlog --start-datetime=datetime --stop-datetime=datetime /path/to/mysql-bin.001036
Eu tenho o log binário do MySQL e preciso gerar um determinado período de tempo em um arquivo separado, como eu faria isso?
aqui está uma amostra do que o arquivo binlog contém:
# 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
Estou procurando o seguinte:
#130120 0:09:17 server id 1 end_log_pos 487 Xid = 79514636
COMMIT/*!*/;
# at 487
Eu tentei pcregrep -M
, mas até agora sem nenhuma sorte, minhas habilidades de regex não estão onde eu pensei, aqui está minha linha real:
# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | pcregrep -M '130120(\n|.*)\ at\ '
#
* UPDATE *
* UPDATE 2 *
isso realmente fez o trabalho ...
# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#
Isso poderia ter sido feito com awk
com muita facilidade.
Por exemplo
mysqlbinlog mysql-bin.001 | awk '($1 == "130120") {print $0}' > results.txt
Isso diz ao awk
para encontrar qualquer coisa na primeira coluna que corresponda a 130120
exatamente e depois imprima toda a linha.
Se você precisasse do minuto e segundo exatamente , você poderia fazer algo como o seguinte:
awk '(($1 == "130120") && ($2 == "0:09:17")) {print $0}'
Se você apenas precisasse do minuto, você poderia usar algo assim:
awk '(($1 == "130120") && ($2 ~ "^0:09:")) {print $0}'
isso fez o trabalho:
# mysqlbinlog /var/lib/mysql/log/logbin/mysql-bin.001036 | sed -e '/130120 13/,/ at /!d' > /tmp/13
#
grep -C 1 COMMIT filename
-C é contexto, 1 linha antes e 1 linha depois
-A é depois
-B é antes
Tags grep logging mysql-replication pcre