SQLCMD Restore работает в Management Studio, но не из командной строки DOS. - PullRequest
3 голосов
/ 25 апреля 2010

Есть идеи, почему моя команда восстановления прекрасно работает при запуске в Management Studio 2008, но не при запуске из командной строки dos?

Ниже показана ошибка при запуске из командной строки DOS.

C:\>SQLCMD -s local\SQL2008 -d master -Q "RESTORE DATABASE [Sample.Db] FROM  DISK = N'C:\Sample.Db.bak' WITH  FILE = 1,  MOVE N'Sample.Db' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db.mdf',  MOVE N'Sample.Db_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 10" 
Msg 3634, Level 16, State 1, Server GAUTAM, Line 1
The operating system returned the error '32(The process cannot access the file because it is being used by another process.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db.mdf'.
Msg 3156, Level 16, State 8, Server GAUTAM, Line 1
File 'Sample.Db' cannot be restored to 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db.mdf'. Use WITH MOVE to identify a valid location for the file.
Msg 3634, Level 16, State 1, Server GAUTAM, Line 1
The operating system returned the error '32(The process cannot access the file because it is being used by another process.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db_log.ldf'.
Msg 3156, Level 16, State 8, Server GAUTAM, Line 1
File 'Sample.Db_log' cannot be restored to 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db_log.ldf'. Use WITH MOVE to identify a valid location for the file.
Msg 3119, Level 16, State 1, Server GAUTAM, Line 1
Problems were identified while planning for the RESTORE statement. Previous messages provide details.
Msg 3013, Level 16, State 1, Server GAUTAM, Line 1
RESTORE DATABASE is terminating abnormally.

Однако, если я выполню это непосредственно в Management Studio 2008, все будет работать нормально:

RESTORE DATABASE [Sample.Db] FROM  DISK = N'C:\Sample.Db.bak' WITH  FILE = 1,  MOVE N'Sample.Db' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db.mdf',  MOVE N'Sample.Db_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\Sample.Db_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 10

Нет проблем с блокировкой или безопасностью, база данных не существует на сервере.

Не могу понять.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2010

Я нашел свою проблему. Я использовал командную строку, которая не так:

 SQLCMD -s local\SQL2008 ...

Это был -s. Это не переключатель имени сервера, а переключатель colseparator

Правильный путь будет (обратите внимание на заглавную S и localhost):

 SQLCMD -S localhost\SQL2008 ...

Проблема решена, ребята, спасибо, что нашли время посмотреть. :)

1 голос
/ 25 апреля 2010

SQLAcid: похоже, работает:

C:\>SQLCMD -s local\SQL2008 -d master -Q "CREATE DATABASE [junk];"

C:\>SQLCMD -s local\SQL2008 -d master -Q "BACKUP DATABASE [junk] TO DISK='C:\junk.bak'"
Processed 152 pages for database 'junk', file 'junk' on file 1.
Processed 2 pages for database 'junk', file 'junk_log' on file 1.
BACKUP DATABASE successfully processed 154 pages in 0.182 seconds (6.892 MB/sec).

C:\>SQLCMD -s local\SQL2008 -d master -Q "RESTORE DATABASE [junk] FROM DISK='C:\junk.bak' WITH  FILE = 1,  MOVE N'junk' TO N'C:\Pr
ogram Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\junk.mdf',  MOVE N'junk_log' TO N'C:\Program Files\Microsoft SQL Serve
r\MSSQL10.SQL2008\MSSQL\DATA\junk_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 100"
100 percent processed.
Processed 152 pages for database 'junk', file 'junk' on file 1.
Processed 2 pages for database 'junk', file 'junk_log' on file 1.
RESTORE DATABASE successfully processed 154 pages in 0.070 seconds (17.920 MB/sec).

Имейте в виду, моя база данных была первоначально из SQL2005, но я не думаю, что это должно быть проблемой. Что-то должно быть.

1 голос
/ 25 апреля 2010

Можете ли вы попробовать создать тестовую базу данных, создать ее резервную копию, удалить ее и восстановить в сеансе SQLCMD. т.е.

SQLCMD
Create database junk
go
Backup database junk to disk='c:\junk.bak'
go
Drop database junk 
go
Restore database junk from disk='c:\junk.bak'....

Если это работает, что может быть другим? Большая резервная копия другой базы данных? У вас есть антивирусное программное обеспечение, которое может сканировать его? Если вы сомневаетесь, запустите Sysinternals Filemon во время восстановления SQLCMD.

0 голосов
/ 25 апреля 2010

Снято в темноте, но вы запускаете приглашение CMD от имени администратора? Если нет, можете ли вы попробовать?

...