加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

怎么运用MySQL中的参数binlog_row_image

发布时间:2023-08-28 12:30:46 所属栏目:MySql教程 来源:
导读:这篇文章主要介绍“怎么使用MySQL中的参数binlog_row_image”,在日常操作中,相信很多人在怎么使用MySQL中的参数binlog_row_image问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对

这篇文章主要介绍“怎么使用MySQL中的参数binlog_row_image”,在日常操作中,相信很多人在怎么使用MySQL中的参数binlog_row_image问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用MySQL中的参数binlog_row_image”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、设置过程

插入前先调用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

到此,关于“怎么使用MySQL中的参数binlog_row_image”的学习就结束了,希望能够解决大家的疑惑。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章