У меня есть скрипт PowerShell, который ежедневно восстанавливает базу данных, загруженную по sftp из другой организации. Недавно начал получать еще одну базу данных, которая намного больше. MySQL — это служба Azure, работающая под управлением версии 5.6. Я также пробовал ее на временной версии 5.7. Скрипт работает для файлов размером 700 МБ, но дает сбой при размере файла > 1 ГБ. Использование MySQL Workbench на моем рабочем столе или на сервере работает, так что это не ограничение памяти на сервере.
Фрагмент кода очень похож на [восстановление базы данных mysql через powershell:
$MySQLHost = 'aaaa.mysql.database.azure.com'
$MySQLAdminUserName = 'bbbb@aaaa-qa'
$MySQLAdminPassword = 'zzzzz'
$MySQLDatabase = 'abcde'
$MyFilePath = "C:\SFTP\qcis_backup\"
$MyUnzipDirectory = $MyFilePath + "database" + "\"
$MyDumpFilePath = $MyUnzipDirectory + "dump.sql"
get-content $MyDumpFilePath | &"C:\Program Files\MySQL\MySQL Workbench 8.0 CE\mysql.exe" -h $MySQLHost -u $MySQLAdminUserName --password=$MySQLAdminPassword --database=$MySQLDatabase
Возникает следующая ошибка:
Не удалось запустить программу «mysql.exe»: возникло исключение типа «System.OutOfMemoryException»
Я думаю, это из-за того, что get-content передается в mysql cmd и пытается загрузиться в память. Есть ли способ обработать это по-другому? Искал примеры некоторое время, но не нашел ни одного, который мог бы легко использовать.
Будем признательны за любую помощь.
решение1
Хотелось бы найти ответ самому, но заслуга в этом принадлежит службе поддержки Microsoft.
$MySQLcmd = -join("&","`"C:","\Program Files\MySQL\MySQL Workbench 8.0 CE\mysql.exe`"")
$MySQLcmd = -join($MySQLcmd," -h ", $MySQLHost, " -u ",$MySQLAdminUserName," --password=",$MySQLAdminPassword," --database=",$MySQLDatabase," -e `"source ",$MyDumpFilePath,"`"")
invoke-expression $MySQLcmd