2009-05-19 7 views
34

Est-ce que quelqu'un sait s'il existe un moyen de mettre en script la sauvegarde de SQL Server dans un fichier de commandes, afin qu'il puisse être exécuté à partir d'une ligne de commande?Instruction de sauvegarde de la ligne de commande SQL Server

+0

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

Répondre

51

Voici un exemple, vous pouvez exécuter un script batch (copier-coller dans un fichier .bat), en utilisant l'utilitaire SQLCMD dans les outils client SQL Server:

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

Pourquoi ne pas restaurer la base de données à partir du fichier? –

+0

En outre, ajouter une référence au manuel d'origine serait génial. Merci! –

+0

@ hamish-grubijan - J'ai ajouté Restaurer à la réponse –

2

si vous avez besoin du fichier batch pour planifier la sauvegarde, les outils de gestion SQL ont des tâches planifiées construit en ...

+2

En comparaison avec d'autres réponses, ce n'est pas assez informatif. –

+0

Parlez-vous de ça? "https://support.microsoft.com/en-us/kb/930615" –

1

J'utilise SQL Server 2005 Express, et j'ai dû activer la connexion de Canaux nommés pour pouvoir sauvegarder à partir de la commande Windows. Mon dernier script est le suivant:

@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. 

Ça marche très bien ici !!

2

Seba Illingworth le code « , Dans le cas où vous avez besoin de temps dans votre nom de fichier (il donne 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

Combine Remove Old Backup files avec le script ci-dessus, cela peut effectuer une sauvegarde par un planificateur, gardez dernier 10 fichiers de sauvegarde

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

Vous pouvez utiliser sqlcmd pour exécuter une sauvegarde ou tout autre script T-SQL. Vous pouvez trouver les instructions détaillées et des exemples sur divers commutateurs sqlcmd utiles dans cet article: Working with the SQL Server command line (sqlcmd)

Questions connexes