--MySQL如何记录binlog  
-------------------------------2014/07/08
 
 
binlog文件的内容 log event 
 
   MySQL的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event。不同的修改操作对应的不同的log event。比较常用的几种log event有:Query event、Row event、Xid event等。其中Query event对应的是一条SQL语句,在DDL操作和STMT格式的binlog中用的比较多。Row event是个基础类,它的派生类有Row insert event、Row update event、Row delete event三种,分别对应ROW格式binlog的增、改、删操作。Xid event 对应的是支持事务的commit操作,对于不支持事务的commit操作,记录的形式是Query event。其他还有一些event,比如Format log event、Rotate event等等,可以查看MySQL的官方文档了解更多相关信息。log event的种类一直在增加,比如InnoSQL中新增的checkpoint event等。要MySQL本身就留有接口以便新增一个Log event,但是新增一个Log event时需要实现几个必要的方法函数,比如print、write、get_code_type等。binlog文件的内容就是各种Log event的集合。
 
产生Log event
  事务在执行DDL,或则update等操作时会记录操作的event到线程的cache_mngr中。
  1,执行DDL操作会在db的操作函数中记录event,这些函数有:mysql_upgrade_db,mysql_alter_db,mysql_rm_db等。其他的DDL操作会调用函数write_bin_log来记录binlog。
     
  2,执行修改操作的DML语句会根据binlog格式的不同做不同的操作。若binlog格式是STMT,则记录event的函数是binlog_query,该函数所做的事情是:
     1,根据DML操作语句构造一个Query event:
        Query_log_event qinfo(this,query_arg,query_len, ...)
     2,将event写入缓存中
        mysql_bin_log.write(&qinfo)
     调用binlog_query的函数有:mysql_insert,mysql_delete,mysql_update等.
 
  3,若binlog格式是ROW,修改操作的DML语句记录event的过程会调用binlog_log_row,每一条行的修改记录一个Row event,所以调用binlog_log_row
     的都是对单个行进行修改的引擎层接口函数:ha_write_row、ha_update_row、ha_delete_row。
  
     函数binlog_log_row会根据行操作的具体类型分别调用三个不同的函数:binlog_write_row、binlog_update_row、binlog_delete_row。
  这三个函数的功能是:构造相应的Row event,并将行的数据写入到Row event中。
     具体过程是:
     binlog_write_row
     1,binlog_prepare_pending_rows_event(table, server_id, cols,...);
     2,ev->add_row_data(row_data, len);
 
     binlog_update_row
     1,ev= binlog_prepare_pending_rows_event(table, server_id, cols,...);
     2,ev->add_row_data(before_row, before_size)
        ev->add_row_data(after_row, after_size)
 
     binlog_delete_row
     1,ev= binlog_prepare_pending_rows_event(table, server_id, cols,...);
     2,ev->add_row_data(row_data, len);
     新构造的Row event会在下一次记录event的时候写入到线程的缓存区中。
 
IO_CACHE
    写binlog的过程都是缓存写,使用的缓存结构是IO_CACHE。
 
cache_mngr,cache_data
   事务在执行过程中产生log event,这些Log event记录在线程相关的一块缓冲区中,每一个事务线程都有这样一个缓存块(前提是事务开启了记录binlog的功能),这块缓存区的名称是binlog_cache_mngr,结构如下:
class binlog_cache_mngr {
    binlog_cache_data stmt_cache; //不支持事务的存储引擎使用的binlog缓存区
    binlog_cache_data trx_cache;  //支持事务的存储引擎使用的binlog缓存区
    。。。
  }
   Log event保存在cache_mngr的缓存结构cache_data中,cache_data内有一个IO_CACHE缓存空间,Log event实际写入到这个IO_CACHE中binlog_cache_data的结构如下:
class binlog_cache_data{
   IO_CACHE cache_log;
   。。。
  }
  事务执行完一个修改操作后,写相应的Log event到线程缓存区的过程是:
  1),获得线程的cache_mngr指针:
  cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
  2),获得cache_data缓存区的指针:
  cache_data= cache_mngr->get_binlog_cache_data(use_trans_cache(thd, is_transactional));
  3),将event写入到IO_CACHE中:
   IO_CACHE *file= &cache_data->cache_log;
   event->write(file);
 
写binlog
    一个事务在提交阶段会将产生的log event写入到外部binlog文件中。不同事务以串行的方式将log event写入到外部binlog文件中,所以一个事务的所有log event在binlog文件中是连续的,中间不会插入任何其他事务的log event。MySQL整体是一个插件式的结构,binlog也是作为一个引擎插件被上层调用,事务提交的时候MySQL上层会依次调用事务所有引擎的提交接口,binlog的提交接口第一个被调用,然后再调用其它引擎的提交接口。所以事务提交的时候是先写binlog然后再进行底层引擎的提交过程(如InnoDB提交过程的写redo log和刷脏页)

MySQL如何记录binlog的更多相关文章

  1. 【mysql】关于binlog格式

    写在前面的话 1.推荐用mixed,默认使用statement,基于上下文  set session/global binlog_format=mixed; 2.二进制日记录了数据库执行更改的操作,如 ...

  2. Mysql数据库之Binlog日志使用总结

    binlog二进制日志对于mysql数据库的重要性有多大,在此就不多说了.下面根据本人的日常操作经历,并结合网上参考资料,对binlog日志使用做一梳理: 一.binlog日志介绍1)什么是binlo ...

  3. mysql 5.6 binlog组提交

    mysql 5.6 binlog组提交实现原理 http://blog.itpub.net/15480802/viewspace-1411356 Redo组提交 Redo提交流程大致如下 lock l ...

  4. mysql中删除binlog的方法?mysql中如何删除binlog?

    需求描述: 在mysql中如何删除binlog,因为随着数据库的运行,mysql中产生的binlog会越来越大,有可能把磁盘撑爆了,所以记录下删除 binlog的方法. 操作过程: 1.通过系统参数控 ...

  5. (转)Mysql数据库之Binlog日志使用总结

    使用mysqlbinlog提取二进制日志 原文:http://blog.csdn.net/leshami/article/details/41962243 MySQL binlog日志记录了MySQL ...

  6. 查看MySQL日志数据binlog文件

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  7. mysql 主从复制以及binlog 测试

    ###mysql查看binlog日志内容 https://blog.csdn.net/nuli888/article/details/52106910 mysql的binlog日志位置可通过show ...

  8. mysql 正确清理binlog日志的两种方法

    前言: MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使用正确安全的方法清理掉 ...

  9. Docker下mysql容器开启binlog日志(保留7天)

    现有需求开启用Docker容器启动的mysql数据库的binlog,以作为 日志记录 和 数据恢复,我们了解了MySQL的binlog日志的开启方式以及binlog日志的一些原理和常用操作,我们知道, ...

随机推荐

  1. 关于Ext 修复源代码 bug的方法

    Ext修复源代码出现的问题 1.使用override属性,重写组件 定义一个新的组件,override属性设为要重写的源组件 例子: Extjs4.2.3遇到的一个bug,Datefield 选择不了 ...

  2. 一个简单的python选课系统

    下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...

  3. WPF:动态显示或隐藏Listview的某一列

    这几天做项目,需要做个listview满足能够动态显示或隐藏某些列,由于自己是菜鸟水平,查了两天资料也没有想出解决办法.就在我山穷水尽的时候看到了Mgen的一篇博客,给了我很大启发,所以我也决定把自己 ...

  4. Java虚拟机面试重点-------------内存分配和回收策略

    1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...

  5. ExtJs的Ext.Ajax.request实现waitMsg等待提示效果

    一.  fp.form.submit 有waitMsg 属性来设置等待效果,如下.但是对于Ext.Ajax.request来说 waitMsg 并不起作用.                     f ...

  6. poj3276

    Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5121   Accepted: 237 ...

  7. Android反编译odex然后重新打包

    #Android反编译odex然后重新打包 最近不知道怎么回事,突然把我那刷了氧OS的root了,然后就开始好奇起来氢OS所带有的那些本地化的东西,比如通话录音就是典型的一个之一.其中也做了很多的尝试 ...

  8. Nodejs cluster模块深入探究

    由表及里 HTTP服务器用于响应来自客户端的请求,当客户端请求数逐渐增大时服务端的处理机制有多种,如tomcat的多线程.nginx的事件循环等.而对于node而言,由于其也采用事件循环和异步I/O机 ...

  9. 文本三剑客---gawk基础

    gawk程序是Unix中原始awk程序的GNU版本.gawk程序让流编辑器迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令.在gawk编程语言中,可以完成下面的事情: (1)定义变量来保存数 ...

  10. DL4NLP——词表示模型(三)word2vec(CBOW/Skip-gram)的加速:Hierarchical Softmax与Negative Sampling

    上篇博文提到,原始的CBOW / Skip-gram模型虽然去掉了NPLM中的隐藏层从而减少了耗时,但由于输出层仍然是softmax(),所以实际上依然“impractical”.所以接下来就介绍一下 ...