none
bak-Datei zyklisch einlesen RRS feed

  • 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

     

    Freitag, 4. Februar 2011 09:35

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
    Freitag, 4. Februar 2011 09:58
  • 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'

    Freitag, 4. Februar 2011 10:44
  • 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
    Freitag, 4. Februar 2011 11:03
  • Mich verunsichert es ein wenig. Könnte ich als @database_name auch einen Phantasienamen angeben? So richtig verstehe ich nicht den Hintergrund warum ich master als Datenbankname für den Restore angebe? Können Sie es etwas genauer ausführen?
    Dienstag, 8. Februar 2011 09:32
  • 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
    Dienstag, 8. Februar 2011 11:05
  • 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?
    Dienstag, 8. Februar 2011 12:04
  • 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
    Dienstag, 8. Februar 2011 12:33