【问题标题】:csv import works for tiny test file, not for actual file, no errors, mysqlcsv 导入适用于微小的测试文件,不适用于实际文件,没有错误,mysql
【发布时间】:2015-10-04 09:35:34
【问题描述】:

我有一个很大的 .csv (300krows) 并称之为 medium.csv,我正试图将它导入 MySQL 表。当我在 medium.csv 上执行导入命令时,我在 mysql 工作台中得到反馈“0 行受影响”,没有警告,表不受影响。

在尝试进行故障排除时,我开始研究 csv 的迷你版本,我通过在 excel 中打开 medium.csv 并将前 5 行剪切并粘贴到新文件 tiny.csv 中创建了该版本。效果很好:

DROP TABLE IF EXISTS USER_DATA;
CREATE TABLE USER_DATA (UID INT, INSTALL_DATE DATE, PLATFORM_TYPE VARCHAR(10), COUNTRY_TYPE VARCHAR(11));

LOAD DATA LOCAL INFILE 'E:\\Heather Data\\H Docs\\test\\tiny.csv'
into table USER_DATA
fields terminated by ',' enclosed by '"'
lines terminated by '\r\n'
ignore 1 lines
(uid,
@install_date,
platform_type,
country_type)
set 
install_date = str_to_date(@install_date, '%d/%m/%Y');

当我在位于同一文件夹中的 medium.csv 上运行此程序时,处理时间已用完,但没有任何反应,Ig et 没有警告,并且目标表不受影响。

你能给我一些关于如何排除故障的提示吗?我真的很困惑为什么小文件可以工作而中文件不能。

列数据类型或 medium.csv 的文件格式中的错误会导致此行为吗?

如果我无法解决此方法,是否可以使用其他导入方法?

感谢您提供的任何建议,

希瑟

【问题讨论】:

  • medium.csv 会在 60 秒后发声吗?
  • 因为问题未知,所以你可以尝试一些不同的方法来解决这个问题。 1) 将会话中的 wait_timeout 变量更改为某个高值。如果设置低数字。 2)也可以像sqlyog一样从gui检查它可能会给你一些线索。 3) 也可以在增加 max_allowed_pa​​cket 变量大小后进行检查。
  • 我已经通过放宽媒体输入文件的一些规范来使其工作,我删除了封闭的并终止了。唷。因此,通过将 tiny.csv 往返进出 excel 可能会解决格式问题。或者文件后面出现格式问题。
  • 在我工作过的其他环境中,总是有一种安全的普通方法来爬上结构不可靠的文件内容,例如读取为字符串然后进行转换。不确定在 MySQL 上下文中通常如何处理?通过在其他环境中进行预处理?

标签: mysql csv upload


【解决方案1】:

最好运行以下命令来查看系统上处于活动状态的超时时间。

SELECT @@global.wait_timeout, 
@@global.interactive_timeout, 
@@session.wait_timeout, 
@@session.interactive_timeout;

如果它们设置得太低,比如 60(秒),那么在那个时间段之后 mysql 会认为操作花费的时间太长并终止它。因此,如果您处于更新或加载语句的中间,它本身就是一个事务,它将失败并且不会发生任何事情(因为它是一个事务)。

在像 GoDaddy 这样的托管环境中,您的选择是减少任何一个批次的大小,因为您无法更改服务器配置。

在您以 root 身份控制的系统上,可以对服务器环境进行更改以增加 mysql 允许长时间运行的查询完成的时间。

选项

A. 全局级别意味着所有新连接都继承超时值 可以修改/etc/my.cnf

wait_timeout = 600
interactive_timeout = 600

这些是 10 分钟的值,只有在 mysql 重启后才会生效。

无需重新启动即可执行该编辑,但现在通过执行以下操作即可生效:

mysql -uroot -p -e"SET GLOBAL wait_timeout=600; SET GLOBAL interactive_timeout=600;"

B. 连接级别调整会在断开连接时消失。通常适用于进行更改和取消更改包装时间冗长的例程。

set @@wait_timeout=1000 -- 对会话 wait_timeout 的更改

在连接结束时,如果修改会话 wait_timeout 将被遗忘,并且在重新连接时默认值恢复为全局。

【讨论】:

  • 真的很有用,我会检查一下。可能是格式放松允许它在时间范围内运行!毕竟,它不是修复它的格式。我在 Windows 环境中运行(是的,我知道!;-) - 并通过 mysql 工作台进行交互。不知道如何通过它更改配置 - 将尝试弄清楚。发送! p.s. 3600 中的 10 分钟值是什么意思? 3600 相当于旧货币(即更多标准时间符号)。注意,如果证明是问题,我会接受。
  • 有时默认为 28800 = 24 小时
  • 是的,我正在使用 28800 默认值的 atm 运行,所以有足够的时间。所以我再次怀疑格式问题。为了让自己感觉很舒服,我可能应该对文件进行预处理,因为那样我就会知道发生了什么......
  • 我怀疑我的胡言乱语与此无关。把它放在你的架子上供另一个系统使用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多