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

一、设置过程

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

/*Markcolumnsaccordingthebinlogrowimageoption.WhenlogginginRBR,theusercanselectwhethertologpartialorfullrows,dependingonthetabledefinition,andthevalueofbinlog_row_image.Semanticsofthebinlog_row_imagearethefollowing(PKE-primarykeyequivalent,ie,PKfieldsifPKexists,allfieldsotherwise):binlog_row_image=MINIMAL-ThismarksthePKEfieldsintheread_set-Thismarksallfieldswhereavaluewasspecifiedinthewrite_setbinlog_row_image=NOBLOB-ThismarksPKE+allnon-blobfieldsintheread_set-Thismarksallfieldswhereavaluewasspecifiedandallnon-blobfieldsinthewrite_setbinlog_row_image=FULL-allcolumnsintheread_set-allcolumnsinthewrite_setThismarkingisdonewithoutresettingtheoriginalbitmaps.Thismeansthatwewillstripextrafieldsintheread_setatbinloggingtime(forthosecasesthatweonlywanttologaPKandweneededotherfieldsforexecution).*/voidTABLE::mark_columns_per_binlog_row_image(){DBUG_ENTER("mark_columns_per_binlog_row_image");DBUG_ASSERT(read_set->bitmap);DBUG_ASSERT(write_set->bitmap);/**IfinRBRwemayneedtomarksomeextracolumns,dependingonthebinlog-row-imagecommandlineargument.*/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;/*ifthereisnoPK,thenmarkallcolumnsfortheBI.*/if(s->primary_key>=MAX_KEY)bitmap_set_all(read_set);switch(thd->variables.binlog_row_image){caseBINLOG_ROW_IMAGE_FULL:if(s->primary_key<MAX_KEY)bitmap_set_all(read_set);//记录全部字段bitmap_set_all(write_set);//记录全部字段,前面write_set应该只是记录了修改了哪些字段位图初始化初始4字节break;caseBINLOG_ROW_IMAGE_NOBLOB:/*foreveryfieldthatisnotset,markitunlessitisablob*/for(Field**ptr=field;*ptr;ptr++){Field*my_field=*ptr;/*bypassblobfields.Thesecanbesetornotset,wedon'tcare.Later,atbinloggingtime,ifwedon'tneedtheminthebeforeimage,wewilldiscardthem.IfsetintheAI,thentheblobisreallyneeded,thereisnothingwecandoaboutit.*/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;caseBINLOG_ROW_IMAGE_MINIMAL:/*marktheprimarykeyifavailableintheread_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到logbuffer->否则在当前event中写入add_row_data(row_data,len);将数据加入到EVENT

到此,关于“怎么使用MySQL中的参数binlog_row_image”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!