У меня есть база данных MS SQL Server 2005 на моем сервере базы данных. Недавно произошел сбой сервера базы данных, поэтому мне нужно переместить базу данных на новый сервер. Есть ли способ восстановить файл mdf с разбитого жесткого диска, предполагая, что файл не был расположен в поврежденных секторах?
Да. Если у вас есть файл ldf, у вас больше шансов на успех.
Просто возьмите файлы mdf и скопируйте их на новый сервер. Затем присоедините базу данных к новому экземпляру с помощью системной хранимой процедуры sp_attach_db или с помощью SQL Server Management Studio.
Если у вас нет файла ldf, вы можете присоединить базу данных, используя только файл mdf, с помощью системной хранимой процедуры sp_attach_single_file_db или с помощью SQL Server Management Studio.
У вас также есть недавний файл резервной копии? Вы можете не только следовать инструкциям mrdenny, но и в случае неудачи попробовать выполнить восстановление из последней резервной копии.
Если у вас нет резервных копий (и мы надеемся, что вы сможете восстановить свою базу данных!), Подумайте о реализации задания агента SQL Server. Вы можете создать сценарий резервного копирования базы данных и позволить агенту работать в то время, когда вы знаете, что сервер используется меньше всего.
Если у вас есть общесистемные резервные копии, этот файл будет выбран, поскольку SQL-сервер заблокирует файл только во время создания резервной копии.
Приведенный ниже сценарий предназначен для агента SQL Server 2005 SQL Server. Это показывает расписание, которое запускается в 00:10 каждый день и создает резервную копию базы данных MyDB. При необходимости можно отрегулировать. Запустите это в своей студии управления, чтобы понять, как настроить запланированное задание из агента SQL Server.
USE [msdb]
GO
/****** Object: Job [My Backups] Script Date: 07/31/2009 21:56:21 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 07/31/2009 21:56:21 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'My Backups',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'Automate System Backups',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'Administrator', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Backup MyDB] Script Date: 07/31/2009 21:56:22 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Backup MyDB',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'BACKUP DATABASE [MyDB] TO DISK = N''C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\MyDB.bak'' WITH NOFORMAT, INIT, NAME = N''MyDB Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10
',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Daily Backups',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20090731,
@active_end_date=99991231,
@active_start_time=1000,
@active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave: