【问题标题】:What is a simple command line program or script to backup SQL server databases?什么是备份 SQL Server 数据库的简单命令行程序或脚本?
【发布时间】:2010-09-12 11:15:27
【问题描述】:

我在内部服务器上执行数据库备份时过于松懈。

是否有一个简单的命令行程序可以用来备份 SQL Server 2005 中的某些数据库?还是有一个简单的VBScript?

【问题讨论】:

  • 就个人而言,我在订购柠檬应用程序和指导橙色实用程序方面的运气要好得多。命令石灰程序比它们的价值要麻烦得多。

标签: sql-server command-line scripting backup


【解决方案1】:

安排以下步骤备份所有数据库:

Use Master

Declare @ToExecute VarChar(8000)

Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk =     ''D:\Backups\Databases\' + [Name]   + '.bak'' With Format;' + char(13),'')
From
Master..Sysdatabases
Where
[Name] Not In ('tempdb')
and databasepropertyex ([Name],'Status') = 'online'

Execute(@ToExecute)

我的博客上还有更多详细信息:如何Automate SQL Server Express Backups

【讨论】:

  • 能否详细说明如何安排?
  • 请阅读我的博文。它详细介绍了您需要了解的所有内容。
  • 我认为这个问题要求在 SQL Server 外部运行的东西。
  • @bzlm,就像我说的。我的博客详细介绍了如何在 SQL Server 之外执行此操作:)
  • @GateKiller 你的博客链接还有效吗?我无法打开它
【解决方案2】:

如果你能找到数据库文件... "cp DBFiles backup/"

几乎可以肯定在大多数情况下是不可取的,但这很简单。

【讨论】:

  • 如果 SQL Server 正在运行,即使没有使用它,也不要这样做。
  • 使用这种方法成功备份和恢复数据库的几率非常小。只有在备份和恢复期间,它才会起作用:没有 SQL Server 进程正在运行,您识别并复制所有涉及的二进制文件,您正在运行完全相同的 SQL Server 版本和补丁级别(和/或视窗)。备份文件格式设计为跨版本可移植;二进制数据库文件不是。这适用于所有数据库,而不仅仅是 SQL Server。只是不要这样做。真的。不要这样做。
  • 这个答案 98.7% 是个笑话。 OTOH,如果您只恢复到完全相同的设置(也就是恢复/还原)并且可以关闭它(也就是本地开发服务器)并且可能还有其他一些事情......
【解决方案3】:

要从命令行备份单个数据库,请使用osqlsqlcmd

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" 
    -E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"

您还需要阅读有关 BACKUPRESTOREgeneral procedures 的文档。

【讨论】:

  • 这里有一个很好的脚本可以一次性备份所有用户数据库:mssqltips.com/tip.asp?tip=1070
  • 文档说WITH FORMAT 格式化存储介质:“FORMAT 选项使整个媒体内容无效,忽略任何现有内容。”确保这是您想要的.
  • @Tjaart,这就是我说先阅读文档的原因。如果您不使用 WITH FORMAT 并且选择了现有备份文件,则新备份将附加到文件中的现有备份中,这可能不是您想要的。
  • @Kiquenet Bzzzzzt -- 根据最初的要求,这将是一个 GUI 产品,因此不是简单的命令行程序或脚本。
  • 在我的安装中 osql.exeC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
【解决方案4】:

我使用ExpressMaint

例如备份所有用户数据库:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS

【讨论】:

  • Meixger,我找不到使用 ExpressMaint 的单一理由,因为 SQLBackupAndFTP 在所有可以想象的场景中都胜过它
【解决方案5】:

我在 Linux/UNIX 基础架构上使用 tsql 来访问 MSSQL 数据库。这是一个将表转储到文件的简单 shell 脚本:

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}

【讨论】:

    【解决方案6】:

    我在 Microsoft 支持页面 http://support.microsoft.com/kb/2019698 上找到了这个。

    效果很好!而且由于它来自微软,我觉得它很合法。

    基本上有两个步骤。

    1. 在您的主数据库中创建一个存储过程。请参阅 msft 链接,或者如果它已损坏,请在此处尝试:http://pastebin.com/svRLkqnq
    2. 从您的任务计划程序计划备份。您可能希望先放入 .bat 或 .cmd 文件,然后安排该文件。

      sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'"  1>c:\SQL_Backup\backup.log            
      

    显然,将 YOUR_SERVER_NAME 替换为您的计算机名称,或者尝试使用 .\SQLEXPRESS 并确保备份文件夹存在。在这种情况下,它试图将其放入 c:\SQL_Backup

    【讨论】:

    【解决方案7】:

    如果您没有 –E 开关声明的可信连接,则为最终结果

    使用下面的命令行

    "[program dir]\[sql server version]\Tools\Binn\osql.exe" -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak'" -S [server] –U [login id] -P [password]

    在哪里

    [程序目录]是osql.exe所在的目录

    在 32 位操作系统上 c:\Program Files\Microsoft SQL Server\
    在 64 位操作系统上 c:\Program Files (x86)\Microsoft SQL Server\

    [sql server version]你的sql server version 110 or 100 or 90 or 80 以最大数开头

    [server] 你的服务器名或服务器 ip

    [登录 id] 您的 ms-sql 服务器用户登录名

    [password] 所需的登录密码

    【讨论】:

    • C:\tmpserverlocal 中的路径?
    • 备份始终存储在服务器的磁盘中,因此 c:\tmp 在服务器上
    【解决方案8】:

    您可以通过 ApexSQL 使用备份应用程序。虽然它是一个 GUI 应用程序,但它的所有功能都在 CLI 中支持。可以执行一次性备份操作,也可以创建一个定期备份指定数据库的作业。您可以查看文章中的切换规则和示例:

    【讨论】:

      【解决方案9】:

      您可以使用我专门为此目的编写的 VB 脚本: https://github.com/ezrarieben/mssql-backup-vbs/

      在“任务计划程序”中安排一个任务来执行你喜欢的脚本,它将整个数据库备份到一个 BAK 文件并保存在你指定的任何地方。

      【讨论】:

        【解决方案10】:
        SET NOCOUNT ON;
        declare @PATH VARCHAR(200)='D:\MyBackupFolder\'
         -- path where you want to take backups
        IF OBJECT_ID('TEMPDB..#back') IS NOT NULL
        
        DROP TABLE #back
        
        CREATE TABLE #back
        (
        RN INT IDENTITY (1,1),
        DatabaseName NVARCHAR(200)
        
        )
        
        INSERT INTO #back 
        SELECT       'MyDatabase1'
        UNION SELECT 'MyDatabase2'
        UNION SELECT 'MyDatabase3'
        UNION SELECT 'MyDatabase4'
        
        -- your databases List
        
        DECLARE @COUNT INT =0 ,  @RN INT =1, @SCRIPT NVARCHAR(MAX)='',  @DBNAME VARCHAR(200)
        
        PRINT '---------------------FULL BACKUP SCRIPT-------------------------'+CHAR(10)
        SET @COUNT = (SELECT COUNT(*) FROM #back)
        PRINT 'USE MASTER'+CHAR(10)
        WHILE(@COUNT > = @RN)
        BEGIN
        
        SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
        SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
        + REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.bak'''+CHAR(10)+'WITH COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
        PRINT @SCRIPT
        SET @RN=@RN+1
        END
        
         PRINT '---------------------DIFF BACKUP SCRIPT-------------------------'+CHAR(10)
        
          SET  @COUNT  =0 SET  @RN  =1 SET @SCRIPT ='' SET @DBNAME =''
         SET @COUNT = (SELECT COUNT(*) FROM #back)
        PRINT 'USE MASTER'+CHAR(10)
        WHILE(@COUNT > = @RN)
        BEGIN
        SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
        SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
        + REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.diff'''+CHAR(10)+'WITH DIFFERENTIAL, COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
        PRINT @SCRIPT
        SET @RN=@RN+1
        END
        

        【讨论】:

          【解决方案11】:

          Microsoft 对在 SQL Express 上备份所有用户数据库的回答是 here

          过程是:复制、粘贴和执行他们的代码(见下文。我在顶部注释了一些奇怪的未注释行)作为数据库服务器上的查询。这意味着您应该首先安装 SQL Server Management Studio(或者使用 SSMS 连接到您的数据库服务器)。此代码执行将在您的数据库服务器上创建一个存储过程。

          创建一个批处理文件以执行存储过程,然后使用任务计划程序安排此批处理文件的定期(例如每晚)运行。我的代码(有效)是他们第一个示例的略微修改版本:

          sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'" 
          

          这对我有用,我喜欢它。每次运行它时,都会创建新的备份文件。您需要设计一种定期删除旧备份文件的方法。我已经有一个做这种事情的例程,所以我会在磁盘上保留几天的备份(足够长的时间让他们得到我的正常备份例程的备份),然后我会删除它们。换句话说,我手头上总是有几天的备份,而不必从我的备份系统中恢复。

          我将在下面粘贴微软的存储过程创建脚本:

          --// Copyright © Microsoft Corporation.  All Rights Reserved.
          --// This code released under the terms of the
          --// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
          
          USE [master] 
          GO 
          
          /****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 
          
          SET ANSI_NULLS ON 
          GO 
          
          SET QUOTED_IDENTIFIER ON 
          GO 
          
           
          -- ============================================= 
          -- Author: Microsoft 
          -- Create date: 2010-02-06
          -- Description: Backup Databases for SQLExpress
          -- Parameter1: databaseName 
          -- Parameter2: backupType F=full, D=differential, L=log
          -- Parameter3: backup file location
          -- =============================================
          
          CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
                      @databaseName sysname = null,
                      @backupType CHAR(1),
                      @backupLocation nvarchar(200) 
          AS 
          
                 SET NOCOUNT ON; 
          
                      DECLARE @DBs TABLE
                      (
                            ID int IDENTITY PRIMARY KEY,
                            DBNAME nvarchar(500)
                      )
                     
                       -- Pick out only databases which are online in case ALL databases are chosen to be backed up
          
                       -- If specific database is chosen to be backed up only pick that out from @DBs
          
                      INSERT INTO @DBs (DBNAME)
                      SELECT Name FROM master.sys.databases
                      where state=0
                      AND name=@DatabaseName
                      OR @DatabaseName IS NULL
                      ORDER BY Name
          
           
                     -- Filter out databases which do not need to backed up
           
                     IF @backupType='F'
                            BEGIN
                            DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
                            END
                      ELSE IF @backupType='D'
                            BEGIN
                            DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                            END
                      ELSE IF @backupType='L'
                            BEGIN
                            DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                            END
                      ELSE
                            BEGIN
                            RETURN
                            END
                     
          
                      -- Declare variables
          
                      DECLARE @BackupName varchar(100)
                      DECLARE @BackupFile varchar(100)
                      DECLARE @DBNAME varchar(300)
                      DECLARE @sqlCommand NVARCHAR(1000) 
                  DECLARE @dateTime NVARCHAR(20)
                      DECLARE @Loop int                  
                                 
                      -- Loop through the databases one by one
          
                      SELECT @Loop = min(ID) FROM @DBs
                 WHILE @Loop IS NOT NULL
                BEGIN
           
          -- Database Names have to be in [dbname] format since some have - or _ in their name
          
                SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
          
          
          -- Set the current date and time n yyyyhhmmss format
          
                SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  
           
          
          -- Create backup filename in path\filename.extension format for full,diff and log backups
          
                IF @backupType = 'F'
                      SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
                ELSE IF @backupType = 'D'
                      SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
                ELSE IF @backupType = 'L'
                      SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'
           
          
          -- Provide the backup a name for storing in the media
          
                IF @backupType = 'F'
                      SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
          
                IF @backupType = 'D'
                      SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
          
                IF @backupType = 'L'
                      SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime
          
          
          -- Generate the dynamic SQL command to be executed
          
                 IF @backupType = 'F' 
                            BEGIN
                         SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                            END
          
                 IF @backupType = 'D'
                            BEGIN
                         SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                            END
          
                 IF @backupType = 'L' 
                            BEGIN
                         SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                            END
           
          
          -- Execute the generated SQL command
          
                 EXEC(@sqlCommand)
          
           
          -- Goto the next database
          
          SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
           
          
          END​
          

          【讨论】:

            【解决方案12】:

            当您在日常工作中处理 dockerised mssql 容器并希望从表中快速转储数据时,这会很有帮助。当您频繁地重新构建 db 容器并且不想在重新构建后丢失测试数据时,我特别发现它很有用。

            Export data using bcp utility
            /opt/mssql-tools/bin/bcp <Table_Name> out /tmp/MyData.bcp -d <database_name> -c -U <user_name> -P "<password>" -S <server_name>
            
            Import data using bcp utility
            
            /opt/mssql-tools/bin/bcp <Table_Name> IN /tmp/MyData.bcp -d <database_name> -c -U <user_name> -P "<password>" -S <server_name>
            

            【讨论】:

              【解决方案13】:

              这是一个例子,它将备份数据库,使用 7zip 压缩并删除备份文件,因此与存储相关的问题也解决了。在这个例子中,我使用了 7zip,它是免费的

              @echo off
              
              CLS
              
              echo Running dump ...
              
              sqlcmd -S SERVER\SQLEXPRESS -U username -P password -Q "BACKUP DATABASE master TO DISK='D:\DailyDBBackup\DB_master_%date:~-10,2%%date:~-7,2%%date:~-4,4%.bak'"
              
              echo Zipping ...
              
              "C:\Program Files\7-Zip\7z.exe" a -tzip "D:\DailyDBBackup\DB_master_%date:~-10,2%%date:~-7,2%%date:~-4,4%_%time:~0,2%%time:~3,2%%time:~6,2%.bak.zip" "D:\DailyDBBackup\DB_master_%date:~-10,2%%date:~-7,2%%date:~-4,4%.bak"
              
              echo Deleting the SQL file ...
              
              del "D:\DailyDBBackup\DB_master_%date:~-10,2%%date:~-7,2%%date:~-4,4%.bak"
              
              echo Done!
              

              将此保存为 sqlbackup.bat 并安排它每天运行。

              如果您只想备份,那么您可以创建脚本而无需压缩和删除。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-27
                • 2017-08-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多