Announcement

Collapse
No announcement yet.

osql.exe - soll nach 3 Tagen Sicherungsdatei überschreiben - aber wie ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • osql.exe - soll nach 3 Tagen Sicherungsdatei überschreiben - aber wie ?

    Hallo Community,

    ich möchte eine Datenbank mittels osql.exe täglich sichern lassen, wobei ein Sicherheitsbuffer von 3 Tagen erreicht werden soll.

    Ich hatte ursprünglich vor, mittels diesem Befehl sowas zu realisieren:
    Code:
    osql.exe -U mm -P mm /Q "BACKUP DATABASE %Database% TO Disk = '%FileName%' WITH INIT, RETAINDAYS=3"
    Aber klarerweise läuft am 1. Tag alles OK, am 2. Tag nicht mehr weil INIT nicht ausgeführt werden kann da die Datei 3 Tage gesperrt wurde.

    Mit NOINIT wird meine Datei aber nur riesengroß jedoch nicht mehr überschrieben nach 3 Tagen.

    Setze ich noch ein SKIP dazu ist ihm die Sperre wieder egal und er überschreibt die Datei einfach. Wie bringe ich das Script dazu zu prüfen ob eine Sperre vorhanden ist wenn ich INIT benutze und falls ja, einfach mit NOINIT weitermache ?

    Hat jemand einen Tipp oder Vorschläge für mich ? Danke !

    lG
    Roland

  • #2
    Hallo,

    bei der Bedeutung, die eine brauchbare Datensicherung hat, würde ich auf Nummer Sicher gehen und die Backups jeweils separat als Datei speichern. Dabei kann entweder das Datum mit im Dateinamen kodiert werden, oder es wird nur der Wochentag genutzt. Beim SQL Server 2005 könnte das mit Hilfe des neuen SQLCMD-Modus der Scriptausführung so aussehen:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: green;">-- ################################################## ###########</span></p><p style="margin: 0px;"><span style="color: green;">-- # SQLCMD-Script für die Datenbanksicherung unter einem </span></p><p style="margin: 0px;"><span style="color: green;">-- # Dateinamen, in dem das aktuelle Datum enthalten ist.</span></p><p style="margin: 0px;"><span style="color: green;">-- #------------------------------------------------------------</span></p><p style="margin: 0px;"><span style="color: green;">-- # Aufruf-Parameter:</span></p><p style="margin: 0px;"><span style="color: green;">-- # </span>&nbsp; <span style="color: green;">DBName="Datenbankname"</span></p><p style="margin: 0px;"><span style="color: green;">--################################################## ############</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">:Setvar BackupDir <span style="color: #a31515;">'C:\Temp\'</span></p><p style="margin: 0px;">:On Error <span style="color: blue;">exit</span></p><p style="margin: 0px;">:Error C:\Temp\BackupScriptError.txt</p><p style="margin: 0px;">:Out C:\Temp\BackupScriptOutput.txt</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">USE </span>tempdb</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@sql&nbsp;&nbsp; NVARCHAR(199);</p><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@file&nbsp; NVARCHAR(99);</p><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@datum <span style="color: blue;">DATETIME</span>;</p><p style="margin: 0px;"><span style="color: blue;">SET </span>@datum = <span style="color: blue;">GETDATE</span>();</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Dateiname zusammenstellen (Backup_Monat_Tag_Datenbank.bak)</span></p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>@file = $(BackupDir) + <span style="color: #a31515;">'Backup_' </span>+ </p><p style="margin: 0px;">&nbsp; <span style="color: blue;">CAST</span>(<span style="color: blue;">DATEPART</span>(mm,@datum) <span style="color: blue;">AS </span>NVARCHAR(2)) + <span style="color: #a31515;">'_' </span>+ </p><p style="margin: 0px;">&nbsp; <span style="color: blue;">CAST</span>(<span style="color: blue;">DATEPART</span>(dd,@datum) <span style="color: blue;">AS </span>NVARCHAR(2)) + <span style="color: #a31515;">'_' </span>+ </p><p style="margin: 0px;">&nbsp; $(DBName) + <span style="color: #a31515;">'.bak'</span>;</p><p style="margin: 0px;"><span style="color: green;">-- Backup-Anweisung als Zeichenkette zusammenstellen</span></p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>@sql = <span style="color: #a31515;">'BACKUP DATABASE ' </span>+ $(DBName) + </p><p style="margin: 0px;">&nbsp; <span style="color: #a31515;">' TO DISK = ''' </span>+ @file + <span style="color: #a31515;">''' WITH INIT'</span>;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Backup ausführen</span></p><p style="margin: 0px;"><span style="color: blue;">EXEC </span>sp_executesql @sql;</p><p style="margin: 0px;">GO</p></div>

    Wenn die SQL-Scriptdatei vorliegt, können verschiedene CMD-Dateien (alias BAT-Dateien) eingerichtet werden, die jeweils über SQLCMD.EXE die gleiche SQL-Scriptdatei aufrufen, aber jedes Mal als DBName-Parameter einen anderen Datenbanknamen übergeben.

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">SQLCMD -S (<span style="color: blue;">local</span>)\SQLEXPRESS /E /i BackupScript.sql /v DBName=<span style="color: #a31515;">'BackupDemo'</span></p></div>

    Wenn nur OSQL.EXE genutzt werden kann, ist das Prinzip das Gleiche. Es wird eine SQL-Scriptdatei ausgeführt, in der der Datenbankname dynamisch gebildet wird. Die Backupdatei enthält die Nummer des Wochentags im Dateinamen, so dass das Montags-Backup immer am Montag überschrieben wird:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">SELECT </span>@file = <span style="color: #a31515;">'Backup_' </span>+ <span style="color: blue;">CAST</span>(<span style="color: blue;">DATEPART</span>(dw,<span style="color: blue;">GETDATE</span>()) <span style="color: blue;">AS </span>NVARCHAR(2)) + <span style="color: #a31515;">'.bak'</span>;</p></div>
    Zuletzt editiert von Andreas Kosch; 07.02.2007, 07:39.

    Comment


    • #3
      Hallo Andreas,

      besten Dank für deinen Vorschlag. Ich hab das nun versucht und es klappt auch mit SQLCMD. Was ich aber in der Syntax noch nicht verstehe, wie erkennt das Script dass wieder Montag ist und beginnt die letzte Montag-Sicherung zu überschreiben ?

      Im Moment wird ja einfach das Datum zB. Backup_7_2_MM60.bak zum Dateinamen eingefügt. Aber dadurch werd ich ihn wohl kaum bringen können die Datei nächsten Dienstag zu überschreiben oder ?

      lG
      Roland

      Comment


      • #4
        Hallo,

        aus diesem Grund habe ich im letzten Beispiel auch DATEPART(dw,GETDATE()) verwendet, wobei dw den Wochentag als Zahl zurückliefert:

        <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">SELECT </span>@file = <span style="color: #a31515;">'Backup_' </span>+ <span style="color: blue;">CAST</span>(<span style="color: blue;">DATEPART</span>(dw,<span style="color: blue;">GETDATE</span>()) <span style="color: blue;">AS </span>NVARCHAR(2)) + <span style="color: #a31515;">'.bak'</span>;</p></div>

        Zitat aus BOL: "The weekday (dw) datepart returns a number that corresponds to the day of the week, for example: Sunday = 1, Saturday = 7. The number produced by the weekday datepart depends on the value set by SET DATEFIRST. This sets the first day of the week."

        Comment


        • #5
          Hallo nochmal,

          OK alles klar, hab ich übersehen dass der Command für osql das beinhaltet hat, dachte es wäre einfach ne Änderung für osql. Danke !

          lG
          Roland Klein

          Comment

          Working...
          X