Содержимое файла Powershell pipe в приложение без загрузки файла в память - PullRequest
11 голосов
/ 25 января 2011

При 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?

Ответы [ 4 ]

16 голосов
/ 25 января 2011

Вы можете попробовать

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

или

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

Если все усложняется, возможно, вам следует написать консольное приложение C #, которое выполняет сложные задачи.

2 голосов
/ 25 января 2011

Не уверен, будет ли это работать для вашего приложения или нет (он должен обрабатывать файл кусками по 1000 записей за раз, а не все сразу):

get-content filename.sql -readcount 1000 |% {$_ | mysql -uroot database}
0 голосов
/ 08 февраля 2018

Самый простой и проверенный способ - сделать:

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

Надеюсь, это поможет

0 голосов
/ 27 апреля 2014

Я бы сказал, держись подальше от командлетов для больших файлов.Я делал нечто подобное с файлами длиной более 30 миллионов строк, и у меня не было проблем с использованием приведенного ниже кода.Он отлично работает как по скорости, так и по потреблению памяти.

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

   #do your thing here

}
$reader.Close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...