MySQL - 根据时间戳查找bin log位置
MySQL - Find bin log position based on timestamp
我正在使用 shyiko 连接器将 bin 日志更改从 mysql 集群流式传输到下游数据库系统。
一个集群=MySQLmaster+Primary slave+Secondary slave
当监听的MySQL系统由于某种原因宕机时,机制是将slave提升为master,然后照常继续。但问题是bin日志文件和位置完全不同从故障机器到新提升的slavemysql.
我能想到的两台机器的提交日志之间唯一的共同点是 timestamp.Even mysqlbinlog 实用程序具有使用 --start-datetime 选项设置时间戳的功能。
有没有办法使用给定的时间戳找出 mysql bin 日志中的位置?因为我上面提到的库只能使用特定位置而不能使用时间戳。如果没有那又该如何实现呢
最好的方法是使用 GTID(which mysql-binlog-connector-java supports, btw) but just like Michael said it requires 5.6+. If there is absolutely no way for you to upgrade and you understand the risks involved then getting you own --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();
NOTE: binlog event's timestamp has seconds precision.
我正在使用 shyiko 连接器将 bin 日志更改从 mysql 集群流式传输到下游数据库系统。
一个集群=MySQLmaster+Primary slave+Secondary slave
当监听的MySQL系统由于某种原因宕机时,机制是将slave提升为master,然后照常继续。但问题是bin日志文件和位置完全不同从故障机器到新提升的slavemysql.
我能想到的两台机器的提交日志之间唯一的共同点是 timestamp.Even mysqlbinlog 实用程序具有使用 --start-datetime 选项设置时间戳的功能。
有没有办法使用给定的时间戳找出 mysql bin 日志中的位置?因为我上面提到的库只能使用特定位置而不能使用时间戳。如果没有那又该如何实现呢
最好的方法是使用 GTID(which mysql-binlog-connector-java supports, btw) but just like Michael said it requires 5.6+. If there is absolutely no way for you to upgrade and you understand the risks involved then getting you own --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();
NOTE: binlog event's timestamp has seconds precision.