2009-05-19 63 views
34

Có ai biết nếu có cách để tạo bản sao lưu SQL Server vào tệp lô, để nó có thể được thực thi từ một dòng lệnh không?Câu lệnh sao lưu dòng lệnh SQL Server

+0

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

Trả lời

51

Dưới đây là một ví dụ bạn có thể chạy như một kịch bản hàng loạt (copy-dán vào một tập tin .bat), sử dụng tiện ích SQLCMD trong Sql server khách hàng các công cụ:

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

Làm cách nào để khôi phục cơ sở dữ liệu từ tệp? –

+0

Ngoài ra, việc thêm tham chiếu đến hướng dẫn ban đầu sẽ thật tuyệt vời. Cảm ơn! –

+0

@ hamish-grubijan - Tôi đã thêm Khôi phục vào câu trả lời –

2

nếu bạn cần các tập tin batch để lên lịch sao lưu, công cụ quản lý SQL đã sắp xếp công việc xây dựng trong ...

+2

So sánh với các câu trả lời khác, điều này không đủ thông tin. –

+0

Bạn đang nói về điều này? "https://support.microsoft.com/en-us/kb/930615" –

1

Tôi đang sử dụng SQL Server 2005 Express và tôi phải bật kết nối Đặt tên có tên để có thể sao lưu từ Lệnh Windows. Tập lệnh cuối cùng của tôi là:

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

Nó hoạt động tốt ở đây !!

2

Seba Illingworth 's mã, Trong trường hợp bạn cần nhiều thời gian trong tên tập tin của bạn (nó mang lại cho 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

Kết hợp Remove Old Backup files với kịch bản nêu trên thì đây có thể thực hiện sao lưu bằng một lịch trình, giữ cuối cùng 10 tệp sao lưu

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

Bạn có thể sử dụng sqlcmd để chạy bản sao lưu hoặc bất kỳ tập lệnh T-SQL nào khác. Bạn có thể tìm thấy hướng dẫn chi tiết và ví dụ về các công tắc sqlcmd hữu ích khác nhau trong bài viết này: Working with the SQL Server command line (sqlcmd)

Các vấn đề liên quan