Аварии базы данных случаются только Другой люди, правда? ПРАВО?!?
Я уверен, что этого ни с кем не случалось с самого начала компьютерной истории, но, хотите верьте, хотите нет, у меня проблема с восстановлением базы данных. Возможно, ты сможешь помочь. Я надеюсь, что это что-то действительно простое.
Вопрос: Как мне восстановить резервную копию, сделанную два дня назад?
Кажется, что графический интерфейс не работает, и я не могу найти подходящий TSQL, чтобы сделать это вручную.
Я сделал резервную копию базы данных SQL Server 2005 в понедельник, 9 ноября 2009 г., около 9:30 утра, используя SQL Server Management Studio со следующими параметрами:
Модель восстановления: простая
Тип резервного копирования: полное
Компонент резервного копирования: база данных
Срок действия истекает через: 0 дней
Назначение: Диск
Я хотел бы восстановить эту резервную копию, но у меня возникли проблемы.
Использованы следующие параметры в диалоговом окне Восстановить базу данных:
В базу данных: [MyDatabaseName] В определенный момент времени: '11.09.2009 12:00:00 AM 0 миллисекунд Из базы данных: [MyDatabaseName] Перезаписать существующую базу данных: true. Состояние восстановления: оставьте базу данных готовой к использованию путем отката ...
Сообщение об ошибке: не удалось получить монопольный доступ, поскольку база данных уже используется. Я попытался установить single_user, перезапустить службу SQL Server и т. Д. Никогда не мог понять, как завершить существующие соединения в графическом интерфейсе восстановления базы данных.
ALTER DATABASE [MyDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO
ALTER DATABASE [MyDatabaseName] SET RECOVERY FULL GO
ВОССТАНОВЛЕНИЕ БАЗЫ ДАННЫХ [MyDatabaseName] С ДИСКА = N'F: \ DatabaseLocation \ BackupName.bak 'С ФАЙЛОМ = 1, NOUNLOAD, RECOVERY, REPLACE, STATS = 10, STOPAT =' 9 ноября 2009 г. '
Сообщение: Этот набор резервных копий содержит записи, которые были зарегистрированы до назначенного момента времени. База данных остается в состоянии восстановления, чтобы можно было выполнить дополнительный повтор транзакций.
Я пробовал разные версии вышеперечисленного с REPLACE, NORECOVERY, RECOVERY и т. Д. Нужно ли мне знать время резервного копирования с точностью до миллисекунды? И если да, то как мне это найти?
Вы не можете восстановить базу данных для ПРОСТОГО восстановления на определенный момент времени. Только базы данных в режиме FULL или BULK могут быть восстановлены на определенный момент времени.
Видеть Восстановление до определенного момента времени для конкретного синтаксиса (параметр указывается во время RESTORE LOG, а не во время RESTORE DATABASE). Также см Восстановление базы данных до точки в резервной копии для получения более общих сведений об использовании STOP AT.
Вы можете легко убить существующие соединения из графического интерфейса. Просто зайдите в Управление -> Монитор активности. Отсортируйте по базе данных и щелкните правой кнопкой мыши и убейте тех, кто находится в базе данных, которую вы хотите восстановить.
[редактировать]
Конечно, все это предполагает, что ваша учетная запись не использует ту же базу данных, что и по умолчанию! Если это так, вы захотите изменить это и сначала подключиться заново.
Похоже, у вас это исправлено, но я набирал свой ответ на StackOverflow, а затем обнаружил, что запрос был закрыт и перемещен сюда, поэтому вот моя обычная последовательность команд восстановления базы данных в T_SQL, если они вам нужны
Вам нужно будет использовать
RESTORE FILELISTONLY FROM DISK = 'X:\path\MyBackupFilename.BAK'
для получения имен логических устройств (которые не изменятся при восстановлении в ту же базу данных, из которой была сделана резервная копия, но в остальном могут отличаться)
USE master -- (Can't sit in the database whilst its being restored!) GO -- ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE MyDatabase SET OFFLINE WITH ROLLBACK IMMEDIATE GO RESTORE DATABASE MyDatabase FROM DISK = 'X:\path\MyBackupFilename.BAK' WITH REPLACE, NORECOVERY, -- Allow recovery of more DIFF/TLogs STATS = 10, -- Show progress (every 10%) MOVE 'MyLogicalName_data' TO 'X:\MSSQL\path\MyDatabaseFile.mdf', MOVE 'MyLogicalName_log' TO 'X:\MSSQL\path\MyDatabaseFile.ldf' GO -- IF need to restore a later DIFF backup (made after this FULL backup): RESTORE DATABASE MyDatabase FROM DISK = 'X:\path\MyDatabaseBackup_yyyymmdd_hhmm_Diff.BAK' WITH STATS = 10, -- Show progress (every 10%) NORECOVERY -- Allow recovery of more TLog GO -- Optional restore of additional TRANSACTION LOGs -- Repeat the following for each transaction log, in order RESTORE LOG MyDatabase FROM DISK = 'X:\path\MyDatabaseBackup_yyyymmdd_hhmm_Trans.BAK' WITH NORECOVERY -- Allo recovery of more TLogs GO -- When finished restoring all backup files "activate" the database RESTORE DATABASE MyDatabase WITH RECOVERY GO -- **IF** Database was made with different Logical Names "rename" those now ALTER DATABASE MyDatabase MODIFY FILE (NAME = 'LogicalNameFromBackup_data', NEWNAME = 'NewLogicalName_data') GO ALTER DATABASE MyDatabase MODIFY FILE (NAME = 'LogicalNameFromBackup_log', NEWNAME = 'NewLogicalName_log') GO -- If backup was made when DB in single / restricted user -- change access back to "normal" -- ALTER DATABASE MyDatabase SET MULTI_USER, READ_WRITE WITH ROLLBACK IMMEDIATE GO
Если база данных была восстановлена на другом сервере, также потребуется повторно синхронизировать пользователей базы данных с именами для входа на сервер.
Вы пытались
1- Остановить Sql Server.
2- Удалить или переместить в другое место физические файлы поврежденной базы данных (.mdf и .log).
3- Запустите Sql Server.
4- Загрузить резервную копию
Из какой базы данных вы выполняете восстановление? Убедитесь, что это не та база данных, которую вы восстанавливаете, и что у вас нет активных запросов в Sql Management Studio.