如何防止mysqldump将转储拆分为1MB增量?

时间:2015-09-17 15:15:47

标签: mysql mysqldump

我有一个相当大的MySQL表(1150万行)。就数据大小而言,该表约为2GB。

我的max_allowed_packet是64MB。我通过创建一批插入(每个500,000个值)使用mysqldump来备份表,因为使用mysqldump选项--skip-extended-insert生成的生成的sql文件只需要很长时间才能重新插入。 / p>

这就是我正在运行的(来自perl脚本):

`mysqldump -u root -pmypassword --no-data mydb mytable > mybackup.sql`

my $offset = 0;
while ($offset < $row_count) {
    `mysqldump -u root -p[mypassword] --opt --no-create-info --skip-add-drop-table --where="1 LIMIT $offset, 500000" mydb mytable >> mybackup.sql`
}

生成的sql文件是900MB。查看grep -n '\-\- WHERE\: 1 LIMIT' mybackup.sql的以下输出:

80:-- WHERE:  1 LIMIT 0, 500000
158:-- WHERE:  1 LIMIT 500000, 500000
236:-- WHERE:  1 LIMIT 1000000, 500000
314:-- WHERE:  1 LIMIT 1500000, 500000
392:-- WHERE:  1 LIMIT 2000000, 500000
469:-- WHERE:  1 LIMIT 2500000, 500000
546:-- WHERE:  1 LIMIT 3000000, 500000
623:-- WHERE:  1 LIMIT 3500000, 500000
699:-- WHERE:  1 LIMIT 4000000, 500000
772:-- WHERE:  1 LIMIT 4500000, 500000
846:-- WHERE:  1 LIMIT 5000000, 500000
921:-- WHERE:  1 LIMIT 5500000, 500000
996:-- WHERE:  1 LIMIT 6000000, 500000
1072:-- WHERE:  1 LIMIT 6500000, 500000
1150:-- WHERE:  1 LIMIT 7000000, 500000
1229:-- WHERE:  1 LIMIT 7500000, 500000
1308:-- WHERE:  1 LIMIT 8000000, 500000
1386:-- WHERE:  1 LIMIT 8500000, 500000
1464:-- WHERE:  1 LIMIT 9000000, 500000
1542:-- WHERE:  1 LIMIT 9500000, 500000
1620:-- WHERE:  1 LIMIT 10000000, 500000
1697:-- WHERE:  1 LIMIT 10500000, 500000
1774:-- WHERE:  1 LIMIT 11000000, 500000
1851:-- WHERE:  1 LIMIT 11500000, 500000

... grep -c 'INSERT INTO ' mybackup.sql的结果是 923

这些923插入语句中的每一个几乎都是1MB。为什么mysqldump会为每个命令生成如此多的insert语句。我本来希望只看到24个插入语句,但命令似乎为每个批处理产生了38个插入。

有什么东西我可以放在my.cnf中或传递给mysqldump来阻止它将转储分成1MB增量的插入?

mysql Ver 14.14 Distrib 5.5.44
mysqldump Ver 10.13 Distrib 5.5.44

我使用mysqldump命令中的附加net_buffer_length=64M选项重新运行该作业。但我得到Warning: option 'net_buffer_length': unsigned value 67108864 adjusted to 16777216。我查看了my.cnf,看看是否有任何设置为16M,key_bufferquery_cache_size。我将它们都设置为64M并重新运行,但得到了同样的警告。

生成的转储文件似乎很好,插入语句现在每个大约16MB。是否有可能进一步增加?是否有一个选项限制允许的缓冲区长度?

我将net_buffer_length中的mysql my.cnf变量设置为64M,但是,正如文档所述,它被设置为它的最大值1048576(1MB)。但mysqldump的net_buffer_length选项让我最大插入大小达到16MB(即使它从请求的64MB减少)。

我很高兴能够使用16MB插页,但如果可以的话,我有兴趣增加它。

最后一个想法。看起来我完全在浪费时间尝试自己进行任何类型的批处理,因为默认情况下mysqldump会完全按照我的意愿行事。所以,如果我只是运行:

mysqldump -u root -p[mypassword] --net_buffer_length=16M mydb mytable > mybackup.sql

...对于任何表,无论多大,我都不必担心插入太大,因为mysqldump永远不会创建大于16MB的表。

我不知道还有什么需要--skip-extended-insert,但我无法想象我将不得不再次使用它。

1 个答案:

答案 0 :(得分:3)

mysqldump根据你的my.ini设置限制它的行长度,可能在你的客户端上它们比你的服务器小。选项为net_buffer_length

通常你会遇到另一个问题:在大型服务器上,这个选项有一个很大的值,当你连续获得512 MB的行时,就无法插入到本地数据库或测试数据库中。 / p>

Option

从那里被盗:

  

要检查此变量的默认值,请使用:mysqldump   --help | grep net_buffer_length

     

对我而言,这几乎是1 MB(即1046528)并且它产生了巨大的成本   转储文件中的行。根据5.1文档   变量可以在1024和1048576之间设置。但是对于任何值   低于4096它告诉我这个:警告:选项&#39; net_buffer_length&#39;:   无符号值4095调整为4096.所以可能是我的最小值   系统设置为4096。

     

倾倒这导致了更多理智的SQL文件:mysqldump   --net_buffer_length = 4096 --create-options --default-character-set =&#34; utf8&#34;主机=&#34;本地主机&#34; --hex-blob --lock-tables --password --quote-names --user =&#34; myuser&#34; &#34; MyDatabase的&#34; &#34; MYTABLE&#34; &GT; mytable.sql