2009-05-19 3 views
34

Weiß jemand, ob es eine Möglichkeit gibt, SQL Server-Backup in eine Batch-Datei zu scripten, so dass es von einer Befehlszeile aus ausgeführt werden könnte?SQL Server-Befehlszeilen-Backup-Anweisung

+0

http://stackoverflow.com/questions/122690/what-is-a-simple-command-line-program-or-script -to-backup-sql-server-databases –

Antwort

51

Hier ist ein Beispiel, das Sie als Batch-Skript ausführen können (copy-paste in eine .bat-Datei), das SQLCMD Dienstprogramm in SQL Server-Client-Tools:

BACKUP:

echo off 
cls 
echo -- BACKUP DATABASE -- 
set /p DATABASENAME=Enter database name: 

:: filename format Name-Date (eg MyDatabase-2009.5.19.bak) 
set DATESTAMP=%DATE:~-4%.%DATE:~7,2%.%DATE:~4,2% 
set BACKUPFILENAME=%CD%\%DATABASENAME%-%DATESTAMP%.bak 
set SERVERNAME=your server name here 
echo. 

sqlcmd -E -S %SERVERNAME% -d master -Q "BACKUP DATABASE [%DATABASENAME%] TO DISK = N'%BACKUPFILENAME%' WITH INIT , NOUNLOAD , NAME = N'%DATABASENAME% backup', NOSKIP , STATS = 10, NOFORMAT" 
echo. 
pause 

RESTORE:

echo off 
cls 
echo -- RESTORE DATABASE -- 
set /p BACKUPFILENAME=Enter backup file name:%CD%\ 
set /p DATABASENAME=Enter database name: 
set SERVERNAME=your server name here 
sqlcmd -E -S %SERVERNAME% -d master -Q "ALTER DATABASE [%DATABASENAME%] SET SINGLE_USER WITH ROLLBACK IMMEDIATE" 

:: WARNING - delete the database, suits me 
:: sqlcmd -E -S %SERVERNAME% -d master -Q "IF EXISTS (SELECT * FROM sysdatabases WHERE name=N'%DATABASENAME%') DROP DATABASE [%DATABASENAME%]" 
:: sqlcmd -E -S %SERVERNAME% -d master -Q "CREATE DATABASE [%DATABASENAME%]" 

:: restore 
sqlcmd -E -S %SERVERNAME% -d master -Q "RESTORE DATABASE [%DATABASENAME%] FROM DISK = N'%CD%\%BACKUPFILENAME%' WITH REPLACE" 

:: remap user/login (http://msdn.microsoft.com/en-us/library/ms174378.aspx) 
sqlcmd -E -S %SERVERNAME% -d %DATABASENAME% -Q "sp_change_users_login 'Update_One', 'login-name', 'user-name'" 
sqlcmd -E -S %SERVERNAME% -d master -Q "ALTER DATABASE [%DATABASENAME%] SET MULTI_USER" 
echo. 
pause 
+0

Wie wäre es mit der Wiederherstellung der Datenbank aus der Datei? –

+0

Auch ein Verweis auf das Originalhandbuch wäre super. Vielen Dank! –

+0

@ hamish-grubijan - Ich habe die Antwort wiederherstellen –

2

, wenn Sie die Batch-Datei benötigen Sie die Sicherung planen, haben die SQL-Management-Tools geplanten Aufgaben in gebaut ...

+2

Im Vergleich zu anderen Antworten ist dies nicht aussagekräftig. –

+0

Sprichst du darüber? "https://support.microsoft.com/en-us/kb/930615" –

1

Ich verwende SQL Server 2005 Express, und ich musste die Named Pipes-Verbindung aktivieren, um vom Windows-Befehl aus sichern zu können. Mein letztes Skript ist das:

@echo off 
set DB_NAME=Your_DB_Name 
set BK_FILE=D:\DB_Backups\%DB_NAME%.bak 
set DB_HOSTNAME=Your_DB_Hostname 
echo. 
echo. 
echo Backing up %DB_NAME% to %BK_FILE%... 
echo. 
echo. 
sqlcmd -E -S np:\\%DB_HOSTNAME%\pipe\MSSQL$SQLEXPRESS\sql\query -d master -Q "BACKUP DATABASE [%DB_NAME%] TO DISK = N'%BK_FILE%' WITH INIT , NOUNLOAD , NAME = N'%DB_NAME% backup', NOSKIP , STATS = 10, NOFORMAT" 
echo. 
echo Done! 
echo. 

Es funktioniert gut hier !!

2

Seba Illingworth ‚s-Code, falls Sie Zeit in Ihrem Dateinamen müssen (es gibt 2014-02-21_1035)

echo off 
cls 
echo -- BACKUP DATABASE -- 
set /p DATABASENAME=Enter database name: 
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) 
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) 

:: filename format Name-Date (eg MyDatabase-2009.5.19.bak) 
set DATESTAMP=%mydate%_%mytime% 
set BACKUPFILENAME=%CD%\%DATABASENAME%-%DATESTAMP%.bak 
set SERVERNAME=. 
echo. 

sqlcmd -E -S %SERVERNAME% -d master -Q "BACKUP DATABASE [%DATABASENAME%] TO DISK = N'%BACKUPFILENAME%' WITH INIT , NOUNLOAD , NAME = N'%DATABASENAME% backup', NOSKIP , STATS = 10, NOFORMAT" 
echo. 
pause 
0

Remove Old Backup files mit über Skript kombinieren kann dies ausführen Backup durch einen Scheduler, halten letzte 10 Backup-Dateien

echo off 
:: set folder to save backup files ex. BACKUPPATH=c:\backup 
set BACKUPPATH=<<back up folder here>> 

:: set Sql Server location ex. set SERVERNAME=localhost\SQLEXPRESS 
set SERVERNAME=<<sql host here>> 

:: set Database name to backup 
set DATABASENAME=<<db name here>> 

:: filename format Name-Date (eg MyDatabase-2009-5-19_1700.bak) 
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) 
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) 

set DATESTAMP=%mydate%_%mytime% 
set BACKUPFILENAME=%BACKUPPATH%\%DATABASENAME%-%DATESTAMP%.bak 
echo. 

sqlcmd -E -S %SERVERNAME% -d master -Q "BACKUP DATABASE [%DATABASENAME%] TO DISK = N'%BACKUPFILENAME%' WITH INIT , NOUNLOAD , NAME = N'%DATABASENAME% backup', NOSKIP , STATS = 10, NOFORMAT" 
echo. 

:: In this case, we are choosing to keep the most recent 10 files 
:: Also, the files we are looking for have a 'bak' extension 
for /f "skip=10 delims=" %%F in ('dir %BACKUPPATH%\*.bak /s/b/o-d/a-d') do del "%%F" 
2

können Sie verwenden sqlcmd ein Backup oder einen anderen T-SQL-Skript auszuführen. Sie finden die detaillierten Anweisungen und Beispiele auf verschiedenen nützlichen sqlcmd-switches in diesem Artikel: Working with the SQL Server command line (sqlcmd)