Powershell管道文件内容到应用程序而不在内存中加载文件

时间:2011-01-25 00:52:28

标签: mysql powershell

使用cmd我运行mysql -uroot database < filename.sql来导入数据库转储(从文件读取并传递给MySQL)。但是,<在powershell中是“保留的”。

相反,在powershell中我使用get-content filename.sql | mysql -uroot database。需要注意的是,powershell会将filename.sql 完全读入内存,然后再将其传递给MySQL,而对于大型数据库转储,它只会耗尽内存。

显然,我可以通过cmd执行此操作,但是我有一些PowerShell脚本可以自动完成各种任务,我不想再批量重写它们。在这种特殊情况下,filename.sql是自动启动时通过PS参数指定的变量。

那么如何解决这个内存限制呢?有没有其他方法可以直接将文件内容传送到MySQL中?

5 个答案:

答案 0 :(得分:16)

你可以尝试

mysql -uroot -pYourPassword -e "source C:\temp\filename.SQL"

mysql --user=root --password=YourPassword --execute="source C:\temp\filename.SQL"

如果事情开始变得复杂,你可能应该编写一个执行复杂任务的C​​#控制台应用程序。

答案 1 :(得分:2)

不确定这是否适用于您的应用程序(它应该一次处理1000个记录的块,而不是一次处理所有文件):

get-content filename.sql -readcount 1000 |% {$_ | mysql -uroot database}

答案 2 :(得分:0)

我说要远离大型文件的cmdlet。我已经做了类似于长达3000多万行的文件,并且使用下面的代码没有问题。它在速度和内存消耗方面都表现得非常好。

$reader = [IO.File]::OpenText($filetoread)
while ($reader.Peek() -ge 0) {
   $line = $reader.ReadLine()

   #do your thing here

}
$reader.Close()

答案 3 :(得分:0)

Windows cmd(以 postgre 为例,单独翻译): psql -h 127.0.0.1 -p 5432 -f database.sql -U .... ....

答案 4 :(得分:-2)

简单的方法和经过测试的是:

Get-Content .\buTable.sql | mysql -uuser -ppassword destDatabase

我希望这会有所帮助