1

mysqldump 的 --extended-insert 选项是否有任何特定范围,它将 1024 条语句分组,然后使用另一个扩展插入。

我的表在转储数据时有超过 1000 万行我没有更改最大允许数据包大小(它设置为 100 MB)并且我的表大小超过 10 GB

4

4 回答 4

1

我认为您正在寻找--net_buffer_length和/或--max_allowed_packet. 它们是一般客户端设置,但它们控制每个包的大小,即使对于 mysqldump 也是如此。

于 2013-04-08T11:36:00.240 回答
1

我知道这有点过时了,但如果有人再次陷入困境,这将对他有所帮助。这里的问题是mysql引擎在执行mysqldump命令后会将所有表缓存在RAM中,完成后会写入磁盘。当表缓存大于服务器 RAM 的大小时,我们将遇到问题。为了桥接使用--quick选项(例如:mysqldump -h sitename.com -u root -ppass_word -x --all-databases --quick > dump_file_name.sql),它将直接写入磁盘。除了选项名称之外,此选项并不比带缓冲区的BU快。

于 2015-06-01T15:59:09.167 回答
0

我最近遇到了同样的问题,1.1gb 数据库导出--opt但有很多记录,而且导入速度非常慢,我离开了一夜,第二天早上它仍在导入,所以我决定停下来重新开始。

发现这有很大帮助https://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

我进入 mysql shell 并运行:

mysql> SET autocommit=0;
mysql> SET unique_checks=0;
mysql> SET foreign_key_checks=0;
mysql> SOURCE my_database.sql;

并开始看到:

Query OK, 12315 rows affected (0.34 sec)
Records: 12315  Duplicates: 0  Warnings: 0

等等..基本上每秒运行大约 36k 次插入,但加班速度确实变慢了..

Query OK, 12305 rows affected (1.68 sec)
Records: 12305  Duplicates: 0  Warnings: 0

解释很简单,自动提交基本上在每次插入时都会刷新到磁盘,即使使用--extended-insert(默认情况下使用 with --opt)但禁用它会在提交到磁盘之前尽可能多地分组,所以我能够在刷新之前对大约 12k 条记录进行分组,其他选项禁用关键检查以提高性能。

以这个速度,我可以在半小时甚至更短的时间内导入 1300 万条记录,我没有检查 :)

于 2014-06-13T15:22:40.427 回答
0

如果要分组 1024 个插入语句,首先获取语句的长度。例如,长度为 50 个字符,总长度为 50K。在这种情况下,请尝试

$ mysqldump --net_buffer_length=50K [and your other arguments]

正如 Andreas 指出的那样,您应该设置net_buffer_length并观看max_allowed_packetmysqldumpwithnet_buffer_length = 50K创建长达 50K 的扩展插入语句。4K 是net_buffer_length. 您也可以将选项放入

my.cnf

[mysqldump]
net_buffer_length = 50K

您的 Mysql 服务器系统的值必须大于您为客户端设置的值。my.cnf [mysqld] net_buffer_length = 1M例如。它的最大值是1M

max_allowed_packet必须比这大得多。这是您的客户端/服务器将通信的单个语句的数据包大小。max_allowed_packet的默认值为MySQL 5.716M最高可达1G

于 2018-04-11T04:22:06.610 回答