fugu
Goto Top

Microsoft SQL Server Sicherung per Batch

Hey ho ihr Batch und Datenbank Spezis!

Über ein installiertes SQL Management Studio kann man ja einfach per Rechtsklick Datenbanken sichern. Das ist für einen Umzug der Datenbank oder zu anderen Gelegenheiten sicher praktisch und sinnvoll.

Ich würde eine spezielle Datenbank aber gerne täglich automatisiert sichern und suche nach eine Batch-Lösung dafür.

Microsoft hat in seinen Docs einen Einzeiler für die Linux Konsole, für Windows jedoch muss man erst Raketentechnik studieren, um diesem Skript folgen zu können.

Da muss es doch über Sqlcmd noch irgendwelche Möglichkeiten geben... oder nicht?!
In der normalen Befehlsausgabehilfe
sqlcmd /?
erkenne ich aber nur Verbindungsmöglichkeiten zu einer Datenbank - keine Schalter für Sicherungen.

Hat jemand einen Tip?

Thx, Fugu

Content-Key: 543944

Url: https://administrator.de/contentid/543944

Printed on: April 24, 2024 at 04:04 o'clock

Member: bloodstix
bloodstix Feb 05, 2020 updated at 14:13:36 (UTC)
Goto Top
Hi,

ist eigentlich recht einfach. Hier das SQL-File:
DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @fileName VARCHAR(256)

SET @path = 'C:\Sicherungspfad\'  

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('tempdb')  
 
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name
 
WHILE @@FETCH_STATUS = 0   
BEGIN   
       SET @fileName = @path + @name + '.BAK'    
       BACKUP DATABASE @name TO DISK = @fileName  
       FETCH NEXT FROM db_cursor INTO @name   
END   

CLOSE db_cursor   
DEALLOCATE db_cursor
Das sichert alle Datenbanken als c:\Sicherungspfad\Dbname.BAK
Kannst natürlich auch die Schleife entfernen und nur das "BACKUP DATABASE 'Dbname' TO DISK = 'C:\Sicherungspfad\Db.BAK' direkt aufrufen.

Ausführen tust du es so:
@ECHO OFF
SQLCMD -E -S ServerName\MySQL-Instanzname -i C:\PfadZumObigenSQL.sql > C:\MySQL-Backup.log 2>&1

Pfade kannst du entsprechend anpassen.

Grüße
bloody
Mitglied: 142232
142232 Feb 05, 2020 updated at 14:13:04 (UTC)
Goto Top
Member: SeaStorm
Solution SeaStorm Feb 05, 2020 at 14:24:01 (UTC)
Goto Top
Hi

dafür gibt es im ssms den Wartungsplan und da kann man auch eine nächtliche Sicherung mit allen schweinereien einplanen
Member: sabines
sabines Feb 05, 2020 at 14:37:21 (UTC)
Goto Top
Zitat von @SeaStorm:
dafür gibt es im ssms den Wartungsplan und da kann man auch eine nächtliche Sicherung mit allen schweinereien einplanen

Moin,

Recht hast Du, nur die gibt's in den Express Versionen nicht, von daher per cmd/powershell ist schon richtig und/oder gescheites Backup System.

Gruss
Member: fugu
fugu Feb 05, 2020 at 16:06:38 (UTC)
Goto Top
Wow, das Ding kannte ich noch nicht. Hammer! Danke!
Member: sabines
sabines Feb 06, 2020 at 07:46:40 (UTC)
Goto Top
Zitat von @fugu:

Wow, das Ding kannte ich noch nicht. Hammer! Danke!

Ähem, was genau machst Du da? face-wink
Member: fugu
fugu Feb 07, 2020 at 14:34:49 (UTC)
Goto Top
Ich meine den Wartungsplan ... ist ein voller SQL - nicht die Express Edt.
Habe ich auf den falschen Post geklickt zum Antworten? Sorry face-wink
Member: SachsenHessi
SachsenHessi Jun 03, 2020 at 11:35:47 (UTC)
Goto Top
Hallo,

Script-Beispiel (DasSQLBackUpScript.sql):
DECLARE @Datum varchar(10)
DECLARE @Heute datetime
DECLARE @DB11 varchar(500) --DB
DECLARE @DB12 varchar(500) --DB

SET @Heute = GETDATE()
SET @Datum = CONVERT(VARCHAR(10), @HEUTE, 112) 

PRINT @Datum
PRINT 'START BACKUP ['  + @Datum + ']'  
PRINT '========================================================='  
SET @DB11 = 'C:\Program Files (x86)\Microsoft SQL Server\MSSQL.2\MSSQL\Backup\' + @Datum + '_myDB.bak'   
SET @DB12 = @Datum + '_myDB.bak'   

BACKUP DATABASE <DBName> TO DISK = @DB11
                             WITH Name = @DB12 , COPY_ONLY;
PRINT ' '  
PRINT '========================================================='  

PRINT 'ENDE BACKUP [' + @Datum + ']'  
-- ----------------------------------------------

Das ganze aufrufen mit:
sqlcmd -E -S DBSERVER\SQLEXPRESS -i C:\xxxxxx\DasSQLBackUpScript.sql  -o "C:\xxxxxx\Logs\SQLLOG.txt" -b -m-1  
Den Aufruf kannst Du auch in den Windows-Scheduler setzen.

Einziger Nachteil beim Zurückspielen musst Du händisch (oder per Script) die User anpassen (bzw. evtl Neuanlegen).

SH