mysqldump 的 --extended-insert 选项是否有任何特定范围,它将 1024 条语句分组,然后使用另一个扩展插入。
我的表在转储数据时有超过 1000 万行我没有更改最大允许数据包大小(它设置为 100 MB)并且我的表大小超过 10 GB
我认为您正在寻找--net_buffer_length
和/或--max_allowed_packet
. 它们是一般客户端设置,但它们控制每个包的大小,即使对于 mysqldump 也是如此。
我知道这有点过时了,但如果有人再次陷入困境,这将对他有所帮助。这里的问题是mysql引擎在执行mysqldump命令后会将所有表缓存在RAM中,完成后会写入磁盘。当表缓存大于服务器 RAM 的大小时,我们将遇到问题。为了桥接使用--quick选项(例如:mysqldump -h sitename.com -u root -ppass_word -x --all-databases --quick > dump_file_name.sql),它将直接写入磁盘。除了选项名称之外,此选项并不比带缓冲区的BU快。
我最近遇到了同样的问题,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 万条记录,我没有检查 :)
如果要分组 1024 个插入语句,首先获取语句的长度。例如,长度为 50 个字符,总长度为 50K。在这种情况下,请尝试
$ mysqldump --net_buffer_length=50K [and your other arguments]
正如 Andreas 指出的那样,您应该设置net_buffer_length
并观看max_allowed_packet
。mysqldump
withnet_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
。