跟踪MySQL变更历史的简单方法?

时间:2013-12-23 10:35:34

标签: mysql sql logging redis backup

我想在MySQL数据库中记录所有更改(插入/更新/删除)。

我可能还希望这条记录易于执行,即如果我选择执行所有录制的语句,它可以用作某种备份工具。

我的理解是,MySQL的日志格式可能包含不必要的东西,我需要额外的处理才能使语句批量执行。

创建一个简单的文本文件并将SQL语句写入它是一个好主意吗?或者MySQL中是否有一些本机功能已经支持这个功能?或者这是我可以利用其他软件如redis创建更有效的解决方案的方式吗?

2 个答案:

答案 0 :(得分:1)

  

“我的理解是,MySQL的日志格式可能包含不必要的东西,我需要额外的处理才能使语句批量执行。”

当你谈论MySQL General Log时,这是有道理的。

使用MySQL Bin Log,您无需转换日志格式。

首先查看binlog_format

有3种binlog_formathttp://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html

使用基于STATEMENT的binlog,您可以获取

的INSERT / DELETE / UPDATE / etc语句
mysql> SHOW VARIABLES LIKE 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

使用mysqlbinlog

获取GET UPDATE语句

使用mysqlbinlog和mysql二进制日志文件,您可以按如下方式获取更新语句:

$ mysqlbinlog mysql-bin.000002
# at 2112
#131223 19:48:48 server id 1  end_log_pos 2233  Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1387795728/*!*/;
DELETE ... /* generated by server */
/*!*/;
# at 2233
#131223 19:48:48 server id 1  end_log_pos 2352  Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1387795728/*!*/;
INSERT .... /j* generated by server */
/*!*/;
# at 2352
#131223 19:48:48 server id 1  end_log_pos 2468  Query   thread_id=1     exec_time=0     error_code=0
SET TIMESTAMP=1387795728/*!*/;
DROP  /* generated by server */
myqlbinlog的

选项

以下是一些与如何获取某个日期(或位置)日志有关的选项

  --start-datetime=name
                      Start reading the binlog at first event having a datetime
                      equal or posterior to the argument; the argument must be
                      a date and time in the local time zone, in any format
                      accepted by the MySQL server for DATETIME and TIMESTAMP
                      types, for example: 2004-12-25 11:25:56 (you should
                      probably use quotes for your shell to set it properly).
  -j, --start-position=#
                      Start reading the binlog at position N. Applies to the
                      first binlog passed on the command line.
  --stop-datetime=name
                      Stop reading the binlog at first event having a datetime
                      equal or posterior to the argument; the argument must be
                      a date and time in the local time zone, in any format
                      accepted by the MySQL server for DATETIME and TIMESTAMP
                      types, for example: 2004-12-25 11:25:56 (you should
                      probably use quotes for your shell to set it properly).
  --stop-position=#   Stop reading the binlog at position N. Applies to the
                      last binlog passed on the command line.

答案 1 :(得分:0)

您可以尝试使用maxwell守护程序(https://github.com/zendesk/maxwell),它可以有效地查看binlog并以JSON格式生成更改数据。我使用它来处理更新日志已经很长时间了。我强烈建议这是一个非常稳定的解决方案。