溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用MySQL中的參數binlog_row_image

發(fā)布時間:2021-11-08 11:01:57 來源:億速云 閱讀:353 作者:iii 欄目:MySQL數據庫

這篇文章主要介紹“怎么使用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字節(jié)
        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”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI