使用批处理文件将文本文件批量导入到MySQL

时间:2019-04-18 04:02:27

标签: windows batch-file cmd

我要在一个文件夹中导入每个文件包含50,000行的文本文件,并带有批处理文件。批处理文件当前逐个导入每个文件,但随着时间的推移会降低LOT的速度。但是,如果我将其关闭并再次打开,它会再次快速启动,然后随着时间的推移变慢。我想知道是否有人有什么想法可以保持速度,这样我就可以运行它而无需经常检查。

在导入完成后,我尝试使它删除导入的文件,但是没有足够的经验进行测试。

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'"

2 个答案:

答案 0 :(得分:1)

@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%"
)

我对MySQL语法的了解很少 我知道SQLite,因此方法可能相似。

如果以下情况,您可能会发现Transactions更快 您需要处理许多语句。

此代码将使用以下命令创建一个sql文件: 事务性BEGINCOMMIT语句。 事务中的Sql语句将被处理 作为一个完整的批次。 这意味着数据库将锁定并打开一次, 执行sql语句的事务, 然后将解锁并关闭数据库。

如果未定义名为commit的变量, 那么mysql.exe将不会作为无sql语句运行 被回显到sql文件。

答案 1 :(得分:0)

让我们尝试一下。

@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

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

对于删除部分,您会注意到文件echo del /Q *.txt末尾的代码行,这将纯粹echo删除文件夹中所有txt个文件的删除命令,仅在脚本完成整个运行之后,如果您100%确定要在文件完成后删除该文件,然后只需从该行中删除echo,请注意,如果删除该文件,它将然后删除所有文件。