SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server Express Edition で定期的にデータベースをバックアップ

leave a comment

以前投稿した内容に SQL Server 2008 Express Edition でメンテナンスプランの利用についてコメントをいただきました。

残念ながら SQL Server の Express Edition では、メンテナンスプランが使用できないんですよね。
SQL Server 2008 の各エディションがサポートする機能

また、SQL Server の Express Edition では SQL Server Agent も使用できないため、定期的なジョブを SQL Server 側で
実行することができません。

スキルチャージプログラムで貸与されている環境は Community Server をインストールしてあり、データベースには
SQL Server 2008 Express Edition を使用しています。
この環境ですが日次で 1 世代のバックアップだけは自動で取得する用に設定をしてあります。

メンテナンスプランと SQL Server Agent を使用できない状態で定期的にバックアップを取得するため、
タスクスケジューラ + SQLCMD.EXE を使ってバックアップのスケジューリングを設定しています。

[タスク スケジューラ] は管理ツールの中に入っています。 

このタスク スケジューラで以下のようなタスクを作成しています。
 image image
image

操作には以下のような設定を登録してあります。

操作 プログラムの開始
プログラム/スクリプト "C:Program FilesMicrosoft SQL Server100ToolsBinnSQLCMD.EXE"
引数の追加 (オプション) -S localhost<インスタンス名> -E -i "E:ToolsBackupCSDBBackup.sql"

 

CSDBBackup.sql には以下の内容を記載しています。
# SSMS で生成したスクリプトを記載しているだけですが。

BACKUP DATABASE [CommunityServer] TO  DISK = N’E:BackupCommunityServer.bak’ WITH NOFORMAT, INIT,
NAME = N’CommunityServer-完全 データベース バックアップ’, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

 

同様の方法でインデックスのメンテナンスも可能です。
ざっくりと作ったインデックスの再構築のクエリです。
これを SQLCMD でタスクスケジューラから実行すると定期的にインデックスの断片化を解消することができます。
# アドホッククエリで書いてしまっていますが…。

SET NOCOUNT ON
USE [CommunityServer]
GO
DECLARE @name sysname
DECLARE @SQL nvarchar(500)

SELECT * INTO [#tables] FROM [sys].[tables]

DECLARE [table_cursor] CURSOR FOR
SELECT [name] FROM [#tables]

OPEN [table_cursor]
FETCH NEXT FROM [table_cursor] INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = N’ALTER INDEX ALL ON [‘ + @name + ‘] REBUILD’
    EXECUTE sp_executesql @SQL
    FETCH NEXT FROM [table_cursor] INTO @name
END

CLOSE [table_cursor]
DEALLOCATE [table_cursor]

 

自分でクエリを書くのが面倒な場合は、定期的に実行したい操作を SSMS からスクリプト化しておけばよいと思います。

Express Edition を使っていてもデータベースのメンテナンスは定期的に実行しないと駄目ですが、無償版なので
この辺の機能がないのは仕方ないですね。

Written by masayuki.ozawa

1月 31st, 2010 at 3:26 pm

Posted in SQL Server

Leave a Reply

*