+ -
当前位置:首页 → 问答吧 → 一个问题

一个问题

时间:2011-12-26

来源:互联网

环境:
mysqldump -uroot -p123 test tb1 >/home/z.txt
在生成的z.txt里面,会有1个或多个insert into语句。

问题:
dump文件里面的insert语句的个数由什么决定的?现在知道肯定不是记录条数,和记录的字段类型有关系。

作者: zuoxingyu   发布时间: 2011-12-26

max_allowed_packet

原来1M,备份出来有45个INSERT语句
改成2M,重启服务,备份出来,还是45个INSERT语句

作者: zuoxingyu   发布时间: 2011-12-26

应该是1M大小一个insert

刚才找了几个单表备份的文件,文件大小除以insert个数=1M

cat xxxxx | grep -i 'insert into' | wc -l

作者: rucypli   发布时间: 2011-12-26

引用 2 楼 rucypli 的回复:
应该是1M大小一个insert

刚才找了几个单表备份的文件,文件大小除以insert个数=1M

cat xxxxx | grep -i 'insert into' | wc -l


我测试时用varchar类型的字段,单字段表测试,也是1M每个INSERT
但是2字段的int类型的表,就不是1M了,是667K一个INSERT.

作者: zuoxingyu   发布时间: 2011-12-26

应该是mysqldump --net_buffer_length这个参数控制的

作者: rucypli   发布时间: 2011-12-26

引用 4 楼 rucypli 的回复:
应该是mysqldump --net_buffer_length这个参数控制的

顶!
把源码这个判断的段落截出来。
SQL code

if (extended_insert)
      {
        ulong row_length;
        dynstr_append_checked(&extended_row,")");
        row_length= 2 + extended_row.length;
        if (total_length + row_length < opt_net_buffer_length)
        {
          total_length+= row_length;
          fputc(',',md_result_file);            /* Always row break */
          fputs(extended_row.str,md_result_file);
        }
        else
        {
          if (row_break)
            fputs(";\n", md_result_file);
          row_break=1;                          /* This is first row */

          fputs(insert_pat.str,md_result_file);
          fputs(extended_row.str,md_result_file);
          total_length= row_length+init_length;
        }
        check_io(md_result_file);
      }

作者: zuoxingyu   发布时间: 2011-12-26

学习了。

作者: mr_mablevi   发布时间: 2011-12-26