Fragensteller
bak-Datei zyklisch einlesen

Frage
-
Hallo zusammen,
ich habe eine bak-Datei aus einer Sicherung mit dem Namen "test" die jeden Tag in einem Server-Ordner abgelegt wird. Ich würde gerne diese bak-Datei jeden morgen um 5 Uhr als Datenbank "mis" auf diesem Server wiederherstellen.
Wie muss ich vorgehen?
MfG
Alle Antworten
-
Hallo,
dazu würde ich einen entsprechenden SQL Server Agent Job anlegen, der täglich um 05:00 Uhr ein SQL Statement ausführt; eben einen Restore der BAK Datei auf eine vorhandene Datenbank. Von Vorteil wäre, wenn die Sicherungsdatei immer im gleichen Ordner unter gleichem Namen liegt, sonst müsste man die Namen dynamisch ermitteln / angeben.
Zudem sollte man sicherstellen das zum Zeitpunkt des Restores niemand an der Datenbank angemeldet ist, das sonst das Restore fehl schlägt.Per T-SQL könntest Du den Job mit dem folgenden Statement anlegen (Parameter entsprechend anpassen), über SSMS ist es aber auch schnell zusammengestellt (habe 5 min benötigt):
-- SQL Server Agent Job Anlegen
USE [msdb]
GO
DECLARE @jobId BINARY(16)
EXEC msdb.dbo.sp_add_job @job_name=N'DailyRestore',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=2,
@notify_level_page=2,
@delete_level=0,
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'Domain\olafhelper',
@job_id = @jobId OUTPUT
select @jobId
GO
EXEC msdb.dbo.sp_add_jobserver @job_name=N'DailyRestore', @server_name = N'MSQLServer\Instanz'
GO
-- Job Schritt
EXEC msdb.dbo.sp_add_jobstep @job_name=N'DailyRestore', @step_name=N'DailyRestore_Step1',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=
N'RESTORE DATABASE [AdventureWorks]
FROM DISK = N''F:\Backup\AdventureWorks.bak''
WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10',
@database_name=N'master',
@flags=0
GO
-- Step zum Job hinzufügen
EXEC msdb.dbo.sp_update_job @job_name=N'DailyRestore',
@enabled=1,
@start_step_id=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=2,
@notify_level_page=2,
@delete_level=0,
@description=N'',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'Domain\olafhelper',
@notify_email_operator_name=N'',
@notify_netsend_operator_name=N'',
@notify_page_operator_name=N''
GO
-- Zeitplan anlegen
DECLARE @schedule_id int
EXEC msdb.dbo.sp_add_jobschedule @job_name=N'DailyRestore', @name=N'DailyRestore_Schedule',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20110204, -- ab heute
@active_end_date=99991231, -- keine Ende
@active_start_time=50000, -- 05:00:00 Uhr
@active_end_time=235959,
@schedule_id = @schedule_id OUTPUT
select @schedule_id
GO
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de -
iWarum steht folgender Eintrag im RestoreJob? Müsste hier nicht auch der Name der Zieldatenbank "mis" stehen?
@database_name=N'master',
Und noch eine Frage hierzu, im Eigenschaftsfenster des Servers ist das Feld Instanz leer. Bedeutet dass, ich muss hier nur den Servernamen ohne Instanz angeben?
@server_name = N'MSQLServer\Instanz'
-
iWarum steht folgender Eintrag im RestoreJob? Müsste hier nicht auch der Name der Zieldatenbank "mis" stehen?
@database_name=N'master'
Genau das eben nicht, den dann würde eine Connection zur MIS Datenbank aufgebaut und somit würde das Restore fehlschlagen, weil die Datenbank vermeintlich in Verwendung ist. Deswegen unbedingt eine Datenbank <> MIS angeben; master oder msdb sind hierfür an besten geeignet.
@server_name kann man entweder leer lassen und man gibt den Servernamen an. Handelt es sich um eine benannte Instanz, muss natürlich der Instanzenamen mit angegeben werden. @server_name wird dann wichtig, wenn man Remote Jobs ausführen will, z.B. wenn man einen zentralen Server für Jobs (Maintenance) verwendet.
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de -
-
Wenn Du einen Phantasienamen angibst, also von einer Datenbank die es nicht gibt, dann schlägt der Job fehl.
Wieso stört Dich "master"? Das da versehentlich die Sicherung auf die "master" zurückgesichert wird, kannst man zu 100% ausschließen. Selbst wenn die "master" irgendwie als Ziel angegeben wäre, würde keine Rücksicherung durchgeführt. Das ging nur durch Desaster Recovery.
Du kannst auch die "msdb", "model" oder jede andere DB ausser der MIS angeben; wie gesagt wäre die sonst in Verwendung
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de -
Wenn Du einen Phantasienamen angibst, also von einer Datenbank die es nicht gibt, dann schlägt der Job fehl.
Wieso stört Dich "master"? Das da versehentlich die Sicherung auf die "master" zurückgesichert wird, kannst man zu 100% ausschließen. Selbst wenn die "master" irgendwie als Ziel angegeben wäre, würde keine Rücksicherung durchgeführt. Das ging nur durch Desaster Recovery.
Du kannst auch die "msdb", "model" oder jede andere DB ausser der MIS angeben; wie gesagt wäre die sonst in Verwendung
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
Ok, danke. Jetzt ist es klar, ich habe nur nicht sofort den Zweck verstanden. Könnte ich das Feld auch aus dem raus lassen? -
Laut Doku zu sp_add_jobstep ist der Parameter optional und kann weg gelassen werden ... und dann wird per Default eben wieder die "master" verwendet.
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de