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.
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
@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