2009-05-19 34 views

Respuesta

51

He aquí un ejemplo que puede ejecutarse como un archivo por lotes (copiar y pegar en un archivo .bat), mediante la utilidad SQLCMD en las herramientas de cliente de 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

¿Qué hay de restaurar la base de datos del archivo? –

+0

Además, agregar una referencia al manual original sería increíble. ¡Gracias! –

+0

@ hamish-grubijan - Agregué Restaurar a la respuesta –

2

si necesita el archivo por lotes para programar la copia de seguridad, las herramientas de administración de SQL han construido las tareas programadas en ...

+2

Comparando a otras respuestas esto no es suficientemente informativo. –

+0

¿Estás hablando de esto? "https://support.microsoft.com/en-us/kb/930615" –

1

Estoy usando SQL Server 2005 Express, y tuve que habilitar la conexión de Canalizaciones con nombre para poder realizar una copia de seguridad desde el Comando de Windows. Mi script final es el siguiente:

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

¡Está funcionando bien aquí!

2

Seba Illingworth código 's, en caso de que necesite tiempo en su nombre de archivo (que da 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

Combinar Remove Old Backup files con script de arriba, entonces esto puede llevar a cabo la copia de seguridad por un programador, mantenga última 10 archivos de copia de seguridad

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

Puede usar sqlcmd para ejecutar una copia de seguridad o cualquier otra secuencia de comandos T-SQL. Puede encontrar las instrucciones detalladas y ejemplos en varios modificadores sqlcmd útiles en este artículo: Working with the SQL Server command line (sqlcmd)

Cuestiones relacionadas