有谁知道是否有办法将 SQL Server 备份脚本写入批处理文件,以便可以从命令行执行?
这是一个示例,您可以使用 Sql Server 客户端工具中的 SQLCMD 实用程序作为批处理脚本运行(复制粘贴到 .bat 文件中):
备份:
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
恢复:
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
Seba Illingworth 的代码,以防您的文件名需要时间(它给出 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
您可以使用 sqlcmd 运行备份,或任何其他 T-SQL 脚本。您可以在本文中找到有关各种有用的 sqlcmd 开关的详细说明和示例:使用 SQL Server 命令行 (sqlcmd)
如果您需要批处理文件来计划备份,SQL 管理工具内置了计划任务...
Combine Remove Old Backup files with above script 然后这可以通过调度程序执行备份,保留最后 10 个备份文件
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"
我正在使用 SQL Server 2005 Express,我必须启用命名管道连接才能从 Windows 命令进行备份。我的最终剧本是这样的:
@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.
在这里工作得很好!!
sqlcmd
通常,需要命令行备份脚本才能自动运行它。 除了备份本身,脚本还必须做两件事:
这里是一个脚本,用于备份一个数据库,清理(删除过时的备份),并向 Windows 事件日志写入通知:
set DB_NAME=MyDatabaseName
set BACKUP_DIR=C:\Backups
set DAYS_TO_KEEP=0
echo "Starting backup of %DB_NAME% database..."
sqlcmd -E -S . -Q "BACKUP DATABASE %DB_NAME% TO DISK='%BACKUP_DIR%\%DB_NAME%_%date:/=-%_%time::=-%.bak' WITH INIT, COMPRESSION"
if %ERRORLEVEL% neq 0 (
echo "Backup failed with error code %ERRORLEVEL%."
eventcreate /T ERROR /L APPLICATION /ID 100 /D "SQL Server backup failed with error code %ERRORLEVEL%."
goto end
)
echo "Deleting old backup files older than %DAYS_TO_KEEP% days in directory %BACKUP_DIR% ..."
forfiles /P "%BACKUP_DIR%" /M "%DB_NAME%*.bak" /D -%DAYS_TO_KEEP% /C 2>nul "cmd /c if @ISDIR==FALSE del @PATH"
echo Old backup files deleted successfully.
:end
echo "Script complete."
Backup-SqlDatabase
批处理脚本非常有限。使用 PowerShell 脚本效率更高。此外,它具有直接与 SQL Server 交互的模块。
安装SqlServer模块:
Install-Module -Name SqlServer
现在,例如,
Get-ChildItem
命令可以用来查询数据库列表。使用Backup-SqlDatabase
命令备份数据库。这是一般备份所有数据库的命令:
Get-ChildItem "SQLSERVER:\SQL\[server-name]\[instance-name]\Databases" | Backup-SqlDatabase -BackupContainer "[backup-path]"
举个例子:
Get-ChildItem "SQLSERVER:\SQL\MSI\DEFAULT\Databases" | Backup-SqlDatabase -BackupContainer "c:\Backups2\"
原则上,一个非常复杂的脚本可以用PowerShell编写,这将仅受您的需求限制。
这里是一个示例脚本,用于将备份发送到共享文件夹。
了解更多关于
Backup-SqlDatabase
无需自己编写脚本,可以使用第三方备份实用程序。例如 SqlBak-CLI。 将备份发送到 FTP 的示例。
创建一个 JSON 文件,其中设置了从何处获取备份以及将其发送到何处:
{
"source":
{
"type":"mssql",
"source_name":"source-name",
"data_source":".",
"trust_server_certificate":true,
"is_integrated_security":false,
"user_name":"sa",
"user_password":"*******",
"backup_items":{
"item_types":[
"mssql_custom"
]
}
},
"storages":[
{
"type":"ftp",
"server_name":"backup-storage.com",
"user_name":"ftp-user",
"user_password":"*************",
"path":"backups"
}
]
}
要开始备份,请使用以下命令:
sqlbak-cli run-backup --job-settings=backup-settings.json
更多关于SqlBak-CLI