100

在我们的内部服务器上执行数据库备份时,我太松懈了。

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

4

13 回答 13

116

要从命令行备份单个数据库,请使用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以及一般过程的文档。

于 2008-09-23T18:15:38.337 回答
9

我使用ExpressMaint

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

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
于 2009-02-25T16:14:15.463 回答
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 备份

于 2008-09-23T18:09:48.007 回答
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

于 2013-05-25T22:09:49.223 回答
5

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

于 2017-11-30T15:04:43.407 回答
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}
于 2012-06-12T18:08:47.933 回答
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]

在哪里

[program dir]是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 开头最大数

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

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

[密码] 所需的登录密码

于 2014-06-25T12:49:44.207 回答
2

Microsoft 对在 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​
于 2020-05-06T20:27:10.630 回答
1

这是一个示例,它将备份数据库,使用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 并安排它每天运行。

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

于 2021-10-08T10:42:34.620 回答
0

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

在“任务计划程序”中安排任务以根据需要执行脚本,它将整个数据库备份到 BAK 文件并将其保存在您指定的任何位置。

于 2018-09-11T20:10:41.260 回答
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
于 2019-04-10T09:29:02.500 回答
0

当您在日常工作中处理 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>
于 2021-04-14T18:38:05.950 回答
-10

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

在大多数情况下几乎可以肯定是不可取的,但这就像所有的起床一样简单。

于 2008-09-23T18:14:48.557 回答