我有一个相当大的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_buffer
和query_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
,但我无法想象我将不得不再次使用它。
答案 0 :(得分:3)
mysqldump根据你的my.ini设置限制它的行长度,可能在你的客户端上它们比你的服务器小。选项为net_buffer_length
。
通常你会遇到另一个问题:在大型服务器上,这个选项有一个很大的值,当你连续获得512 MB的行时,就无法插入到本地数据库或测试数据库中。 / p>
从那里被盗:
要检查此变量的默认值,请使用: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