In preparation for the MySQL UC and my session about binlogs I started to implement a first few ideas. In a short coding rush I moved some of the C-code from
mysql-binlog-dump.c to the right places in the libraries and wrapped it nicely for Lua.
My overall goal is to make a clean cut between
- a library to work with binlogs
- wrapping with for Lua's use
- a front-end that's making use of all of it
With code in hands I can now toss in a liitle lua script to dump a simple statement-based binlog:
local binlog = assert(require("mysql.binlog")) local basedir = "/usr/local/mysql/data/" local file = "jan-kneschkes-macbook-pro-bin.001005" while file do local f = assert(binlog.open(basedir .. file)) file = nil for event in f:next() do if event.type == "QUERY_EVENT" then print(("/* threadid: %d */ %s"):format( event.query.thread_id, event.query.query)) elseif event.type == "ROTATE_EVENT" then print(("/* rotate to: %s */"):format( event.rotate.binlog_file)) file = event.rotate.binlog_file -- rotate to the next binlog elseif event.type == "XID_EVENT" then print(("COMMIT /* xid = %d */"):format(event.xid.xid_id)) elseif event.type == "FORMAT_DESCRIPTION_EVENT" then print(("/* version: %d from %s created at %d */"):format( event.format.binlog_version, event.format.master_version, event.format.created_ts)) end end f:close() end
Just a little code to run through all the rotated binlogs and dump them.
If you want you can add your own filters, toss out records and just analyse the binlogs.
Next step is finishing the row-based support making it easier to work with them.