T-SQL - Backup mit Variablen
Hallo Forum,
ich möchte jede Nacht ein Full-Backup einer oder mehrerer Datenbanken ins File-System laufen lassen. Griundsätzlich funktioniert das gesamte Vorgehen über die SQL-Jobs perfekt. Leider habe ich keine Möglichkeit gefunden, den Dateinamen des Backups zu variabilisieren nach folgendem Muster: \\LW\Verzeichnis\DBName_data_backup_JHJJMMTT_HHMMSS.dmp.
Nun habe ich versucht, nach guter alter Dos-Manier dieses umsetzen:
Declare @dt as char(15);
Declare @filename as char(99);
Set @dt =(replace(str(DatePart(YYYY, GetDate()), 4), ' ', '0') +
replace(str(DatePart(MM, GetDate()), 2), ' ', '0') +
replace(str(DatePart(DD, GetDate()), 2), ' ', '0') + '_' +
replace(str(DatePart(hh, GetDate()), 2), ' ', '0') +
replace(str(DatePart(mi, GetDate()), 2), ' ', '0') +
replace(str(DatePart(s, GetDate()), 2), ' ', '0'))
PRINT @dt /* Aufbau der Variablen datetime JHJJMMDD_HHMMSS */
SET @filename='E:\Backup\DBName_DATA_backup.dmp' + '_' + '@dt' /*Versehen des Dateinamens mit der Variablen */
PRINT @filename
BACKUP DATABASE [Pflegetool] TO DISK = N'@FileName' WITH NOINIT , NOUNLOAD , NAME = N'Pflegetool Data Sicherung', NOSKIP , STATS = 10, NOFORMAT
Der Print @filename-befehl funktioniert sauber, nur löst er den Befehl nicht im Backup Database-Statement aus.
Kann mir jemand hierzu helfen?
Viele Grüße und besten Dank im Voraus
Kallewirsch
ich möchte jede Nacht ein Full-Backup einer oder mehrerer Datenbanken ins File-System laufen lassen. Griundsätzlich funktioniert das gesamte Vorgehen über die SQL-Jobs perfekt. Leider habe ich keine Möglichkeit gefunden, den Dateinamen des Backups zu variabilisieren nach folgendem Muster: \\LW\Verzeichnis\DBName_data_backup_JHJJMMTT_HHMMSS.dmp.
Nun habe ich versucht, nach guter alter Dos-Manier dieses umsetzen:
Declare @dt as char(15);
Declare @filename as char(99);
Set @dt =(replace(str(DatePart(YYYY, GetDate()), 4), ' ', '0') +
replace(str(DatePart(MM, GetDate()), 2), ' ', '0') +
replace(str(DatePart(DD, GetDate()), 2), ' ', '0') + '_' +
replace(str(DatePart(hh, GetDate()), 2), ' ', '0') +
replace(str(DatePart(mi, GetDate()), 2), ' ', '0') +
replace(str(DatePart(s, GetDate()), 2), ' ', '0'))
PRINT @dt /* Aufbau der Variablen datetime JHJJMMDD_HHMMSS */
SET @filename='E:\Backup\DBName_DATA_backup.dmp' + '_' + '@dt' /*Versehen des Dateinamens mit der Variablen */
PRINT @filename
BACKUP DATABASE [Pflegetool] TO DISK = N'@FileName' WITH NOINIT , NOUNLOAD , NAME = N'Pflegetool Data Sicherung', NOSKIP , STATS = 10, NOFORMAT
Der Print @filename-befehl funktioniert sauber, nur löst er den Befehl nicht im Backup Database-Statement aus.
Kann mir jemand hierzu helfen?
Viele Grüße und besten Dank im Voraus
Kallewirsch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 123851
Url: https://administrator.de/contentid/123851
Ausgedruckt am: 13.11.2024 um 09:11 Uhr
9 Kommentare
Neuester Kommentar
Die Zeile Print @filename gibt bei mir folgendes aus: E:\Backup\DBName_DATA_backup.dmp_@dt
Wie muss ich vorgehen, wenn ich die Variable vor dem Punkt im Dateinamen stehen haben will?
Print @dt klappt sauber
Probiere das an einem SQL 2005 aus
Geht auch an einem SQL 2008 nicht
Hab schon diverse Dinge probiert aber das klappt nicht
Für mioch wäre das sehr hilfreich, weil ich ein Backup des Transaktionslogs einer Datenbank, die im Modus 70 läuft (also nix mit Wartungsplan) stündlich backupen will.
Damit das File nicht jedesmal überschriebn wird, brauche ich einen Zeitstempel.
Mit folgendem Skript startet bei mit das Backup als SQL-Auftrag:
BACKUP LOG [cipkom] TO DISK = N'D:\MSSQLDB\MSSQL.1\MSSQL\Backup\cipkom\cipkom_backup.trn' WITH NOFORMAT, NOINIT, NAME = N'Cipkom Logsicherung', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
declare @backupsetid as int
select @backupsetid = position from msdb..backupset where database_name=N'cipkom' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'cipkom' )
if @backupsetid is null begin raiserror(N'Fehler beim Überprüfen. Sicherungsinformationen für die cipkom-Datenbank wurden nicht gefunden.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'D:\MSSQLDB\MSSQL.1\MSSQL\Backup\cipkom\cipkom_backup.trn' WITH FILE = @backupsetid, NOUNLOAD, NOREWIND
GO
Wie muss ich vorgehen, wenn ich die Variable vor dem Punkt im Dateinamen stehen haben will?
Print @dt klappt sauber
Probiere das an einem SQL 2005 aus
Geht auch an einem SQL 2008 nicht
Hab schon diverse Dinge probiert aber das klappt nicht
Für mioch wäre das sehr hilfreich, weil ich ein Backup des Transaktionslogs einer Datenbank, die im Modus 70 läuft (also nix mit Wartungsplan) stündlich backupen will.
Damit das File nicht jedesmal überschriebn wird, brauche ich einen Zeitstempel.
Mit folgendem Skript startet bei mit das Backup als SQL-Auftrag:
BACKUP LOG [cipkom] TO DISK = N'D:\MSSQLDB\MSSQL.1\MSSQL\Backup\cipkom\cipkom_backup.trn' WITH NOFORMAT, NOINIT, NAME = N'Cipkom Logsicherung', SKIP, REWIND, NOUNLOAD, STATS = 10
GO
declare @backupsetid as int
select @backupsetid = position from msdb..backupset where database_name=N'cipkom' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'cipkom' )
if @backupsetid is null begin raiserror(N'Fehler beim Überprüfen. Sicherungsinformationen für die cipkom-Datenbank wurden nicht gefunden.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'D:\MSSQLDB\MSSQL.1\MSSQL\Backup\cipkom\cipkom_backup.trn' WITH FILE = @backupsetid, NOUNLOAD, NOREWIND
GO
Ha llo Kallewirsch,
Danke für die schnelle Antwort!
Habe nix vergessen im Skript, habe direkt aus dem Eintrag kopiert um zu testen.
Das Backup wird auch geschrieben, nur heißt die Datei halt ZDB_ZZ10_DATA_backup.dmp_20091028....
Ist halt nicht fein, weil durch das Ändern der DAteiendung das etwas verwirrend ist.
Im Prinzip hätte ich das gerne so wie der WArtungsplan vom SQL-Server das macht. "Db-Name_Zeitstempel.trn"
Viele Grüße
Christian
Danke für die schnelle Antwort!
Habe nix vergessen im Skript, habe direkt aus dem Eintrag kopiert um zu testen.
Das Backup wird auch geschrieben, nur heißt die Datei halt ZDB_ZZ10_DATA_backup.dmp_20091028....
Ist halt nicht fein, weil durch das Ändern der DAteiendung das etwas verwirrend ist.
Im Prinzip hätte ich das gerne so wie der WArtungsplan vom SQL-Server das macht. "Db-Name_Zeitstempel.trn"
Viele Grüße
Christian
Also das klappt immer noch nicht so, wie ich das will, aber ich teste weiter.
Ich setze folgendes Skript ab:
Das Ganze gibt folgendes Ergebnis:
Vom Prinzip her richtig, aber wo kommen die vielen Leerzeichen her?
Also das sind genau die 30 Zeichen mit denen die Variable @dbname declariert wird, das ist mir schon kalr, aber warum wird mir hier im Beispiel cipkom + 24 Leerzeichen ausgegeben?
Gibt es eigentlich eine Variable, die den Standardbackuppfad des Servers ausgibt?
Ich hätte halt gerne ein Skript, bei dem ich nur den DB-Namen eingebe und der Rest aus Variablen bezogen wird.
Ich setze folgendes Skript ab:
Declare @dt as char(15);
Declare @FileName as char(150);
Declare @dbname as char(30);
set @dbname = N'cipkom'
Set @dt =(replace(str(DatePart(YYYY, GetDate()), 4), ' ', '0') +
replace(str(DatePart(MM, GetDate()), 2), ' ', '0') +
replace(str(DatePart(DD, GetDate()), 2), ' ', '0') + '_' +
replace(str(DatePart(hh, GetDate()), 2), ' ', '0') +
replace(str(DatePart(mi, GetDate()), 2), ' ', '0') +
replace(str(DatePart(s, GetDate()), 2), ' ', '0'))
SET @FileName='D:\MSSQLDB\MSSQL10.MSSQLSERVER\MSSQL\Backup\'+@dbname+'\'+@dbname+'_DATA_backup'+@dt+'.dmp'
PRINT @dt
PRINT @dbname
PRINT @FileName
Das Ganze gibt folgendes Ergebnis:
20091030_133403
cipkom
D:\MSSQLDB\MSSQL10.MSSQLSERVER\MSSQL\Backup\cipkom \cipkom _DATA_backup20091030_133403.dmp
Vom Prinzip her richtig, aber wo kommen die vielen Leerzeichen her?
Also das sind genau die 30 Zeichen mit denen die Variable @dbname declariert wird, das ist mir schon kalr, aber warum wird mir hier im Beispiel cipkom + 24 Leerzeichen ausgegeben?
Gibt es eigentlich eine Variable, die den Standardbackuppfad des Servers ausgibt?
Ich hätte halt gerne ein Skript, bei dem ich nur den DB-Namen eingebe und der Rest aus Variablen bezogen wird.
Update:
Bei Declare mit varchar definieren dann gehts zumindest mit der Ausgabe: Schaut dann so aus:
Hätte ich früher drauf kommen können :-P
Muss ich nur noch im Skript das Backup suaber zum Laufen bringen.
Das Backup schriebt mit im Ordner D:\MSSQLDB\MSSQL10.MSSQLSERVER\MSSQL\Backup\ eine Datei @filename
Melde mich wieder
Bei Declare mit varchar definieren dann gehts zumindest mit der Ausgabe: Schaut dann so aus:
Hätte ich früher drauf kommen können :-P
20091030_134926
cipkom
D:\MSSQLDB\MSSQL10.MSSQLSERVER\MSSQL\Backup\cipkom\cipkom_DATA_backup_20091030_134926.trn
Muss ich nur noch im Skript das Backup suaber zum Laufen bringen.
BACKUP LOG cipkom TO DISK = N'@filename' WITH NOFORMAT, INIT, NAME = N'cipkom-Transaktionsprotokoll Sichern', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'cipkom' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'cipkom' )
if @backupSetId is null begin raiserror(N'Fehler beim Überprüfen. Sicherungsinformationen für die cipkomo-Datenbank wurden nicht gefunden.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'@filename' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO
Das Backup schriebt mit im Ordner D:\MSSQLDB\MSSQL10.MSSQLSERVER\MSSQL\Backup\ eine Datei @filename
Melde mich wieder