rocksdb-doc-cn

当前rocksdb中,默认情况下在写操作中任何一个错误(写WAL,Memtable落盘)都会导致db实例进入只读模式,之后的用户写操作都不会被接受。变量ErrorHandler::bg_error 会被设置到对应的失败Status。DBOptions::paranoid_checks选项控制Rocksdb在检查和确认错误的强度。默认值为true。下面的表展示不同场景的错误以及对db的潜在影响。

错误原因 BG_ERROR_被设置的时机
同步 WAL (BackgroundErrorReason::kWriteCallback) 总是
Memtable插入失败 (BackgroundErrorReason::kMemTable) 总是
Memtable落盘(BackgroundErrorReason::kFlush) DBOptions::paranoid_checks为true
SstFileManager::IsMaxAllowedSpaceReached() 报告memtable落盘的时候已经达到最大空间(BackgroundErrorReason::kFlush) 总是
SstFileManager::IsMaxAllowedSpaceReached() 报告压缩期间到达最大空间 (BackgroundErrorReason::kCompaction) 总是
DB::CompactFiles (BackgroundErrorReason::kCompaction) DBOptions::paranoid_checks为true
后台压缩 (BackgroundErrorReason:::kCompaction) DBOptions::paranoid_checks为true
写(BackgroundErrorReason::kWriteCallback) DBOptions::paranoid_checks为 true

探测

一旦数据库实例进入只读模式,下面的前端操作在所有后续调用中都会返回错误:

返回的Status会包含具体的错误码,子码以及严重性。错误的严重性可以通过调用Status::severity()得到。有四个严重性等级:

除了上面提到的,在发生后台错误的时候,一个通知回调Status::Severity::kUnrecoverableError会被尽可能快地调用。

恢复

有两种办法从后台错误中恢复而不需要关闭数据库:

看到这里或许你有建议或者疑问或者指出错误,请留言评论! 多谢! 你的评论非常重要!也可以帮忙点赞收藏转发!多谢支持! 觉得写的不错那就给点吧, 在线乞讨 微信转账