2009-04-02 13 views
1

Im Datenbank aus einer Sicherungwiederherstellen SQL tut Feuer

einfache SQL-Befehl dynamisch mit Anwendungscode wiederherstellen versuchen, für

con.execute("RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "RESTORE DATABASE newdb " & vbcrlf &_ 
     "FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_ 
     "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'") 

wiederherstellen, aber es wird nicht ausgelöst, ich meine keine Fehler versucht, es überprüfen mit sQL Profiler und sehen richtig

RESTORE FILELISTONLY FROM DISK='c:\old.bak' 
RESTORE DATABASE newdb 
FROM DISK='c:\old.bak' 
WITH MOVE 'newdb' TO 'c:\newdb.mdf', 
MOVE 'newdb_log' TO 'c:\newdb_log.ldf' 

wenn ich sQL von sQL Profiler seine Werke laufen

Wie können Sie dieses Problem erklären?

Antwort

0

Versuchen Sie, alle Benutzer in der Datenbank, auf die Sie wiederherstellen möchten, vor dem Ausführen der Wiederherstellung zu löschen. Eine Wiederherstellung schlägt fehl, wenn aktive Verbindungen zur Datenbank bestehen. Es gibt Beispielcode, wie man das tut all over.

Stellen Sie auch sicher, dass Ihre Verbindungszeichenfolge, wenn Sie die Wiederherstellung von Ihrer Anwendung aufrufen keine Verbindung zu der Db Ihre Wiederherstellung zu, aber zu etwas wie Master oder msdb verbindet.

0

Um eine Wiederherstellung durchzuführen, werden Sie blockiert, wenn die Datenbank mit anderen Sitzungen verwendet wird. Stellen Sie sicher, dass Sie für volle 60 Sekunden warten und sehen Sie, ob es Timeout-Fehler gibt.

+0

kann ich "Wartezeit" mit SQL Server, etwas wie Schlaf, gibt es in SQL Server? – Sasha

+0

Ich weiß nicht über das Schlafen in T-SQL, aber Sie können die IDbCommand.CommandTimeout-Eigenschaft in .NET-Objekten festlegen. Dies sind normalerweise 30 Sekunden, während Verbindungstimeouts standardmäßig auf 60 Sekunden eingestellt sind. –

+0

Problem ... seine klassische asp – Sasha

1

Ich denke, die Verbindung, die Sie als Sperre für die Datenbank verwenden, so dass es nicht wiederherstellen kann. Wenn Sie es direkt ausführen, haben Sie nicht.

Was ist damit?

con.execute("USE master" & vbcrlf &_ 
     "RESTORE FILELISTONLY FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "RESTORE DATABASE newdb " & vbcrlf &_ 
     "FROM DISK='c:\old.bak' " & vbcrlf &_ 
     "WITH MOVE 'newdb' TO 'c:\newdb.mdf', " & vbcrlf &_ 
     "MOVE 'newdb_log' TO 'c:\newdb_log.ldf'") 

Oder Ändern der Datenbank in der Verbindungszeichenfolge?