mysqldump使用--扩展插入选项
mysqldump的--extended insert选项是否有特定范围,它将1024条语句分组,然后使用另一个扩展insertmysqldump使用--扩展插入选项,mysql,mysqldump,Mysql,Mysqldump,mysqldump的--extended insert选项是否有特定范围,它将1024条语句分组,然后使用另一个扩展insert 我的表在转储数据时有1000多万行。我没有更改允许的最大数据包大小(设置为100 MB),并且我的表大小超过10 GB。我想您正在查找和/或。它们是一般的客户端设置,但它们控制每个包的大小,即使对于mysqldump也是如此。我最近也遇到了同样的问题,1.1gb的数据库用--opt导出,但由于记录太多,导入速度非常慢,我离开了一夜,第二天早上它仍在导入,所以我决定停止
我的表在转储数据时有1000多万行。我没有更改允许的最大数据包大小(设置为100 MB),并且我的表大小超过10 GB。我想您正在查找和/或。它们是一般的客户端设置,但它们控制每个包的大小,即使对于mysqldump也是如此。我最近也遇到了同样的问题,1.1gb的数据库用
--opt
导出,但由于记录太多,导入速度非常慢,我离开了一夜,第二天早上它仍在导入,所以我决定停止并重新开始
发现这帮了大忙
我进入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
(默认情况下使用--opt
),但禁用该选项将在提交到磁盘之前尽可能多地分组,因此我能够在刷新之前对大约12k条记录进行分组,其他选项禁用密钥检查以提高性能
以这样的速度,我可以在半小时甚至更短的时间内导入1300万条记录,但我没有检查:)我知道这有点困难,但如果有人再次陷入困境,这将对他有所帮助。这里的问题是,mysql引擎在执行mysqldump命令后将缓冲RAM中的所有表,完成后将写入磁盘。当表缓存大于服务器RAM的大小时,我们将遇到问题。要桥接使用--quick选项(例如:mysqldump-h sitename.com-u root-ppass\u word-x--all databases--quick>dump\u file\u name.sql)的数据库,它将直接写入磁盘。除了选项名之外,此选项的速度不比带缓冲区的BU快。如果要分组1024条insert语句,请首先获取语句的长度。例如,长度为50个字符,总长度为50K。在这种情况下,请尝试
$ mysqldump --net_buffer_length=50K [and your other arguments]
正如Andreas指出的,您应该设置net\u buffer\u length
并监视max\u allowed\u packet
mysqldump
withnet\u buffer\u length=50K
创建最长为50K的扩展insert语句。4K是net\u buffer\u length
的最小值。您还可以将该选项放入
my.cnf
[mysqldump]
net_buffer_length = 50K
Mysql服务器系统的值必须大于为客户端设置的值<例如,code>my.cnf[mysqld]
net\u buffer\u length=1M
。它的最大值是1M
max\u allowed\u packet
必须比这个大得多。这是客户端/服务器将要通信的单个语句的数据包大小max_allowed_packet
的默认值是16M
,对于MySQL 5.7,它可以达到1G
何时我应该考虑增加Max Sub EddiePaskTI不知道将它设置为MAX的任何缺点,但我确信它不能是完美的,因为它将是默认的。在您的情况下,将其设置得足够高,以便在转储/加载中获得良好的性能,但请确保两台机器上的设置匹配。