mysql - 加载本地数据文件的解决方法?

标签 mysql

我的虚拟主机已升级其服务器。他们安装的较新的 5.7.27 版本的 MySQL 有 LOAD DATA LOCAL INFILE默认情况下禁用,导致当我尝试执行该命令时出现错误 1148。不幸的是,我无法启动或停止 MySQL 实例,因为它是在 Web 主机的控制之下。有哪些解决方法或替代方法可以让我以最少的努力导入数据?我想要导入的所有数据目前均为 TSV(制表符分隔值)格式,但如果需要,我可以切换为 CSV 或其他格式。如果有帮助的话,我也安装了 Workbench。

问题与this one基本相同,但我无法访问和重新配置服务器(该问题的选定答案)。

最佳答案

我会编写一个 Python 脚本来获取 TSV 输入,并使用它在循环中生成 INSERT 语句。每个语句可能会处理 100-200* 个新行。然后它会执行这些语句。

在同一服务器上运行它。在事务中执行此操作,这样如果出现错误,您就不会在前几次尝试中陷入困惑。

现在你已经完成了:TSV 导入。

* 或者,好吧,无论你想要什么。一次执行一个操作会很慢(因为每个 SQL 语句的执行都会产生很小的开销),但您可能无法将它们全部转储到单个 INSERT 中,除非数量的信息量很小。检查您的服务器设置/限制,并为您的用例提出合理的批量大小。对于 <2000 行和相当“短”的行数据,每个语句 100-200 行通常是合适的。

<小时/>

伪代码:

batchSize = 100
buffer = []

handleInput():
   for each line in tsvFile:
       data = parse(line)
       add data to buffer
       if size(buffer) > batchSize:
          flushBuffer
   if size(buffer) > batchSize:
      flushBuffer

flushBuffer:
    str = "INSERT INTO tbl (col1, col2, col3) VALUES"
    for each row in buffer:
       if !str.empty():
          str += ","
       str += "(" + row[col1] + ", " + row[col2] + ", " + row[col3];
    executeSqlStatement(str)
    buffer = []

关于mysql - 加载本地数据文件的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59515701/

相关文章:

mysql - 我可以有几个 'similar' 数据库表来减少检索时间吗

mysql - (2006, 'MySQL server has gone away') 的解决方法?

php - 用MySQL取一个特定的数据,Group by

mysql - 是否可以连接到查询,但在第二个查询之前获取第一个查询的结果?

PHP/Javascript - 更改按钮图像并调用数据库 onClick()?

mysql - 如何使用 JOIN 从两个表中计数

mysql - 在同一行上计数 ""(空字符串)

java - 在 MySQL 查询 Java 中使用撇号

php - 无法从数据库检索列信息

mysql - 从 MySQL 中智能选择