悪夢の一夜 今朝は息子とラジコン
11 月 13

前回からの宿題を片付けておきましょう

こんな感じで目的とするSQL Server 2005 Express から自動でバックアップを作り出すことができます

本当はmdfファイルとlogファイルをコピーして保管するのが望ましいとは思うのだが
いろいろテストしたところバックアップファイルからも正常にリストアできることを確認しているので深追いはよそう

今回稼動させている環境について説明をしておくと

ホスト名で接続できるような環境ではない「DNSサーバーやDHCPサーバーは設定していない」
サーバーもクライアントも全て固定のIPアドレスを設定してLANを組んでいる
旧SQL Serverに合わせてインスタンス名は使わないように設定している
SQL認証を使っている

例として
利用DB: SQL Server 2005 Express
DB名: test_db
ログインID: hoge   これはSQL Server 2005 ExpressのSQL認証用ユーザー名
パスワード: 1234   これはSQL Server 2005 ExpressのSQL認証用パスワード
バックアップ保存場所: c:\backup
保存ファイル名:test「yyyymmdd」.bak
サーバーのIPアドレス: 192.168.100.100
サーバーのOS: Windows Server 2008 R2 (当然64bitです)

1. データーベースからバックアップを作り出す命令を用意する

BACKUP DATABASE test_db TO DISK=’c:\backup\tmp’ WITH INIT
GO

この簡単な記述を書いたファイルをbackup.sqlとでも名前を付けて保存する。
これで目的のtest_dbのみ「完全バックアップ」ファイルとして処理できる
因みに後で日付を絡めたファイル名にするので仮ファイルとしてtmpとしておいた

 

2. backup.sqlを実行し日付を含むファイル名として保存するように記述したバッチファイルを用意する
内容はこんな感じで

SQLCMD -S 192.168.100.100 -U hoge -P 1234 -iC:\backup\backup.sql
    ※サーバーにSQL認証で接続しバックアップ作業開始
set fname=%date:~-10,4%%date:~-5,2%%date:~-2,2%
    ※実行日の日付を取得し fname にセットする
move /y c:\backup\tmp c:\backup\test.%fname%.bak
    ※tmpを所定のファイル名として保存するようにする
forfiles /P C:\backup /M *.bak /C “cmd /c del /s @path” /D -7
    ※7日分残して古いデーターを消す

この4行(※の行は削除してね)を記述したファイルをbackup.batとして保存
実際にこのbackup.batを実行すると
test.20101101.bakのように実行した日付を含んだファイルとして保存される
このバッチファイルをタスクスケジューラーに登録して毎日定時で動かすわけですよ
すると毎日1つずつバックアップファイルが増え続けるわけです
いつかウンザリするほどのファイル数になるから
最後の行で7日分残して古いのは削除してます。

forfilesはありがたいね
以前のOSにはなかったと思いますがVISTA以降では搭載されているのではないかと思います
DOSのコマンドの非力さに呆れてvbsかwshで処理しようかと思ってたんですけど
このforfilesはUNIX系ではお馴染みのfindに似た使い方が可能です
DOSのコマンドのfindとは違いますよ
とにかくこれのおかけで簡単な記述で目的を果たすことができます

3. このバッチファイルをタスクスケジューラーに登録する

backup.batをタスクスケジューラーに登録してスケジューリングすればOK

私は毎日定時にバックアップするように設定しました
7日分ですが顧客へは時々このファイルをローカルにでもコピーして保存していただきます。
もちろんサーバーに保存しているので共有設定を行いLAN内の別のクライアントからアクセスできるようにしておきます。

備考:
forfiles /P C:\backup /M *.bak /C “cmd /c del /s @path” /D -7
この動作はファイル名に設定した日付を見ているのではなくて拡張子がbakファイルのタイムスタンプを読み取っています。
ファイル名の日付は人間が管理するのに便利だからそうしているだけです、それにバックアップのたびに同じファイル名だと都合が悪いのでトラブル時には少なくとも7日以内の範囲で任意の過去にデーターを戻せるので・・・

forfilesの使い方はコマンドラインで forfiles /?とタイプしていただければ説明が表示されます。

boss

written by boss