1

我正在使用shyiko连接器将 bin 日志更改从 mysql 集群流式传输到下游数据库系统。

一个集群 = MySQL master + Primary slave + Secondary slave

当监听的 MySQL 系统由于某种原因宕机时,机制是把 slave 提升为 master,然后像往常一样继续。但问题是bin日志文件和位置从故障机器到新提升的slave mysql是完全不同的。

在两台机器的提交日志之间,我能想到的唯一共同点是时间戳。即使 mysqlbinlog 实用程序也具有使用--start-datetime选项设置时间戳的功能。

有没有办法使用给定的时间戳找出 mysql bin 日志中的位置?因为我上面提到的库只能使用特定的位置而不是时间戳。如果没有,那么应该如何实现它。

4

1 回答 1

3

最好的方法是使用 GTID(mysql-binlog-connector-java 支持,顺便说一句),但就像迈克尔说它需要 5.6+。如果您绝对无法升级并且您了解所涉及的风险,那么让您拥有--start-datetime就像这样简单:

BinaryLogClient binaryLogClient = new BinaryLogClient(...);
binaryLogClient.setBinlogFilename(""); // instructs server to stream events 
// starting from the oldest known binlog
final long start = ...
binaryLogClient.registerEventListener(new BinaryLogClient.EventListener() {
    @Override
    public void onEvent(Event event) {
        if (event.getHeader().getTimestamp() < start) {
            return;
        }
        // process the event here
    }
});
binaryLogClient.connect();

注意:binlog 事件的时间戳具有精度。

于 2016-09-11T08:04:52.783 回答