mysql没开启binlog恢复删除表_无全量备份、未开启binlog日志,利用percona工具恢复delete的数据...

当我们忘记做全量备份时,并且没有开启binlog,并执行了delete from sbtest;

数据全部丢失,要想恢复是很有难度的。

今天,利用Percona Data Recovery Tool for InnoDB工具(仅支持InnoDB,MyISAM不支持),可以找回被删除的数据。

原理:在InnoDB引擎,delete删除操作,不是真正的删除物理文件上的行,而是增加一个删除的标记,我们都用过WORD吧?在修改字体的时候,有一个删除线的标记,如《MySQL 管理之道》,该工具利用这个特性,找回那些标注了删除线的数据,并存入到一个文本里,然后通过load data命令,批量插入到表里。

注:truncate不能恢复(truncate是直接清空数据行,并不是添加删除标记,你可以通过查看物理文件,执行了truncate操作,ibd文件变小,而执行了delete操作,ibd文件还跟之前的一样大),drop不能恢复(数据文件都没了,还怎么恢复?)。

一、安装Percona Data Recovery Tool for InnoDB工具# cd percona-data-recovery-tool-for-innodb-0.5/mysql-source

# ./configure

# cd ..

# make

二、全表删除sbtest表delete from sbtest;

三、恢复

1、提取ibd物理文件,按照每页16K,单独存放。# cd percona-data-recove

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这篇文章介绍了如何通过开启 MySQLBinlog 日志,并利用 Kafka 实时同步 MySQL 数据到 SQL Server 数据库中。 首先,需要在 MySQL开启 Binlog 日志。可以通过修改 MySQL 配置文件(my.cnf 或 my.ini)来开启 Binlog 日志: ``` [mysqld] log-bin=mysql-bin binlog-format=row server-id=1 ``` 其中,`log-bin` 指定了 Binlog 文件的名称前缀,`binlog-format` 指定 Binlog 记录的格式为行格式,`server-id` 指定了 MySQL 实例的唯一标识。 接下来,需要创建一个 Kafka 主题,并启动一个 Kafka 生产者,将 MySQL Binlog 数据写入 Kafka 主题: ```java import com.github.shyiko.mysql.binlog.BinaryLogClient; import com.github.shyiko.mysql.binlog.event.*; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; public class BinlogProducer { private final BinaryLogClient client; private final KafkaProducer<String, String> producer; private final String topic; public BinlogProducer(String hostname, int port, String username, String password, String topic) { this.client = new BinaryLogClient(hostname, port, username, password); this.producer = new KafkaProducer<>(getKafkaConfig()); this.topic = topic; } public void start() throws Exception { client.registerEventListener(event -> { EventData data = event.getData(); if (data instanceof WriteRowsEventData) { WriteRowsEventData eventData = (WriteRowsEventData) data; for (Serializable[] row : eventData.getRows()) { String message = "INSERT INTO " + eventData.getTableId() + " VALUES " + Arrays.toString(row); producer.send(new ProducerRecord<>(topic, message)); } } else if (data instanceof UpdateRowsEventData) { UpdateRowsEventData eventData = (UpdateRowsEventData) data; for (Map.Entry<Serializable[], Serializable[]> row : eventData.getRows()) { String message = "UPDATE " + eventData.getTableId() + " SET " + Arrays.toString(row.getValue()) + " WHERE " + Arrays.toString(row.getKey()); producer.send(new ProducerRecord<>(topic, message)); } } else if (data instanceof DeleteRowsEventData) { DeleteRowsEventData eventData = (DeleteRowsEventData) data; for (Serializable[] row : eventData.getRows()) { String message = "DELETE FROM " + eventData.getTableId() + " WHERE " + Arrays.toString(row); producer.send(new ProducerRecord<>(topic, message)); } } }); client.connect(); } public void stop() throws Exception { client.disconnect(); producer.close(); } private Map<String, Object> getKafkaConfig() { Map<String, Object> config = new HashMap<>(); config.put("bootstrap.servers", "localhost:9092"); config.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); config.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); return config; } } ``` 上述代码中,`BinaryLogClient` 是一个 MySQL Binlog 客户端,可以用来监听 MySQL 数据库的 Binlog 事件。在 `start()` 方法中,我们通过注册事件监听器来捕获 Binlog 事件,然后将事件数据写入 Kafka 主题。需要注意的是,对于不同类型的 Binlog 事件(如插入、更新、删除等),需要分别处理,并将事件数据转换成插入、更新、删除语句,然后写入 Kafka 主题中。 最后,需要启动一个 Kafka 消费者,从 Kafka 主题中读取 Binlog 数据,并写入 SQL Server 数据库中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component public class BinlogConsumer { private final JdbcTemplate jdbcTemplate; @Autowired public BinlogConsumer(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @KafkaListener(topics = "binlog") public void onMessage(String message) { jdbcTemplate.execute(message); } } ``` 上述代码中,`BinlogConsumer` 是一个 Kafka 消费者,使用 `@KafkaListener` 注解来监听 Kafka 主题中的消息。当收到消息时,直接执行消息中的 SQL 语句,将数据写入 SQL Server 数据库中。 通过上述方式,就可以实现 MySQL 数据库和 SQL Server 数据库之间的实时数据同步了。需要注意的是,由于 Binlog 日志是一个增量日志,因此在启动同步任务时,需要首先将 MySQL 数据库中的数据全量复制到 SQL Server 数据库中,然后再开启 Binlog 日志,以保证数据的完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值