//读取记录,scratch为缓冲,record是结果boolReader::ReadRecord(Slice*record, std::string*scratch) {if(last_record_offset_

}

}

scratch->clear();

record->clear();boolin_fragmented_record=false//是否是碎片记录;//Record offset of the logical record that we're reading//0 is a dummy value to make compilers happyuint64_t prospective_record_offset=0;

Slice fragment;while(true) {

uint64_t physical_record_offset=end_of_buffer_offset_-buffer_.size();//从文件中读取一个BLOCKconstunsignedintrecord_type=ReadPhysicalRecord(&fragment);switch(record_type) {casekFullType://完整Recordif(in_fragmented_record) {//Handle bug in earlier versions of log::Writer where//it could emit an empty kFirstType record at the tail end//of a block followed by a kFullType or kFirstType record//at the beginning of the next block.if(scratch->empty()) {

in_fragmented_record=false;

}else{

ReportCorruption(scratch->size(),"partial record without end(1)");

}

}

prospective_record_offset=physical_record_offset;

scratch->clear();*record=fragment;

last_record_offset_=prospective_record_offset;returntrue;casekFirstType://Record开始if(in_fragmented_record) {//Handle bug in earlier versions of log::Writer where//it could emit an empty kFirstType record at the tail end//of a block followed by a kFullType or kFirstType record//at the beginning of the next block.if(scratch->empty()) {

in_fragmented_record=false;

}else{

ReportCorruption(scratch->size(),"partial record without end(2)");

}

}

prospective_record_offset=physical_record_offset;

scratch->assign(fragment.data(), fragment.size());

in_fragmented_record=true;break;casekMiddleType://Record中间if(!in_fragmented_record) {

ReportCorruption(fragment.size(),"missing start of fragmented record(1)");

}else{

scratch->append(fragment.data(), fragment.size());

}break;casekLastType://Record结尾if(!in_fragmented_record) {

ReportCorruption(fragment.size(),"missing start of fragmented record(2)");

}else{

scratch->append(fragment.data(), fragment.size());*record=Slice(*scratch);

last_record_offset_=prospective_record_offset;returntrue;

}break;casekEof://文件结束if(in_fragmented_record) {

ReportCorruption(scratch->size(),"partial record without end(3)");

scratch->clear();

}returnfalse;casekBadRecord://坏记录if(in_fragmented_record) {

ReportCorruption(scratch->size(),"error in middle of record");

in_fragmented_record=false;

scratch->clear();

}break;default: {//无法识别charbuf[40];

snprintf(buf,sizeof(buf),"unknown record type %u", record_type);

ReportCorruption(

(fragment.size()+(in_fragmented_record?scratch->size() :0)),

buf);

in_fragmented_record=false;

scratch->clear();break;

}

}

}returnfalse;

}//从文件中读取unsignedintReader::ReadPhysicalRecord(Slice*result) {while(true) {if(buffer_.size()Read(kBlockSize,&buffer_, backing_store_);

end_of_buffer_offset_+=buffer_.size();if(!status.ok()) {

buffer_.clear();

ReportDrop(kBlockSize, status);

eof_=true;returnkEof;

}elseif(buffer_.size()

eof_=true;

}continue;

}elseif(buffer_.size()==0) {//End of filereturnkEof;

}else{

size_t drop_size=buffer_.size();

buffer_.clear();

ReportCorruption(drop_size,"truncated record at end of file");returnkEof;

}

}//解析record头constchar*header=buffer_.data();constuint32_t a=static_cast(header[4])&0xff;constuint32_t b=static_cast(header[5])&0xff;constunsignedinttype=header[6];constuint32_t length=a|(b<<8);if(kHeaderSize+length>buffer_.size()) {

size_t drop_size=buffer_.size();

buffer_.clear();

ReportCorruption(drop_size,"bad record length");returnkBadRecord;

}if(type==kZeroType&&length==0) {//Skip zero length record without reporting any drops since//such records are produced by the mmap based writing code in//env_posix.cc that preallocates file regions.buffer_.clear();returnkBadRecord;

}//检查CRCif(checksum_) {

uint32_t expected_crc=crc32c::Unmask(DecodeFixed32(header));

uint32_t actual_crc=crc32c::Value(header+6,1+length);if(actual_crc!=expected_crc) {//Drop the rest of the buffer since "length" itself may have//been corrupted and if we trust it, we could find some//fragment of a real log record that just happens to look//like a valid log record.size_t drop_size=buffer_.size();

buffer_.clear();

ReportCorruption(drop_size,"checksum mismatch");returnkBadRecord;

}

}

buffer_.remove_prefix(kHeaderSize+length);//Skip physical record that started before initial_offset_if(end_of_buffer_offset_-buffer_.size()-kHeaderSize-length

result->clear();returnkBadRecord;

}*result=Slice(header+kHeaderSize, length);returntype;

}

}

levedb 导入 mysql_leveldb研究3-数据库日志文件格式相关推荐

  1. 【论文十问】基于数据库日志的变化数据捕获研究

    文章目录 摘要 十问 Q1 论文试图解决什么问题? Q2 这是否是一个新的问题? Q3 这篇文章要验证一个什么科学假设? Q4 有哪些相关研究?如何归类? Q5 论文中提到的解决方案之关键是什么? Q ...

  2. oracle导入命令,记录一下 数据库日志太大,清理日志文件

    oracle导入命令,记录一下 工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\wo ...

  3. Sql Server实用操作-无数据库日志文件恢复数据库两种方法

    数据库日志文件的误删或别的原因引起数据库日志的损坏 方法一 1.新建一个同名的数据库 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文件覆盖掉这个新建的数据库 4.再重启s ...

  4. 根据mysql数据库日志恢复删除数据

    根据mysql数据库日志恢复删除数据 BINLOG就是一个记录SQL语句的过程,和普通的LOG一样.不过只是她是二进制存储,普通的是十进制存储罢了. 1.配置文件里要写的东西: [mysqld] lo ...

  5. MariaDB数据库日志

      在日常生产中,各种服务应用的日志的主要作用就是记录服务的运行状态.启动记录等信息,但数据库的日志对于数据库而言是很重要的.数据库日志分为:事务.中继.错误.通用.慢查询和二进制日志,其中每种日志都 ...

  6. 批量导入数据到mssql数据库的

    概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...

  7. always on sql 收缩日志_使用alwayson后如何收缩数据库日志的方法详解

    问题描述: 在使用了alwayson后,主从库实时同步,原理是通过事务日志同步的,所以造成主数据库的事务日志一直在使用,而且无法收缩主数据库的事务日志. 在主从库同步时,收缩数据库是不起作用的.由于主 ...

  8. php导入关系表,PHP导入Execl表到数据库

    PHP导入Execl表到数据库 /** * 上传文件 */ function uploadFileforExcel() { // 允许上传的图片后缀 //$allowedExts = array(&q ...

  9. shell脚本批量导出MYSQL数据库日志/按照最近N天的形式导出二进制日志[连载之构建百万访问量电子商务网站]...

    shell脚本批量导出MYSQL数据库日志/自动本地导出MYSQL二进制日志,按天备份[连载之构建百万访问量电子商务网站] 出处:http://jimmyli.blog.51cto.com/我站在巨人 ...

最新文章

  1. oracle收购Mysql后,Mysql的安装配置方法
  2. python enumerate()用法
  3. java编程中的点_Java的21个技术点和知识点归纳(转)
  4. 使用 CallableStatement 接口调用存储过程
  5. easyUI的目录结构
  6. OpenCASCADE绘制测试线束:几何命令之曲线和曲面修改
  7. 安卓开发环境_我的安卓开发环境
  8. 备份事务日志时遇到 log corruption
  9. java 中文转化为拼音
  10. Zetcode GUI 教程
  11. 如何创建一个最小的串口、TTY设备包括虚拟控制台,串口以及伪终端设备的驱动程序
  12. Java基础之synchronized的讲解
  13. 开源老兵教你如何评估一项技术是否值得长期投入?
  14. 浏览器的资源并发亲试
  15. 【转载】"library not found for - "解决办法
  16. RAW数码照片处理器:SILKYPIX Developer 的功能介绍
  17. 西数绿盘的“C1门”!!!
  18. 谁说门户已死?从世界杯看新浪的四大优势
  19. 阿里云飞天计划ECS使用体验
  20. 吉他(guitar)

热门文章

  1. 风控建模:催收评分卡(四)--变量整理除了跟数据获取相关外还跟什么有关系?
  2. 电商平台营销活动玩法大全、拓客、吸粉、裂变、引流、团购返现、限时折扣、找人代付、砍价代付、多人拼团、优惠套餐、秒杀折扣、满减优惠、电商营销、电商推广、商品促销、营销红包、Axure原型、rp原型
  3. Hibernate处理MySQL的时间
  4. 【剑指Offer】18树的子结构
  5. pdf转html插件~~~pdf2htmlEX安装,配置及使用
  6. leetcode第一刷_Word Search
  7. Jmeter安装设置
  8. Understanding ASP.NET Validation Techniques
  9. ORACLE登录错误的解决方法
  10. 痛苦如此持久,像蜗牛充满耐心地移动;快乐如此短暂,像兔子的尾巴掠过秋天的草原...