2010-09-03 4 views
6

Я пытаюсь восстановить базу данных в своем экспресс-редакторе SQL Server 2005. Я знаю, что для восстановления базы данных мне нужно сделать ее для одного пользователя. Я даю эту команду, чтобы сделать его одним пользователемне удается восстановить базу данных на сервере sql (single_user)

USE [master] 
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

Эта команда выполняется правильно, и я могу даже увидеть небольшое изображение в обозревателе объектов в этой базе данных, показывая, что это теперь один пользователь.

Теперь я пытаюсь восстановить базу данных, выполнив следующие шаги: -> щелкните правой кнопкой мыши по базе данных и задачам, а затем восстановите базу данных. Я выбираю путь, в котором находится файл резервной копии, и нажимая на восстановление.

Но я до сих пор получаю эту ошибку «Исключительный доступ не может быть получен потому, что база данных используется (microsoft.sqlserver.smo). Я что-то пропустил. У меня есть googled, и все большинство сайтов предлагают, чтобы база данных быть в однопользовательском режиме, и ничто другое

Я не пробовал отсоединение и присоединение метода базы данных я никогда не делал этого раньше, и хотел бы знать, если это безопасно

редактировать:... спасибо для ответов. Оба предложили мне тот же ответ, поэтому я отмечаю один ответ, как выбранный.

Я даже выбрал ove rwrite существующую базу данных из опций.

ответ

4

Во-первых, лучше всего создать резервную копию и восстановить, а не отсоединить и прикрепить.

Во-вторых, скорее всего, сеанс, который вы используете для установки базы данных на SINGLE_USER, является тем, который все еще имеет его при попытке запустить восстановление (поскольку вы используете графический интерфейс, он подключается под своим собственным потому что он не может получить доступ).

Либо выполните восстановление как текстовую команду, либо переключите окно запроса, чтобы сначала использовать другую базу данных, такую ​​как мастер. Или вы можете просто закрыть окно запроса, чтобы оно больше не было подключено.

Вы всегда можете проверить, кто связан с select * from master.dbo.sysprocesses.

Update

Предполагая базу данных, которую требуется восстановить уже существует, и если у вас есть один файл резервной копии на диске (который не имеет несколько резервных копий в нем), и нет необходимости восстанавливать файлы журналов после восстановления полной резервной копии, а затем восстановить с помощью сценария супер, супер просто:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak'; 

Изучение этого синтаксиса сделает вашу жизнь проще, потому что тогда, когда вы устанавливаете SINGLE_USER вы уже в единственной сессии, что связано. Кроме того, я нахожу, что набрав команду restore быстрее, чем с помощью графического интерфейса, и мне нравится элемент управления, который у меня есть. Повторение этого в конечном итоге цементирует его в вашем уме, и вам больше не нужно искать синтаксис.

Это не так сложно восстановить файлы журналов. Только одна простая вещь, чтобы помнить, WITH NORECOVERY:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup1.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup2.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup3.log' WITH NORECOVERY; 
... 4 5 6 7 and so on 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackupX.log' WITH RECOVERY; 

Там ... вы восстановили лог-файлы, очень легко. Вы можете даже восстановить точный момент времени, используя WITH STOPAT!Кроме того, если вы забыли и случайно отправили последнее заявление о восстановлении журнала WITH NORECOVERY, то вы просто выпустите RESTORE DATABASE DBName WITH RECOVERY;, чтобы выполнить заключительные шаги, чтобы сделать базу данных полезной (откат незафиксированных транзакций и т. Д.).

1
  • Перейдите в раздел «Параметры» только в разделе «Общие» в левой части списка.
  • Убедитесь, что отмечена опция «Перезаписать существующую базу данных» (раздел «Восстановить параметры»).

Удачи.

2

Вы можете использовать этот скрипт, чтобы убить все процессы с использованием базы данных, а затем попытаться восстановить его снова:

declare @sql as varchar(20), @spid as int 
select @spid = min(spid) from master..sysprocesses where dbid = db_id('<database_name>') 
and spid != @@spid  

while (@spid is not null) 
begin 
    print 'Killing process ' + cast(@spid as varchar) + ' ...' 
    set @sql = 'kill ' + cast(@spid as varchar) 
    exec (@sql) 

    select 
     @spid = min(spid) 
    from 
     master..sysprocesses 
    where 
     dbid = db_id('<database_name>') 
     and spid != @@spid 
end 

print 'Process completed...'