Назад | Перейти на главную страницу

Как мне восстановить резервную копию SQL, сделанную два дня назад?

Аварии базы данных случаются только Другой люди, правда? ПРАВО?!?

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

Вопрос: Как мне восстановить резервную копию, сделанную два дня назад?

Кажется, что графический интерфейс не работает, и я не могу найти подходящий TSQL, чтобы сделать это вручную.

ПОДРОБНОСТИ

Я сделал резервную копию базы данных SQL Server 2005 в понедельник, 9 ноября 2009 г., около 9:30 утра, используя SQL Server Management Studio со следующими параметрами:

Модель восстановления: простая
Тип резервного копирования: полное
Компонент резервного копирования: база данных
Срок действия истекает через: 0 дней
Назначение: Диск

Я хотел бы восстановить эту резервную копию, но у меня возникли проблемы.

Попытка №1: использовать графический интерфейс

Использованы следующие параметры в диалоговом окне Восстановить базу данных:

В базу данных: [MyDatabaseName] В определенный момент времени: '11.09.2009 12:00:00 AM 0 миллисекунд Из базы данных: [MyDatabaseName] Перезаписать существующую базу данных: true. Состояние восстановления: оставьте базу данных готовой к использованию путем отката ...

Сообщение об ошибке: не удалось получить монопольный доступ, поскольку база данных уже используется. Я попытался установить single_user, перезапустить службу SQL Server и т. Д. Никогда не мог понять, как завершить существующие соединения в графическом интерфейсе восстановления базы данных.

Попытка №2: использовать TSQL

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.