私は毎日、別の組織から sftp で取得したデータベースを復元する PowerShell スクリプトを持っています。最近、さらに大きなデータベースを受け取り始めました。MySQL は、v 5.6 で実行されている Azure サービスです。一時的な v5.7 でも試してみました。スクリプトは 700 MB のファイルでは機能しますが、1 GB を超えるファイルでは失敗します。デスクトップまたはサーバーで MySQL Workbench を使用すると機能するため、サーバーのメモリ制約ではありません。
コードスニペットは[PowerShell 経由で MySQL データベースを復元する:
$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