怎么使用MySQL中的参数binlog

33次阅读
没有评论

共计 3475 个字符,预计需要花费 9 分钟才能阅读完成。

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

一、设置过程

插入前先调用 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”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计3475字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)