web-dev-qa-db-ja.com

SQL Server Expressを使用して毎日のバックアップをスケジュールするにはどうすればよいですか?

SQL Server Express(2005)をバックエンドとして使用して小さなWebアプリケーションを実行しています。 SQLスクリプトを使用してバックアップを作成できますが、これを毎日スケジュールしたいと思います。余分なオプションとして(必要があります)最後のXバックアップのみを保持したいと思います(スペース節約の理由から)

[編集] SQL Server ExpressはSQL Serverエージェントを使用できません...

61
edosoft

SQL Server ExpressでSQL Serverエージェントを使用することはできません。以前にそれを行った方法は、SQLスクリプトを作成し、それを毎日スケジュールされたタスクとして実行することです。バックアップスケジュール/保持に適合する複数のスケジュールされたタスクを持つことができます。スケジュールされたタスクで使用するコマンドは次のとおりです。

"C:\ Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i "c:\ path\to\sqlbackupScript.sql"

52
Sam Cogan

エドゥアルド・モルテニには素晴らしい答えがありました。

Windowsスケジュールタスクの使用:

バッチファイル内

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S 
(local)\SQLExpress -i D:\dbbackups\SQLExpressBackups.sql

SQLExpressBackups.sql

BACKUP DATABASE MyDataBase1 TO  DISK = N'D:\DBbackups\MyDataBase1.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase1 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

BACKUP DATABASE MyDataBase2 TO  DISK = N'D:\DBbackups\MyDataBase2.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase2 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO
50
JohnB

this スクリプトを使用して、サーバー上のすべてのデータベースを動的にバックアップします。次に、記事に従ってバッチファイルを作成します。完全バックアップ用と差分バックアップ用の2つのバッチファイルを作成すると便利です。次に、タスクスケジューラで、full用とdiff用の2つのタスクを作成します。

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

バッチファイルは次のようになります。

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='F'"  >> c:\Dropbox\backup\DB\full.log 2>&1

そして

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='D'"  >> c:\Dropbox\backup\DB\diff.log 2>&1

この方法の利点は、新しいデータベースを追加したりデータベースを削除したりしても、スクリプトにデータベースをリストする必要がないため、何も変更する必要がないことです。 JohnBからの回答は、1つのデータベースを使用するサーバーの方が優れている/単純であり、このアプローチは複数のデータベースサーバーにより適しています。

7
Tomas Kubes

MSSQLTipsのユーザーには、非常に役立つ記事があります。これに最も関連する記事は、「 SQL Server 2005 Expressバックアップの自動化と古いバックアップファイルの削除 」です。

基本的なアプローチは、Windowsタスクスケジューラを使用して2つのタスクを設定することです。 1つのタスクは、データベース名と指定されたディレクトリへのファイル名の日付/時刻スタンプを使用して、すべてのMSSQLデータベース(TEMPDBを除く)の個別のバックアップファイルを生成するTSQLスクリプトを実行します。 2番目のタスクは、VBScriptスクリプトを実行し、そのディレクトリを通過して、3日以上経過した.BAK拡張子を持つすべてのファイルを削除します。

両方のスクリプトrequire環境(パス、それらのデータベースダンプを保持する期間)の小さな編集が必要ですが、ドロップインアンドランに非常に近いです。

これらまたはディレクトリのアクセス許可をおろそかにしている場合、セキュリティに影響する可能性があることに注意してください。これらは、ある程度の特権で実行する必要があるプレーンテキストファイルであるためです。ずさんなことしないでください。

4
fencepost

次の組み合わせを使用しました。

  1. Cobian Backup スケジューリング/メンテナンス用

  2. ExpressMaint バックアップ用

どちらも無料です。このプロセスでは、ExpressMaintのスクリプトを作成して、バックアップをCobianの「バックアップ前」イベントとして取得します。通常、これで以前のバックアップファイルが上書きされます。次に、CobianはこのファイルからZip/7Zipを取り出し、これらをバックアップフォルダーにアーカイブします。 Cobianでは、保持するフルコピーの数を指定したり、複数のバックアップサイクルを作成したりできます。

ExpressMaintコマンド構文の例:

expressmaint -S Host\SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3 
3
mika

サーバーオブジェクトにバックアップデバイスを作成できます。

BDTEST

そして、次のコマンドを含むバッチファイルを作成します

sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"

名前で言いましょう

backup.bat

その後、あなたは電話することができます

backup.bat

あなたの都合に応じてタスクスケジューラで

0
Susheel Kumar