2017-03-10 5 views
0

Ich versuche, eine SQL Server-Datenbank mit einem PHP-Skript wiederherzustellen, und es schlägt fehl. Ich bin auf PHP 7.0.4 NTS x86. Da mein Code in einem Rahmen ausgeführt wurde, entschied ich mich zu isolieren und lief Code, den ich hier (die auch in einer anderen Antwort auf Stackoverflow hingewiesen wurde): https://blogs.msdn.microsoft.com/brian_swan/2010/07/01/restoring-a-sql-server-database-from-php/Skript zum Wiederherstellen der SQL Server-Datenbank schlägt fehl

Der Code ist wie folgt:

// Set error mode to make sure errors throw exceptions 
sqlsrv_configure('WarningsReturnAsErrors', 1); 

// Try to connect 
$conn = sqlsrv_connect(
    'localhost', 
    ['Database'=>'master', 'UID'=>'sa', 'PWD'=>'mypassword', 'ReturnDatesAsStrings'=>true, 'CharacterSet'=>'UTF-8'] 
); 

$sql = "RESTORE DATABASE MYDB FROM DISK='c:\\MYDB.bak' WITH RECOVERY"; 
echo $sql."<br>"; 
$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors())); 
} 
else 
{ 
    echo "Database restored</br>"; 
} 

//Put DB into usable state. 
$sql = "USE MYDB"; 
echo $sql."<br>"; 
$stmt = sqlsrv_query($conn, $sql); 
if($stmt === false) 
{ 
    die(print_r(sqlsrv_errors())); 
} 
else 
{ 
    echo "Using MYDB</br>"; 
} 

Dies ist die Ausgabe, die erste Anw $ === falsch ist wahr, und es gibt den Fehler:

RESTORE DATABASE MYDB FROM DISK='c:\MYDB.bak' WITH RECOVERY 
Array 
(
    [0] => Array 
     (
      [0] => 01000 
      [SQLSTATE] => 01000 
      [1] => 4035 
      [code] => 4035 
      [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Processed 5496 pages for database 'MYDB', file 'DB_Data' on file 1. 
      [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Processed 5496 pages for database 'MYDB', file 'DB_Data' on file 1. 
     ) 

) 
1 

die DB erstellt wird, sondern erscheint nur Modus in Wiederherstellen. Wenn ich versuche, denselben Befehl von SSMS mit demselben Benutzer auszuführen, funktioniert es einwandfrei. Eine weitere interessante Sache ist, wenn ich auf dem SQL Server-Protokoll sehen, ich sehe dies nach jedem Versuch:

2017-03-10 09:33:12.37 spid57  The database 'MYDB' is marked RESTORING and is in a state that does not allow recovery to be run. 
2017-03-10 09:33:34.76 spid57  Starting up database 'AdventureWorks2008R2'. 
2017-03-10 09:33:34.80 spid57  Starting up database 'ReportServer'. 
2017-03-10 09:33:34.83 spid57  Starting up database 'ReportServerTempDB'. 

nicht sicher, warum es beginnt oben die gleichen 3-Datenbanken jedes Mal nach der Wiederherstellung versucht.

Ich habe auch versucht, die Wiederherstellung mit PDO, dasselbe Ergebnis, eine Datenbank im Wiederherstellungsmodus stecken.

+0

Hier im Dunkeln geschossen, aber fragen Sie sich, ob die 'USE MYDB' Abfrage ausgeführt wird, bevor die Wiederherstellung abgeschlossen ist. Kannst du etwas Hackiges wie einen 'sleep()' zwischen deinen Abfragen werfen, um zu sehen, ob das funktionieren könnte? – WillardSolutions

+0

@EatPeanutButter Es kommt wegen des Die() nie zu diesem Teil des Codes. Aber da seltsame Dinge passiert sind, habe ich es trotzdem versucht, und es hat bestätigt, das Script schläft nie, weil es nie so weit kommt. – Rocket04

Antwort

0

SQL Server druckt Warnungen und Fehler auf die gleiche Weise - nur mit einem anderen Schweregrad, so dass die Client-Software den Unterschied erkennen und geeignete Maßnahmen ergreifen kann.

Ich weiß nicht, PHP, also bin ich nicht sicher, was Sie mit der Linie

sqlsrv_configure('WarningsReturnAsErrors', 1); 

Aber von den Klängen der es versuchen zu erreichen, dass sich die untere Schwere „Warnung“ zu machen Nachrichten von SQL Server werden von Ihrem Client-Code als tatsächliche Fehler behandelt. Setzen Sie das auf 0, und ich schätze, Ihr Skript wird weiterhin an den Nachrichten der Wiederherstellungsdatenbank vorbeilaufen und sie als informative statt als Ausnahmen behandeln.

+0

Ich kam zu dieser Erkenntnis kurz nach dem Posten. Wenn man bedenkt, dass es keinen Sinn ergab, dass der gleiche Text, der beim Erfolg in SSMS ausgegeben wird, als ein Fehler ausgegeben wurde, wurde angenommen, dass es wahrscheinlich war, dass eine Warnung in einen Fehler umgewandelt wurde und der Prozess angehalten wurde. Sieht so aus, als hättest du es viel schneller herausgefunden als ich es getan habe, danke für die Antwort, du hast selbst einen Gewinner bekommen! – Rocket04

Verwandte Themen