SQL Server命令行备份语句

问题描述 投票:0回答:7

有谁知道是否有办法将 SQL Server 备份脚本写入批处理文件,以便可以从命令行执行?

sql-server command-line backup
7个回答
58
投票

这是一个示例,您可以使用 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

3
投票

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

3
投票

您可以使用 sqlcmd 运行备份,或任何其他 T-SQL 脚本。您可以在本文中找到有关各种有用的 sqlcmd 开关的详细说明和示例:使用 SQL Server 命令行 (sqlcmd)


2
投票

如果您需要批处理文件来计划备份,SQL 管理工具内置了计划任务...


2
投票

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"

1
投票

我正在使用 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.

在这里工作得很好!!


0
投票

批量+
sqlcmd

通常,需要命令行备份脚本才能自动运行它。 除了备份本身,脚本还必须做两件事:

  1. 删除过时的备份 - 如果不删除它们,那么随着时间的推移硬盘空间会用完,并且没有必要无限期地存储备份。
  2. 至少在某处留下关于备份结果的通知。 - 最简单的方法是在 Windows 事件日志中显示通知。在这种情况下,可以在服务器管理器 > 仪表板中找到错误。

这里是一个脚本,用于备份一个数据库,清理(删除过时的备份),并向 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."

powershell +
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

© www.soinside.com 2019 - 2024. All rights reserved.