3.4 KiB
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 to replay binlog, what we need is :
- server := NewFakeMasterServer(...)
- server.Start()
- In target mysql instance,
change master
to the fake server, andstart slave
- the server will be closed when done or error
- you can abort the server by
server.Abort()
####Some other features:
start slave until
is also supported- large packet (>=
1<<24-1
bytes) is supported - 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