什么是用于备份SQL Server数据库的简单命令行程序或脚本?


94

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

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


6
就个人而言,我对订单柠檬应用程序和指令橙色实用程序的运气好得多。命令石灰程序比它们值得的麻烦更多。
吉姆

Answers:


108

要从命令行备份单个数据库,请使用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"

您还需要阅读有关BACKUPRESTORE的文档以及常规过程


3
有一个很好的脚本可以一次性备份所有用户数据库: mssqltips.com/tip.asp?tip=1070
Marnix van Valen 2009年

7
该文档说WITH FORMAT格式化存储介质:“ FORMAT选项使整个介质内容无效,而忽略任何现有内容。 ”确保这是您想要的。
alexg

4
@Tjaart,这就是为什么我说要先阅读文档。如果您不使用WITH FORMAT,而是选择一个现有的备份文件,那么新的备份将被添加到文件中现有的备份中,这可能不是您想要的。
Craig Trader

@Kiquenet Bzzzzzt-按照原始要求,这将是GUI产品,因此不是简单的命令行程序或脚本。
Craig Trader

我的装置osql.exe是在C:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
马修·洛克

9

我使用ExpressMaint

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

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

1
Meixger,在每种可能的情况下,当SQLBackupAndFTP击败它时,我找不到使用ExpressMaint的单一原因

8

计划以下内容备份所有数据库:

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)

我的博客上还有更多详细信息:如何自动化SQL Server Express备份


您能详细说明如何安排时间吗?
Frank Krueger

请阅读我的博客文章。它详细介绍了您需要了解的所有内容。
GateKiller

我认为这个问题要求 SQL Server 之外运行的东西。
bzlm

@bzlm,就像我说的那样。我的博客详细介绍了如何在SQL Server外部执行此操作:)
GateKiller

1
@GateKiller您的博客链接仍然有效吗?我无法打开它
Yash Saraiya

5

我在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


1
对于它的价值,我最终与ola.hallengren.com的内容一起使用了上面的方法 ,我认为它在dba社区中非常受尊重。它就像一种魅力。
John W.

5

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


4

我在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}

3

最终,如果您没有–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版本]您的sql server版本110或100或90或80以最大的数字开头

[服务器]您的服务器名称或服务器IP

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

[密码]所需的登录密码


1
C:\tmp服务器路径还是本地路径?
Kiquenet '17

备份始终存储在服务器磁盘中,因此c:\ tmp位于服务器上
George Vrynios

1

微软的回答备份在SQL Express的所有用户数据库是在这里

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

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

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

这对我有用,我喜欢它。每次运行它时,都会创建新的备份文件。您需要设计一种定期删除旧备份文件的方法。我已经有一个执行此类操作的例程,因此,我将在磁盘上保留几天的备份(足够长的时间以使它们可以通过我的常规备份例程进行备份),然后将其删除。换句话说,我将始终拥有几天的备份时间,而不必从备份系统中还原。

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

--// 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


0
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

-10

如果可以找到数据库文件...“ cp DBFiles backup /”

几乎可以肯定,在大多数情况下不建议这样,但这就像所有的准备工作一样简单。


1
如果SQL Server正在运行,则不要执行此操作,即使没有使用它也是如此。
Craig Trader

6
使用这种方法成功备份和还原数据库的可能性很小。如果仅在备份和还原期间运行,则它只能工作:没有SQL Server进程正在运行,您标识并复制了所有涉及的二进制文件,正在运行与SQL Server完全相同的版本和补丁程序级别(和/或视窗)。备份文件格式设计为可跨版本移植;二进制数据库文件不是。所有数据库,而不仅仅是SQL Server,都是如此。只是不要这样做。真。不要这样做。
Craig Trader

这个回答是98.7%的笑话。OTOH,如果您仅将还原到完全相同的设置(又称为还原/还原),并且可以关闭(也就是本地开发服务器),并且可能还有其他事情……
BCS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.