none
batch script zur sicherung meiner db RRS feed

  • Frage

  • hallo miteinander

    ich will meine kunden crm db taeglich via batch file sichern (winsrv2008 / msql studio express).
    zudem soll jeden tag der batch einen neuen folder mit dem aktuellem datum erstllen fuer die sicherung.

    die crm db heissen:
    company_crm.mdf
    company_crm_log.ldf

    die dbs liegen im verzeichnis:
    C:\Program Files\Microsoft SQL Server\MSSQL\Data

    das zielverzeichnis soll sein:
    I:\backup db\%date%\

    Ich habe nun drei schwierigkeiten:
    1. soll/muss die backup datei eine .bak sein? (oder kann ich einfach die .mdf kopieren?)
    2. wie erstelle ich einen folder per batch mit dem aktuellen datum
    3. im selben folder wie die db liegen sind noch andere datenbanken:
    - dbfacontrol.mdf
    - dbfacontrol_log.ldf
    - msdbdata.mdf
    - templog.ldf
    - tempdb.mdf
    - master.mdf
    - mastlog.ldf
    - model.mdf
    - modellog.ldf
    - msdblog.ldf

    muss ich diese file ebenflalls sichern?

    Ich bin fuer jeden input und hilfe dankbar.

    Beste gruesse
    john

    Mittwoch, 8. September 2010 02:03

Antworten

  • Hallo John,

    solange der SQL Server (Express) Dienst läuft, sind die Datenbank-Dateien (mdf/ldf) in Benutzung und können nicht kopiert werden oder mit einem Filesystem-Backup gesichert werden. Wenn Du also nicht jedes mal den Dienst runter und hinterher wieder rauf fahren willst, ist ein SQL Server Backup eh nur die einzige Möglichkeit, ein sicheres Backup zu erstellen.

    Die Systemdatenbanken master (master.mdf/mastlog.ldf), MSDB (msdbdat.mdf/msdblog.ldf) und Model (model.mdf/modellog.ldf) solltest Du besser auch regelmäßig mit sichern um im Desaster-Fall die Installation wieder vollständig herstellen zu können.

    Beispiele für Backup bei Express per Batch:
    MSSQL Tips:Automating SQL Server 2005 Express Backups and Deletion of Older Backup Files
    Scheduling a Backup Job in Microsoft SQL 2005 Express Edition


    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
    • Als Antwort vorgeschlagen Uwe RickenMVP Mittwoch, 8. September 2010 15:11
    • Als Antwort markiert Andrei Talmaciu Montag, 13. September 2010 11:02
    Mittwoch, 8. September 2010 04:44

Alle Antworten

  • Hallo John,

    solange der SQL Server (Express) Dienst läuft, sind die Datenbank-Dateien (mdf/ldf) in Benutzung und können nicht kopiert werden oder mit einem Filesystem-Backup gesichert werden. Wenn Du also nicht jedes mal den Dienst runter und hinterher wieder rauf fahren willst, ist ein SQL Server Backup eh nur die einzige Möglichkeit, ein sicheres Backup zu erstellen.

    Die Systemdatenbanken master (master.mdf/mastlog.ldf), MSDB (msdbdat.mdf/msdblog.ldf) und Model (model.mdf/modellog.ldf) solltest Du besser auch regelmäßig mit sichern um im Desaster-Fall die Installation wieder vollständig herstellen zu können.

    Beispiele für Backup bei Express per Batch:
    MSSQL Tips:Automating SQL Server 2005 Express Backups and Deletion of Older Backup Files
    Scheduling a Backup Job in Microsoft SQL 2005 Express Edition


    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
    • Als Antwort vorgeschlagen Uwe RickenMVP Mittwoch, 8. September 2010 15:11
    • Als Antwort markiert Andrei Talmaciu Montag, 13. September 2010 11:02
    Mittwoch, 8. September 2010 04:44
  • Hallo John,

    wie Olaf bereits geschrieben kannst du nicht auf die Dateien zugreifen solange der SQL-Server Dienst läuft. Möchtest du dies tatsächlich über eine Batch-Datei sichern, müsstest du zuerst mittels NetStop den Diesnt beenden, anschl. die Dateien kopieren und dann wieder den Diesnt mit NetStart starten. Einen Ordner mit dem aktuellen Datum kannst du auf folgende Weise erstellen:

     @echo off
    set jahr=%date:~-4%
    set monat=%date:~-7,2%
    set tag=%date:~-10,2%
    xcopy *.* C:\Sicherung\%jahr%%monat%%tag% /I

     Der Parameter /I steht für neuen Ordner anlegen, falls nicht vorhanden.

    Gruß

    Korodamos

    Mittwoch, 8. September 2010 07:24
  • Hello Korodamos

    danke fuer die antwort.
    ich werde es auf diesem wege machen.
    werde zuerst den sql server dienst stoppen und dann die db sichern.

    nur eine frage habe ich noch.
    ich habe versucht mittels deinem script einen order zu erstellen mit dem aktuellen datum.
    es erscheint dann die frage im shell fenster ob es ein file name or directory name ist.
    muss dann mit F oder D bestaetigen. Kann ich das automatisieren?

    wenn ich dann mit D bestaetige wird ein neuer order erstellt, aber der sieht dann so aus:
    9-080-20

    irgend eine idee? :-)

    Mittwoch, 8. September 2010 10:26
  • Hallo John,

    zum ersten hättest du mit V bestätigen müssen, da du ja ein Verzeichniss erstellen möchtest und zum zweiten hatte ich ein BacksSlash vergessen. Korrekt muss es so lauten:

     @echo off
    set jahr=%date:~-4%
    set monat=%date:~-7,2%
    set tag=%date:~-10,2%
    cd c:\
      xcopy Datenbank.* C:\Sicherung\%jahr%%monat%%tag%\ /I

    So erfolgt keine Nachfrage mehr.

    Was dein Datum angeht, ist dies abhängig vom eingestellten Format des Rechners. Bei mir ist dies das normale deutsche Datum: 08.09.2010.

    Mit  %date:~-4% hole ich mir die letzten 4 Stellen der Systemvariable date. Mit  %date:~-7,2% hole ich mir die Stelle 7 und 6 der Variablen (wird von hinten aus gezählt) und mit set tag=%date:~-10,2% hole ich die 10 und 9 Stelle.

    Dies musst du evt. an dein Datumsformat anpassen.

     

    Mittwoch, 8. September 2010 12:50
  • Hallo Krodamos,

    diese Variante ist aber nur dann anwendbar, wenn die Datenbank nicht 24 Stunden benötigt wird. Desweiteren ist durch ein einfaches "Wegschreiben" keine Datenkonsistenz mehr bei verteilten Abfragen gegeben.  Gleichzeitig kann mittels dieser Variante auch kein Transaction-Logs gesichert werden, wenn der RecoveryMode auf FULL steht. Hier hast Du mit Deiner Variante sehr schwer gelitten, da das Log-File weiter wächst.

    Da wäre eher ein zeitgesteuerter Task anzuwenden, der mittels sqlcmd ein BACKUP DATABASE ausführt!
    Und da ist der von Olaf ausgewiesene Link ein ideales Hilfsmittel:

    http://www.developerscloset.com/?p=138


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de
    Mittwoch, 8. September 2010 15:10
  • Hallo Uwe,

    du hast mit Deinen Einwänden völlig Recht. Doch so wie ich John verstanden habe, ist es der Weg den er gehen möchte. Das dieser Weg einige Einschränken hat ist unbestritten, doch gehe ich davon aus das John weiß was er tut. Der optimalste Weg ist dies mit Sicherheit nicht, da es hier vieles zu beachten und abzuwägen gilt.

    1. Wie du bereits geschrieben hast, ist die Datenbank wärend des Kopiervorganges down und steht somit nicht zur Verfügung.

    2. Ist nur für relativ kleine Datenbanken möglich da der Kopiervorgang sehr zeitintensiv ist und je größer die Datenbank desto größer wird natürlich das Zeitfenster in dem die Datenbank down ist.

    3. Wiederherstellungsmodell muß auf Einfach stehen, da sonst die Log-Dateien irgendwann die Festplatten voll belegen.

    4. Für die Sicherung wird ereblich mehr Festplattenplatz benötigt, da eine MDF-Datei immer wesentlich größer ist, als eine entsprechende Sicherungsdatei (BAK-Datei).

    5. Auch für den SQL-Server selber ist es nicht von Vorteil diesen täglich neu zu starten, vor allem nicht in Bezug auf seine "Lernfähigkeit".

    Es sollte also möglichst genau geprüft werden, ob dies Vorgehensweise wirklich eine Option ist oder ob es nicht vielleicht doch sionnvoller wäre eine ganz normale SQL-Sicherung (BAK-Datei) zu machen und diese dann ggf. mittels einer Batch-Datei in ein entsprechendes Verzeichniss zu verschieben.

    Gruß

    Korodamos

    Freitag, 10. September 2010 05:45
  • Hallo Korodamos

    Ganz ehrlich, ich bin nicht der SQL spezialist.
    Aber unsere CMR DB ist relativ klein (80MB) als MDF datei.
    Nur jeden Tag manuell die DB als BAK datei zu sichern, ist muehsam.

    Aber Dein letzter Satz trifft den Nagel auf den Kopf.
    Ich moechte eine automatisierte sicherung (sql-sicherung als BAK datei) die mir die datei jeden tag die DB in ein anderes verzeichnis schreibt.

    Nur habe ich zwei probleme (herausforderungen).
    Ich weiss nicht wie ich diese SQL sicherung automatisiere, und zweitens erstellt der batch befehl %date% kein verzeichnis mit dem datum. es waere mir auch schon geholfen eine orderstruktur mit einer fortlaufende order nummer (ordner1, ordner2 usw).

    Danke Dir vielmals fuer die Hilfe.
    John

    Freitag, 10. September 2010 08:55
  • Hallo John,

    wenn dies dein Ziel ist, solltest du wie bereits  Olaf schrieb, ein einfaches SQL-Script erstellen. In der einfachsten Art in der Form:

    BACKUP DATABASE [AdventureWorks2008] TO DISK = N'C:\Backup\AdventureWorks2008_Full.BAK'

    Dieses speicherst du z.b. in der Datei Backup.sql und diese Datei rufst du aus deiner Batch Datei heraus auf, mit dem entsprechenden sqlcmd-Kommando:

    Beispiel:

     sqlcmd -S DBSERVER -E -i C:\Backup.sql

    Jetzt wird eine FULL-Sicherung deiner DB gemacht, die anschl. in dem im SQL-Script angegebenen Pfad liegt. Diese kannst du jetzt ansch. über weitere BATCH-Befehle beliebig in einen Ordner deiner Wahl verschieben.

    Warum es bei Dir mit dem Ordner erstellen nicht funktioniert, kann ich Dir auch nicht sagen. Vielleicht solltest du Deine Batch hier mal posten. Bei mir funktioniert dies völlig problemlos. Ansonsten mach einmal ein "ECHO %date% " in deiner Batch um zu sehen wie diese Variable bei dir gefüllt ist.


    Gruß Korodamos
    Freitag, 10. September 2010 09:52
  • Hallo John,

    Jonathan Kehayias hat eine Variante für dich:

    http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=ExpressBackups&referringTitle=ExpressMaintenance

    oder vielleicht eher die von  Jasper Smith: http://www.sqldbatips.com/showarticle.asp?ID=27 die auch noch schön erklärt ist.

     


    I wish you a nice day,

    Torsten Schuessler
    Freitag, 10. September 2010 15:23