我想在MySQL数据库中记录所有更改(插入/更新/删除)。
我可能还希望这条记录易于执行,即如果我选择执行所有录制的语句,它可以用作某种备份工具。
我的理解是,MySQL的日志格式可能包含不必要的东西,我需要额外的处理才能使语句批量执行。
创建一个简单的文本文件并将SQL语句写入它是一个好主意吗?或者MySQL中是否有一些本机功能已经支持这个功能?或者这是我可以利用其他软件如redis创建更有效的解决方案的方式吗?
答案 0 :(得分:1)
“我的理解是,MySQL的日志格式可能包含不必要的东西,我需要额外的处理才能使语句批量执行。”
当你谈论MySQL General Log
时,这是有道理的。
使用MySQL Bin Log
,您无需转换日志格式。
有3种binlog_format
。 http://dev.mysql.com/doc/refman/5.5/en/binary-log-setting.html
使用基于STATEMENT
的binlog,您可以获取
mysql> SHOW VARIABLES LIKE 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
使用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格式生成更改数据。我使用它来处理更新日志已经很长时间了。我强烈建议这是一个非常稳定的解决方案。