SQLサーバーデータベースをバックアップする簡単なコマンドラインプログラムまたはスクリプトとは何ですか?


94

私は内部サーバーでDBバックアップを実行するのが面倒です。

SQL Server 2005で特定のデータベースをバックアップするために使用できる簡単なコマンドラインプログラムはありますか?または、単純なVBScriptはありますか?


6
個人的には、私はレモンアプリケーションの注文とオレンジのユーティリティの指示ではるかに幸運です。コマンドライムプログラムは、それらの価値よりもはるかに厄介です。
ジム

回答:


108

コマンドラインから単一のデータベースをバックアップするには、osqlまたはsqlcmdを使用します。

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

また、バックアップ復元、および一般的な手順に関するドキュメントもご覧ください


3
すべてのユーザーデータベースを一度にバックアップするための適切なスクリプトがあります。mssqltips.com
van Valen

7
ドキュメントにはWITH FORMAT、ストレージメディアをフォーマットするよう記載されています。「FORMATオプションは、既存のコンテンツを無視して、メディアコンテンツ全体を無効にします。」これが希望どおりであることを確認してください。
alexg

4
@Tjaart、それで私は最初にドキュメントを読むように言いました。WITH FORMATを使用せずに既存のバックアップファイルを選択した場合、新しいバックアップがファイル内の既存のバックアップに追加されますが、これは適切でない場合があります。
Craig Trader

@Kiquenet Bzzzzzt-それはGUI製品であり、したがって、元の質問によると単純なコマンドラインプログラムやスクリプトではありません。
Craig Trader 2017年

私のインストレーション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、私はExpressMaintを使用する単一の理由を見つけることができません。SQLBackupAndFTPがあらゆる考えられるシナリオでそれを打ち負かすとき

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バックアップ自動化する方法。


スケジュールの方法について詳しく教えてください。
フランク・クルーガー

私のブログ投稿を読んでください。それはあなたが知る必要があるすべてを詳述します。
GateKiller 2008

この質問は、SQL Serverの外部で実行されるものを求めていると思います。
bzlm 2009

@bzlm、私が言ったように。私のブログには、SQL Serverの外部でこれを行う方法の詳細があります:)
GateKiller

1
@GateKillerあなたのブログのリンクはまだ有効ですか?私はそれを開くことができません
Yash Saraiya

5

これはマイクロソフトサポートページhttp://support.microsoft.com/kb/2019698で見つかりました。

それはうまくいきます!それはマイクロソフトからのものなので、かなり合法だと感じています。

基本的に2つのステップがあります。

  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
それだけの価値があるので、私は結局 、dbaコミュニティの間で非常に尊敬されていると思うola.hallengren.comのものと合わせて、上記の方法を使用することになりました。それは魅力のように働いています。
John W.

5

ApexSQLでバックアップアプリケーションを利用できます。GUIアプリケーションですが、CLIでサポートされているすべての機能を備えています。1回限りのバックアップ操作を実行することも、指定したデータベースを定期的にバックアップするジョブを作成することもできます。切り替えルールを確認し、記事で例を示します。


4

Linux / UNIXインフラストラクチャでtsqlを使用してMSSQLデータベースにアクセスしています。テーブルをファイルにダンプする簡単なシェルスクリプトを次に示します。

#!/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]

どこ

[program dir]はosql.exeが存在するディレクトリです

32ビットOSの場合c:\ Program Files \ Microsoft SQL Server \
64ビットOSの場合c:\ Program Files(x86)\ Microsoft SQL Server \

[SQLサーバーのバージョン] SQLサーバーのバージョン110または100または90または80は、最大の番号で始まります

[サーバー]サーバー名またはサーバーIP

[ログインID] ms-sqlサーバーのユーザーログイン名

[password]必要なログインパスワード


1
C:\tmpパスはサーバーまたはローカルですか?
Kiquenet 2017年

バックアップは常にサーバーのディスクに保存されるため、c:\ tmpはサーバー上にあります
George Vrynios

1

SQL ExpressですべてのユーザーデータベースをバックアップするというMicrosoftの答えは次のとおりです

プロセスは次のとおりです。それらのコードをコピー、貼り付け、実行します(以下を参照してください。奇妙な非コメント行を上部にコメントしました)。これをデータベースサーバー上のクエリとして使用します。つまり、最初にSQL Server Management Studioをインストールする(またはSSMSでデータベースサーバーに接続する)必要があります。このコードを実行すると、データベースサーバーにストアドプロシージャが作成されます。

ストアドプロシージャを実行するバッチファイルを作成し、タスクスケジューラを使用してこのバッチファイルの定期的(たとえば、毎晩)の実行をスケジュールします。私のコード(動作する)は、最初の例を少し変更したバージョンです。

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

これは私にとってはうまくいき、私はそれが好きです。実行するたびに、新しいバックアップファイルが作成されます。古いバックアップファイルを定期的に削除する方法を考案する必要があります。私はすでにそのようなことを行うルーチンを持っているので、ディスクに2、3日分のバックアップを保持し(通常のバックアップルーチンでバックアップされるのに十分な時間)、それらを削除します。つまり、バックアップシステムから復元しなくても、常に数日分のバックアップが手元にあります。

以下の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

この目的のために私が正確に記述したVBスクリプトを使用することができます:https : //github.com/ezrarieben/mssql-backup-vbs/

「タスクスケジューラ」でタスクをスケジュールし、スクリプトを好きなように実行します。DB全体がBAKファイルにバックアップされ、指定した場所に保存されます。


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

DBファイルが見つかれば... "cp DBFiles backup /"

ほとんどの場合ほとんどの場合推奨さませんが、すべての起動と同じくらい簡単です。


1
SQL Serverが実行中の場合は、何も使用していない場合でも、これを行わないでください。
クレイグトレーダー

6
この方法を使用してデータベースを正常にバックアップおよび復元する確率は非常に低くなっています。バックアップと復元の両方の場合にのみ機能します。SQLServerプロセスが実行されておらず、関係するすべてのバイナリファイルを識別してコピーします。SQLServerのまったく同じバージョンとパッチレベルを実行しています(またはウィンドウズ)。バックアップファイルの形式は、バージョンをまたがって移植できるように設計されています。バイナリデータベースファイルは違います。これは、SQL Serverだけでなく、すべてのデータベースに当てはまります。しないでください。本当に。こんなことしないで。
Craig Trader

この答えは98.7%は冗談です。あなただけ正確に同じ設定に復元する場合は大藤おそらくいくつか他のものを(別名/復元元に戻す)と(それがローカルのdevのサーバーだ別名)それをシャットダウンすることができ、...
BCS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.