2011-01-13 11 views
3

Ich habe ein Powershell-Skript, das meine MySQL DB jede Nacht mit mysqldump sichert. Das alles funktioniert gut, aber ich möchte das Skript erweitern, um eine Reporting-DB (db1) aus der Sicherung der prod db (db2) zu aktualisieren. Ich habe das folgende Testskript geschrieben, aber es funktioniert nicht. Ich habe das Gefühl, das Problem ist das Lesen der SQL-Datei in den CommandText, aber ich bin mir nicht sicher, wie zu debuggen.Ausführen eines SQL-Skripts gegen MySQL mit Powershell

[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() 

Jede Hilfe wäre willkommen. Vielen Dank.

+0

Ich verstehe nicht, was das 'Mysql.Data' Teil ist (aufgrund meiner Unwissenheit von fortgeschrittener Powershell, nicht weil es unklar ist), aber wäre es nicht einfacher, stattdessen den Befehlszeilen-mySQL-Client zu verwenden? –

+0

Pekka Ich benutze Powershell, damit ich den Taskplaner verwenden kann, um es jede Nacht auszuführen. – abarr

Antwort

3

Diese Zeile:

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

Gibt ein Array von Strings. Wenn das einem Element zugewiesen wird, das eine Zeichenfolge erwartet, verkettet PowerShell das Array der Zeichenfolgen mithilfe des Inhalts der Variablen $OFS (Ausgabefeldtrennzeichen) zu einer einzelnen Zeichenfolge. Wenn diese Variable nicht festgelegt ist, ist das Standardtrennzeichen ein einzelnes Leerzeichen. Versuchen Sie stattdessen und sehen, ob es funktioniert:

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

Oder wenn Sie auf Powershell sind 2.0:

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

Danke Keith. Ich habe das obige versucht (ich benutze PS 1), aber bekomme eine Ausnahme: – abarr

+1

Und was ist die Ausnahme? –

+0

Ausnahme beim Aufrufen von "ExecuteReader" mit "0" -Argument (en): "Schwerwiegender Fehler während der Ausführung des Befehls aufgetreten." Bei C: \ mysqlbackup \ scripts \ mysqlbackup.ps1: 86 Zeichen: 18 + $ cm.ExecuteReader <<<<() + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException – abarr

Verwandte Themen