使用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中?
答案 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
我希望这会有所帮助