使用--extended-insert选项的mysqldump用法

时间:2013-04-08 11:25:59

标签: mysql mysqldump

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

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

4 个答案:

答案 0 :(得分:1)

我认为您正在寻找--net_buffer_length和/或--max_allowed_packet。它们是常规客户端设置,但它们控制每个包甚至对mysqldump的大小。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我最近遇到了同样的问题,1.1gb数据库导出了--opt,但导入的记录和veeery很慢,我放了一夜,第二天早上它还在导入,所以我决定停下来重新开始。

发现这有很多帮助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

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

按照这个速度,我能够在半小时或甚至更少的时间内导入1300万条记录,我没有检查过:)

答案 3 :(得分:0)

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

UIView.animate(withDuration: 0.5) {
                self.MainScollView.contentOffset.y = 90
            }

正如安德烈亚斯指出的那样,你应该设置$ mysqldump --net_buffer_length=50K [and your other arguments] 并注意net_buffer_lengthmax_allowed_packet mysqldump创建了长达50K的扩展插入语句。 4K是net_buffer_length = 50K的最小值。您也可以将选项放在

net_buffer_length

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

1M必须远大于此。这是客户端/服务器将通信的单个语句的数据包大小。 max_allowed_packet的默认值为max_allowed_packet,MySQL 5.7最高可达16M