这篇文章主要介绍“怎么使用MySQL中的参数binlog_row_image”,在日常操作中,相信很多人在怎么使用MySQL中的参数binlog_row_image问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用MySQL中的参数binlog_row_image”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、设置过程
插入前先调用TABLE::mark_columns_per_binlog_row_image函数
函数中有image的详细设置
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 ((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 (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 (Field **ptr=field ; *ptr ; ptr++)
{
Field *my_field= *ptr;
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:
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”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!