首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用批处理文件将文本文件大容量导入到MySQL

问使用批处理文件将文本文件大容量导入到MySQL
EN

Stack Overflow用户
提问于 2019-04-18 12:02:27
回答 2查看 417关注 0票数 0

我正在导入一个文件夹中的文本文件,每个文件有50,000行,带有一个批处理文件。批处理文件当前按1个文件导入每个文件,但随着时间的推移,速度会减慢很多。但如果我关闭它,再打开它,它又开始得很快,然后随着时间的推移,它变慢了。我想知道是否有人有任何想法来保持速度,以便我可以运行它,而不是经常检查它。

我试过让它在完成导入后删除它导入的文件,但在批量处理方面没有足够的经验来测试它。

代码语言:javascript
复制
FOR %%f IN (*.txt) DO "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:/Newfolder/dd/%%f' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"
EN

回答 2

Stack Overflow用户

发布于 2019-04-18 18:03:40

代码语言:javascript
复制
@echo off
setlocal

set "sqlfile=loadData.sql"
set "folder=D:/Newfolder/dd"

(
    set "commit="
    echo BEGIN;

    for %%f in ("%folder%/*.txt") do (
        echo LOAD DATA INFILE '%folder%/%%~nxf' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';
        set "commit=defined"
    )

    echo COMMIT;
) > "%sqlfile%"

if defined commit (
    "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename < "%sqlfile%"
)

虽然我知道SQLite,但我对MySQL语法知之甚少,所以方法可能是相似的。

您可能会发现,如果您有许多语句要处理,Transactions会更快。

这段代码将使用事务性BEGIN和COMMIT语句创建一个sql文件。事务中的Sql语句将被视为完整的批处理。这意味着数据库将锁定并打开一次,执行sql语句的事务,然后解锁并关闭数据库。

如果没有定义名为sql的变量,那么mysql.exe将不会运行,因为没有任何commit语句被回显到sql文件中。

票数 1
EN

Stack Overflow用户

发布于 2019-04-18 14:12:50

让我们试一试。

代码语言:javascript
复制
@echo off
setlocal enabledelayedexpansion
set "_sqlcmd=C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe"
set cnt=1
for %%i in (*.txt) do (
     set id=%%i
     call :check
)

:check
for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "mysql"') do set procs=%%a
if !procs! leq 20 (
    if not "!id!"=="%0" "%_sqlcmd" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:\Newfolder\dd\!id!' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"
    set /a cnt+=1
) else (
    goto check
)
echo del /Q *.txt

它将启动9个mysql进程,如果一个(或多个)关闭,它将启动更多进程,直到我们再次达到20个进程。(您可以增加/减少您希望允许的进程计数)这样,您将不会一次启动太多mysql进程,这最终只会消耗所有的内存和CPU。

至于删除部分,你会注意到在文件的末尾的代码行echo del /Q *.txt这将纯粹的删除命令的文件夹中的所有txt文件,只有当脚本完成整个运行,如果你是100%确定要删除的文件后,它完成了,然后只是删除echo从该行,只是非常清楚,如果你删除它,它将删除所有的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55738964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档