Änderung / Anpassung Batchdatei

c-mate

Rear Admiral
Registriert
Aug. 2010
Beiträge
5.961
Hallo,

folgenden Situation:
PC1 ist der Hauptrechner mit Software X und SQL Datenbank.
PC2 ebenfalls mit Software X, greift auf die SQL Datenbank von PC1 zu.
(bzw so soll es sein, wen PC2 endlich mal da ist)
PC1 und PC2 hängen beide an einer Fritzbox.

Jetzt müssen die SQL Daten regelmäßig, am besten jeden Tag gesichert werden.

Auf PC1 liegt eine Batchdatei, die die SQL Daten sichert.
Diese Batchdatei sieht so aus:

Code:
sqlcmd -U sa -P ks -S (local)\ks -i c:\Ordner1\Ordner2\SicherungSQL\DB1.sql
sqlcmd -U sa -P ks -S (local)\ks -i c:\ Ordner1\Ordner2\SicherungSQL\DB2.sql
sqlcmd -U sa -P ks -S (local)\ks -i c:\ Ordner1\Ordner2\SicherungSQL\DB3.sql
sqlcmd -U sa -P ks -S (local)\ks -i c:\ Ordner1\Ordner2\SicherungSQL\DB4.sql
sqlcmd -U sa -P ks -S (local)\ks -i c:\ Ordner1\Ordner2\SicherungSQL\DB5.sql

Wenn ich das richtig interpretiere, dann werden dadurch DB1, DB2, DB3, DB4 und DB5 in den Ordner „SicherungSQL“ (der auf C:/ liegt) gesichert.
Und jedes Mal wenn die Batchdatei ausgeführt wird, dann werden DB1, DB2… überschrieben und es gibt immer nur eine aktuelle Version von DB1, DB2…
Soweit richtig?

Ich möchte gerne, dass DB1, DB2 etc. in einen Ordner „SicherungSQL“ gesichert werden, der aber nicht mehr auf C:/ liegt sondern auf D:/Backup
Dh das müsste dann so aussehen:

Code:
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1.sql
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1.sql
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1.sql
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1.sql
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1.sql
Immer noch richtig?

Als nächstes möchte ich aber, dass die bestehenden DB1, DB2 etc nicht jedes Mal überschrieben werden, sondern immer eine neue Version dazu kommt, am besten mit einem Zeitstempel versehen.
So das weiß ich jetzt nicht wie das geht bzw. welche Parameter man da wo hinzufügen muss.

Kann mir hier bitte jemand sagen wie die Batchdatei dann aussehen muss?

THX


PS
Wenn das geschafft ist, muss ich mir überlegen, wie ich den Ordner "SicherungSQL" jeden Tag auf PC2 rüberkopiere bzw die Änderungen synchronisiere und auf PC2 dann abschliessend dieser Ordner nochmal auf eine externe HDD.
Dann sind die Daten 3x gesichert, das sollte ausreichen.
 
Zuletzt bearbeitet:
Auf die Schnelle würde ich das so machen

set stunde=%time:~0,2%
set minute=%time:~3,2%
set sekunde=%time:~6,2%

sqlcmd -U sa -P ks -S (local)\ks -i c:\Ordner1\Ordner2\SicherungSQL\DB5_%date%-%stunde%-%minute%-%sekunde%.sql

mfg
Bad_Beast
 
Afaik bedeutet der parameter -i aber input. Also die beiden batchdatein dienen nur dazu um die DB mit den scripten die du da einliest überschrieben zu werden.
 
Du könntest für die individuellen Dateinamen z.B. Teile der Variablen %date% und %time%
verwenden um einen Zeitstempel in den Dateinamen zu bringen.

Mit dem Datum (YYYY-MM-DD) würde das wie folgt aussehen:

Code:
sqlcmd -U sa -P ks -S (local)\ks -i d:\Backup\SicherungSQL\DB1_%date:~-4%-%date:~3,2%-%date:~0,2%.sql
Hier kannst du dich ein wenig in die Materie der "Batch Programmierung" einlesen.
 
Shio schrieb:
Afaik bedeutet der parameter -i aber input. Also die beiden batchdatein dienen nur dazu um die DB mit den scripten die du da einliest überschrieben zu werden.

Mhm verstehe nicht was du meinst. Die Batchdatei kopiert die SQL Daten, die gesichert werden sollen in den Ordner "SicherungSQL". Meinst du das mit "input".
Und jetzt wäre eben wichtig dass wenn die Batchdatei dann am nächsten tag ausgeführt wird, die bestehenden DB1, DB2 etc nicht überschrieben werden, sondern, dass die alten SB1, SB2 etc bestehen bleiben und die neuen einfach dazu kommen, Und dass man es unterschieden kann, sollen die mit einem Zeitstempel versehen werden.

Das mit dem Zeitstempel würde ja mit dem "DB1_%date:~-4%-%date:~3,2%-%date:~0,2%.sql" durchgeführt werden, findet dadurch auch das Überschreiben nicht mehr statt oder muss der Parameter "i" raus oder druch einen anderen ersetzt werden"
 
Zuletzt bearbeitet:
So wie ich das sehe, werden in der Batch nur verschiedene SQL-Scripte ausgeführt, die unter "c:\Ordner1\Ordner2\SicherungSQL\..." auf deinem Server liegen. Der Parameter -i gibt nur einen input_file bzw ein SQL-Script an, welches dann ausgeführt wird (wie bereits von Shio beschrieben).

In diesen Scripten muss dann nachgeschaut und geändert werden, wo und unter welchem Namen die Sicherung abgelegt wird.


Edit: in dem Script "DB1.sql" könnte sowas stehen wie:
Code:
BACKUP DATABASE <meine_datenbank>  
TO DISK = 'LW:\PFAD\..\DB.bak'  
WITH NOINIT

Hier müsste man dann ggf noch das Datum mit reinknüpfen und den richtigen Pfad nehmen, wie folgt:

Code:
BACKUP DATABASE <meine_datenbank>  
'\\Server\Pfad\DB1_' + convert(varchar(50),GetDate(),112) + '.bak'
WITH NOINIT

... so sollte es funktionieren ;)
 
Zuletzt bearbeitet:
Ah so verstehe, die Batchdatei führt also verschiedene scripte aus die dort noch liegen.
Mhm ok.
Das würde ich dann aber lieber unangetastet lassen.
Wie wäre es denn dann, wenn ich die Batchdatei und die scripte so lasse wie sie sind, dh es wird in c:\Ordner1\Ordner2\SicherungSQL abgespeichert und halt dann jeden Tag überschrieben.

Aber ich könnte es ja so machen, dass nachdem die Batchdatei ausgeführt wurde, noch ein Script läuft, das dann den Ordner "SicherungSQL" von C:/ nach D:/Backup sichert und dann den Ordner "SicherungSQL" mit einem Zeitstempel versieht.
Womit macht man das, mit xcopy oder robocopy oder so und wie müsste das aussehen?

Quelle: c:\Ordner1\Ordner2\SicherungSQL
Ziel: d:\Backup\SicherungSQL
Und es soll halt jedesmal ein neuer Ordner "Sicherung SQL" entstehen, der dann einen neuen Zeitstempel bekommt.
 
nimm lieber Robocopy.

Die Batch könnte wie folgt aussehen:
Code:
SET backupdir= d:\Backup\SicherungSQL_%date%

mkdir %backupdir%
ROBOCOPY "c:\Ordner1\Ordner2\SicherungSQL" "%backupdir%" /S /E /MT

Dann muss die BAT eben noch bissl ausgeschmückt werden , z.B. mit Prüfung ob Ordner und Dateien (schon) vorhanden sind

Edit: man kann es auch schon in die bereits bestehende Batch mit integrieren, da wird besser sichergestellt, dass die Dateien erst kopiert werden, wenn die Backup-Scripte fertig sind.
 
Zuletzt bearbeitet:
@Bandit 600
Ich habe deine *.bat mal ausprobiert, der Ordner D:\Backup wurde angelegt und darin ein Ordner "SicherungSQL_17.09.2012". Soweit schon mal gut. Aber der "SicherungSQL_17.09.2012" ist leer, dh der Inhalt wurde nicht mitkopiert.
 
@c-mate:

1) Hast du robocopy installiert und über die Systemvariablen eingebunden, dass es auch funktioniert wie in dem von mir genannten Befehl ???
Ggf musst du den Befehl so anpassen, dass der vollständige Pfad zu ROBOCOPY.exe eingetragen ist.

2) Gibt es den Pfad "c:\Ordner1\Ordner2\SicherungSQL\" wirklich bzw hast du die Pfade angepasst und liegen Dateien zum kopieren bereit?

3) Wird ein Fehler ausgegeben, wenn du die BAT ausführst, wenn ja: welcher?


PS: ein PAUSE am Ende der BAT pausiert diese, damit du die Ausführung korrekt ansehen kannst und ggf eine Fehlermeldung siehst.
 
bandit600 schrieb:
@c-mate:

1) Hast du robocopy installiert und über die Systemvariablen eingebunden, dass es auch funktioniert wie in dem von mir genannten Befehl ???
Ggf musst du den Befehl so anpassen, dass der vollständige Pfad zu ROBOCOPY.exe eingetragen ist.

Öhem robocopy installiert?
ich dachte ab Vista wäre das im OS mit dabei und wenn ich die Batchdatei ausführe dann passiert doch auch was bzw der Ordner wird kopiert.

Ich habe das Script auf meinem rechner ausprobiert und entsprechende Testordner dafür angelegt, dh c:\Test\SicherungSQL existiert definitiv und es ist eine +. txt enthalten.

Code:
SET backupdir= d:\Backup\SicherungSQL_%date%
     
mkdir %backupdir%
ROBOCOPY "c:\Test\SicherungSQL" "%backupdir%" /S /E /MT

Dann werde ich mich mal auf die Suche nach robocopy machen
 
Nein brauchst du nicht, aber im alten Win XP wars meines Wissens noch nicht enthalten.

Vermutlich stimmen da nur noch nicht die Parameter wenn was kopiert wird. Fehlermeldung wird wird keine ausgegeben?

Edit: versuchs mal mit :
Code:
SET backupdir= d:\Backup\SicherungSQL_%date:~-4%-%date:~3,2%-%date:~0,2%
mkdir %backupdir%
ROBOCOPY "c:\Test\SicherungSQL" "%backupdir%" /MOVE

Das sollte dir einen besseren Ordnernamen geben und die Dateien werden gleich aus dem QuellOrdner gelöscht.

Außerdem findest du unter http://ss64.com/nt/robocopy.html eine erweitere ROBOCOPY Hilfe.
 
Zuletzt bearbeitet:
Keine Ahnung warum es nicht geht.
Quelle: C:\Test\SicherungSQL
Ziel: D:\Backup

Der Ordner "SicherungSQL" (samt Inhalt natürlich) soll einfach jedesmal in D:\Backup kopiert werden und jedesmal einen neuen Zeitstempel bekommen.
 
Zurück
Oben