mysql_binlog_utils ================== Some utilities for mysql binlog WARNING: these utilities are tested for mysql 5.5.33, but are not tested for mysql 5.6+ Dump binlog from pos ---- `DumpBinlogFromPos(srcFilePath string, startPos int, targetFilePath string)` This function will dump binlog (at `srcFilePath`) from pos (`startPos`), and the output is at `targetFilePath` If the `startPos` is 0 or 4, the whole binlog will be dump. Otherwise, the source binlog header (including `FORMAT_DESCRIPTION_EVENT` & `ROTATE_EVENT` & `PREVIOUS_GTIDS_LOG_EVENT`) will be dump as the target binlog header, and then the source data will be dump from `startPos` This will make target binlog complete and available to replay. Rotate relay log ---- `RotateRelayLog(relayLogPath string, endPos int)` This function will add a rotate event to a relay log (at `relayLogPath`), after the position (`endPos`), and truncate the data after the position (`endPos`) WARNING: after manually rotate relay log, DONOT forget to update `relay-log.index` Fake master server ---- `NewFakeMasterServer(port int, unusedServerId int, characterSet int, keepAliveWhenFinish bool, baseDir string)` WARNING: only support mysql 5.5.x This fake master server is very helpful if you want to replay some binlog files to a mysql instance, and you're afraid of `mysqlbinlog` (http://bugs.mysql.com/bug.php?id=33048, for example) Mysql replication is [more reliable way](http://www.xaprb.com/blog/2010/09/04/why-mysql-replication-is-better-than-mysqlbinlog-for-recovery/) to replay binlog, what we need is : 1. server := NewFakeMasterServer(...) 2. server.Start() 3. In target mysql instance, `change master` to the fake server, and `start slave` 4. the server will be closed when done or error 5. you can abort the server by `server.Abort()` ####Some other features: 1. `start slave until` is also supported 2. large packet (>= `1<<24-1` bytes) is supported 3. multiple binlog files are supported, fake server will act as a real replication master (rotate to the next when one is finished) ####Arguments: Argument|_ --- | --- `port` | the fake server port `unusedServerId` | the fake server id, should not be duplicate with any other mysql instance `characterSet` |the fake server character set id, should be the same with target mysql instance's. You can get the id by `SELECT id, collation_name FROM information_schema.collations ORDER BY id` `keepAliveWhenFinish` |when false, the fake server will quit when all binlogs are replayed. when true, the fake server will wait for more binlogs. `baseDir` | where the binlog files are located Get unexecuted binlog files by gtid ---- `GetUnexecutedBinlogFilesByGtid(binlogDir string, binlogBaseName string, executedGtidDesc string) (ret []string, err error)` This function will search binlog files in `binlogDir`, for the one contains a event whose gtid is not contained in `executedGtidDesc` The scenario is in mysql replication, if mysql master is broken, mysql slave can call `GetUnexecutedBinlogFilesByGtid` to search in mysql master binlog dir, for the binlog files which need to be replay in slave Get unexecuted binlog pos by gtid --- `GetUnexecutedBinlogPosByGtid(binlogFilePath string, executedGtidDesc string) (pos uint, err error) ` This function will search first binlog event pos, which is not contained in `executedGtidDesc`, in binlog file (`binlogFilePath`) Or return `EOF` error if has no unexecuted binlog event ---- ####Pull requests and issues are warmly welcome