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 имеет точность в секундах.