MySQL - Найти позицию журнала бина на основе метки времени

Я использую соединитель shyiko для потоковой передачи изменений журнала бина из кластера mysql в нисходящие системы баз данных

Кластер = MySQL master + Основной подчиненный + Вторичный подчиненный

Когда прослушивающая система MySQL выходит из строя по какой-либо причине, механизм состоит в том, чтобы продвинуть ведомое устройство как главного и затем продолжить как обычно. Но проблема в том, что файлы журналов бина и их позиции полностью отличаются от неисправного компьютера до недавно продвинутого подчиненного сервера mysql.

Единственная распространенная вещь, о которой я могу думать между журналами фиксации обеих машин, - это timestamp. Даже утилита mysqlbinlog имеет возможность устанавливать метку времени с помощью опции --start-datetime.

Есть ли способ узнать положение в журнале bin MySQL, используя данную метку времени? Потому что библиотека, которую я упомянул выше, может использовать только определенные позиции, а не временные метки. Если нет, то как идти, чтобы достичь этого.

1 ответ

Решение

Наилучшим подходом было бы использование 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 имеет точность в секундах.

Другие вопросы по тегам