十一:参数binlog_row_image(笔记)

简介: 一、设置过程插入前先调用TABLE::mark_columns_per_binlog_row_image函数函数中有image的详细设置/* Mark columns according the binlog row image option.

一、设置过程

插入前先调用TABLE::mark_columns_per_binlog_row_image函数
函数中有image的详细设置

/*
  Mark columns according the binlog row image option.

  When logging in RBR, the user can select whether to
  log partial or full rows, depending on the table
  definition, and the value of binlog_row_image.

  Semantics of the binlog_row_image are the following 
  (PKE - primary key equivalent, ie, PK fields if PK 
  exists, all fields otherwise):

  binlog_row_image= MINIMAL
    - This marks the PKE fields in the read_set
    - This marks all fields where a value was specified
      in the write_set

  binlog_row_image= NOBLOB
    - This marks PKE + all non-blob fields in the read_set
    - This marks all fields where a value was specified
      and all non-blob fields in the write_set

  binlog_row_image= FULL
    - all columns in the read_set
    - all columns in the write_set
    
  This marking is done without resetting the original 
  bitmaps. This means that we will strip extra fields in
  the read_set at binlogging time (for those cases that 
  we only want to log a PK and we needed other fields for
  execution).
 */
void TABLE::mark_columns_per_binlog_row_image()
{
  DBUG_ENTER("mark_columns_per_binlog_row_image");
  DBUG_ASSERT(read_set->bitmap);
  DBUG_ASSERT(write_set->bitmap);

  /**
    If in RBR we may need to mark some extra columns,
    depending on the binlog-row-image command line argument.
   */
  if ((mysql_bin_log.is_open() && in_use &&
       in_use->is_current_stmt_binlog_format_row() &&
       !ha_check_storage_engine_flag(s->db_type(), HTON_NO_BINLOG_ROW_OPT)))
  {

    THD *thd= current_thd;

    /* if there is no PK, then mark all columns for the BI. */
    if (s->primary_key >= MAX_KEY)
      bitmap_set_all(read_set);

    switch (thd->variables.binlog_row_image)
    {
      case BINLOG_ROW_IMAGE_FULL:
        if (s->primary_key < MAX_KEY)
          bitmap_set_all(read_set); //记录全部字段
        bitmap_set_all(write_set); //记录全部字段,前面write_set应该只是记录了 修改了哪些字段   位图 初始化初始4字节
        break;
      case BINLOG_ROW_IMAGE_NOBLOB:
        /* for every field that is not set, mark it unless it is a blob */
        for (Field **ptr=field ; *ptr ; ptr++)
        {
          Field *my_field= *ptr;
          /* 
            bypass blob fields. These can be set or not set, we don't care.
            Later, at binlogging time, if we don't need them in the before 
            image, we will discard them.

            If set in the AI, then the blob is really needed, there is 
            nothing we can do about it.
           */
          if ((s->primary_key < MAX_KEY) && 
              ((my_field->flags & PRI_KEY_FLAG) || 
              (my_field->type() != MYSQL_TYPE_BLOB)))
            bitmap_set_bit(read_set, my_field->field_index);

          if (my_field->type() != MYSQL_TYPE_BLOB)
            bitmap_set_bit(write_set, my_field->field_index);
        }
        break;
      case BINLOG_ROW_IMAGE_MINIMAL:
        /* mark the primary key if available in the read_set */
        if (s->primary_key < MAX_KEY)
          mark_columns_used_by_index_no_reset(s->primary_key, read_set); //只记录主键或者非空唯一键的 字段
        break;

      default: 
        DBUG_ASSERT(FALSE);
    }
    file->column_bitmaps_signal();
  }

  DBUG_VOID_RETURN;
}

二、过滤过程

THD::binlog_prepare_row_images还会准备image

binlog_log_row 上层接口 记录 binlog
-> Write_rows_log_event::binlog_row_logging_function 
  -> THD::binlog_write_row(THD::binlog_delete_row)
     ->THD::binlog_prepare_row_images 准备前印象位图 如果没有主键/非空唯一键 则不考虑记录全字段
       pack_row 通过位图准备好行
       THD::binlog_prepare_pending_rows_event 
         -> 判断是否需要新建一个EVENT 大约8K左右,
            如果新建 新建后写event到 log buffer
         ->否则在当前event中写入   
       add_row_data(row_data, len); 将数据加入到EVENT
相关文章
|
6月前
|
缓存 关系型数据库 MySQL
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响
130 0
|
关系型数据库 MySQL
二进制日志的保存时间参数binlog_expire_logs_seconds和expire_logs_days的设置
在MySQL 8.0中,默认的二进制日志的保存时间参数binlog_expire_logs_seconds和expire_logs_days的设置如下
332 0
|
SQL 关系型数据库 MySQL
MGR修改max_binlog_cache_size参数导致异常
MGR修改max_binlog_cache_size参数导致异常
167 0
MGR修改max_binlog_cache_size参数导致异常
|
SQL 运维 关系型数据库
MySQL binlog_ignore_db 参数最全解析
经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等)。注意默认情况下会记录所有库的操作,那么如果我们有另类需求,比如说只让某个库记录 binglog 或排除某个库记录 binlog ,是否支持此类需求呢?本篇文章我们一起来看下。
578 0
MySQL binlog_ignore_db 参数最全解析
|
缓存 监控 安全
谈谈MySQL bin log的写入机制、以及线上的参数是如何配置的
上一篇文章提到了生产环境中你可以使用binlog做数据的恢复、审计、以及搭建主从架构的MySQL集群。那你使用这些特性优势的时候有没有问自己一下,你使用的binlog是安全的吗?会不会少记录了一部分数据呢?因为使用一个有问题的binlog去做数据恢复、审计、搭建主从MySQL集群的结果肯定是错误的! ​ 下面,我们一起来看一下MySQL执行事物的过程中 binlog 的落盘机制。MySQL是如何保证你使用的binlog是安全的!
379 0
|
SQL 关系型数据库 MySQL
MGR修改max_binlog_cache_size参数导致异常
MGR修改max_binlog_cache_size参数导致异常
MGR修改max_binlog_cache_size参数导致异常
|
关系型数据库 MySQL
深入理解MySQL 5.7 GTID系列(七)binlog_gtid_simple_recovery参数的影响总结
想了想还是专门开了一节来总结这个问题: 5.7.6以下中默认 simplified_binlog_gtid_recovery=flase 5.7.6以上中默认 binlog_gtid_simple_recovery=true 默认值就是最合理的设置。
3965 0