2011-12-11 43 views
0

我有一个1GB的sql文本文件,我正在导入MySQL。 我已经使用了一个'大文本文件查看器',并且可以看到它是一个std mysql表格导出 - 从drop table开始,然后创建新表格然后插入。注意:我也有一张csv的表格。MySQL大表导入

我用下面的方法将其导入:

  1. php.ini中 - 的upload_max_filesize,memory_limit的和post_max_size设置(这些增加的大小,但它仍然说,这是太大 - 做这些数字非常大 - 默认号码后10个零)。

  2. C:\ wamp \ bin \ mysql \ mysql5.1.53 \ bin> mysqlimport -h localhost -u root -p --fields -t erminated-by ='\ t'--lines-terminated-by = '\ n' --local测试C:\ TEMP \ filename.csv

  3. 源C:\ TEMP \ filename.sql

我可以看到 '在任务管理器' 的第二2种方法似乎在将整个1GB文件插入到MySQL之前将其移动到内存中。我可以看到每个进程,并慢慢增长到1GB以上,并因错误而失败。

问:是否有一种更好的方法来导入表?有没有办法将整个文件移动到内存中?我第一次使用这么大的sql表。

THX

回答

1

具有如此巨大的出口问题的部分原因是(大概)由于它的冗余。可能有成千上万的“INSERT”命令在一次加载时占用大量内存。

如果您具有与CSV完全相同的数据,我会做的是创建一个小型PHP脚本,逐行扫描CSV文件并动态创建INSERT sql查询,然后执行它。这应该保持内存占用非常低,因为您可以在每次插入后继续替换临时变量的值(对应于字段)。

我已经链接到我尝试使用的函数。这就是所谓的fgetcsv。该链接还有一些示例脚本,我相信这些脚本可能对其他用户创建的应用程序有用。

祝你好运!

fgetcsv PHP function to use for the line-by-line read

0

尽量不要使用--local选项,如果你能。

documentation

当使用本地与LOAD DATA,一个文件的副本在服务器的临时目录中创建。这不是由tmpdir或slave_load_tmpdir的值确定的目录,而是操作系统的临时目录,并且不能在MySQL服务器中配置。 (通常,Linux系统上的系统临时目录为/ tmp,Windows上为C:\ WINDOWS \ TEMP。)在此目录中缺少足够的副本空间可能导致LOAD DATA LOCAL语句失败。

由于mysqlimport实用程序基本上是LOAD DATA INFILE语句的包装,因此这也适用于您。