【问题标题】:Powershell pipe file contents into application without loading file in memoryPowershell管道文件内容到应用程序而不在内存中加载文件
【发布时间】:2011-01-25 00:52:28
【问题描述】:

使用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 中吗?

【问题讨论】:

    标签: mysql powershell


    【解决方案1】:

    你可以试试

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

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

    如果事情开始变得复杂,也许你应该编写一个 C# 控制台应用程序来完成复杂的任务。

    【讨论】:

    • 重新启动并运行。干杯!
    【解决方案2】:

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

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

    【讨论】:

    • 巧妙的技术,但在行数上任意拆分似乎会破坏 SQL 语法。不过,这肯定会在其他地方派上用场,谢谢。 :)
    【解决方案3】:

    我会说远离大文件的 cmdlet。我一直在对 30+ 百万行长的文件做类似的事情,并且使用下面的代码没有遇到问题。它在速度方面和内存消耗方面都表现得非常好。

    $reader = [IO.File]::OpenText($filetoread)
    while ($reader.Peek() -ge 0) {
       $line = $reader.ReadLine()
    
       #do your thing here
    
    }
    $reader.Close()
    

    【讨论】:

    • 当单个sql命令被拆分成多行时,这将不起作用。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2020-06-05
      • 1970-01-01
      • 2015-08-14
      • 2018-10-31
      相关资源
      最近更新 更多