You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB MyRocks执行Update语句后数据丢失问题求助

解决MyRocks批量更新后数据丢失问题

问题原因分析

你遇到的问题源于在开启rocksdb_bulk_load=1的会话中执行UPDATE操作。rocksdb_bulk_load是MyRocks专为批量INSERT场景设计的优化模式,它会跳过部分事务一致性检查、索引实时更新逻辑以提升导入性能。但当操作涉及修改唯一索引字段(你的表中device_id+unix_time是唯一键)时,该模式下的UPDATE会被拆解为「删除旧记录+插入新记录」的逻辑,而由于bulk load的优化特性,这个过程会出现数据异常:旧记录被标记删除,但新记录未正确写入索引,最终导致新旧device_id都无法查询到数据。

紧急数据恢复方案

1. 备份恢复(优先)

如果有更新操作前的全量备份(如mysqldump、物理备份工具),直接恢复到更新前的状态,然后在正常模式下重新执行UPDATE操作。

2. Binlog时间点恢复

若数据库开启了Binlog:

  • 使用mysqlbinlog工具解析更新操作之前的Binlog片段,提取目标时间段内device_id="1000002912"的原始数据。
  • 创建临时表导入这些原始数据,验证无误后合并回location表。
    示例命令(需替换实际Binlog文件名和时间范围):
mysqlbinlog --start-datetime="2023-04-24 00:00:00" --stop-datetime="2023-04-24 10:00:00" mysql-bin.000001 > recover_data.sql

3. 触发RocksDB Compaction

关闭rocksdb_bulk_load模式后,执行表的Compaction操作,尝试找回被标记删除但未被物理清理的数据:

SET session rocksdb_bulk_load=0;
OPTIMIZE TABLE location;

执行完成后重新查询新旧device_id的数据,部分场景下可恢复丢失的记录。

后续避免措施

  • 禁止在rocksdb_bulk_load模式下执行UPDATE/DELETE:该模式仅适用于批量插入,任何修改、删除操作都会破坏数据一致性。
  • 批量更新规范:执行批量更新时保持rocksdb_bulk_load=0默认状态;若需提升性能,可将更新拆分为多个小批次(如每次更新1000条),基于主键id进行更新,避免直接修改唯一键字段。
  • 操作前验证:执行批量操作前,先在测试环境验证逻辑,确认模式适配性。

内容的提问来源于stack exchange,提问作者TNguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:17:04