2011-01-13 21 views
3

私は毎晩MySQLデータベースをmysqldumpを使ってバックアップするPowershellスクリプトを用意しています。これはうまくいきますが、prod db(db2)のバックアップからレポートdb(db1)を更新するためにスクリプトを拡張したいと思います。私は次のテストスクリプトを書いたが動作しません。私はCommandTextへのSQLファイルの読み込みが問題だと感じていますが、どのようにデバッグするのか分かりません。Powershellを使用してMySQLに対してSQLスクリプトを実行する

[system.reflection.assembly]::LoadWithPartialName("MySql.Data")  
$mysql_server = "localhost" 
$mysql_user = "root" 
$mysql_password = "password" 
write-host "Create coonection to db1" 
# Connect to MySQL database 'db1' 

$cn = New-Object -TypeName MySql.Data.MySqlClient.MySqlConnection 
$cn.ConnectionString = "SERVER=$mysql_server;DATABASE=db1;UID=$mysql_user;PWD=$mysql_password" 
$cn.Open() 
write-host "Running backup script against db1" 
# Run Update Script MySQL 
$cm = New-Object -TypeName MySql.Data.MySqlClient.MySqlCommand 
$sql = Get-Content C:\db2.sql 
$cm.Connection = $cn 
$cm.CommandText = $sql 
$cm.ExecuteReader() 
write-host "Closing Connection" 
$cn.Close() 

ご協力いただければ幸いです。ありがとう。

+0

私が原因私の無知に( 'Mysql.Data'部分が何であるかを理解していません先進的なPowershellの、それが不明確ではないからです)。しかし、代わりにコマンドラインのmySQLクライアントを使用する方が簡単でしょうか? –

+0

Pekka PowerShellを使用しているので、毎晩タスクスケジューラを使用して実行できます。ありがとうKeith。 – abarr

答えて

3

このライン:

$sql = Get-Content C:\db2.sql 

は、文字列の配列を返します。それが文字列を期待するものに割り当てられると、PowerShellは$OFS(出力フィールドセパレータ)変数の内容を使用して、文字列の配列を1つの文字列に連結します。この変数が設定されていない場合、デフォルトのセパレータは単一のスペースです。代わりにこれを試してみて、それが動作するかどうかを確認:

$sql = Get-Content C:\db2.sql 
... 
$OFS = "`r`n" 
$cm.CommandText = "$sql" 

それとも、PowerShellを2.0にしている場合:

$sql = (Get-Content C:\db2.sql) -join "`r`n" 
+0

私は上記(私はPS 1を使用しています)を試みたが、例外を得る: – abarr

+1

そして例外は何ですか? –

+0

引数が "0"の "ExecuteReader"を呼び出す例外: "コマンド実行中に致命的なエラーが発生しました。" Cで :\ mysqlbackup \スクリプト\ mysqlbackup.ps1:86文字:18 + $ cm.ExecuteReader <<<<() + CategoryInfo:NotSpecified:(:) []、MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException – abarr

関連する問題