といった感じのミッション.
まずはバックアップを取り, bakファイルを作るSQL文から
BACKUP DATABASE "バックアップを取りたいDB名" TO disk='"保存先のパス"' WITH INIT
TO disk → 保存先のフルパス. ".bak"まで書く. ファイルは無くても自動で作ってくれるが, ファイルを置くディレクトリまでは作ってくれないので注意
INIT→既に指定したファイルが有った場合, 上書きする, という設定. WITH句以下に書く. ちなみに追記する場合は NOINIT.
このSQLを投げれば, 投げた時点でのフルバックアップをとる. 差分バックアップを取りたい場合は, WITH句に","で続けて, "DIFFERENTIAL"を追加する.
※フルバックアップ→DB全体のバックアップを取ること, 差分バックアップ→最後にとったフルバックアップからの更新されたデータをバックアップする. 全てフルバックアップするよりも容量を圧迫しない.
復旧時も, 復旧したい時点の差分ファイルと, その直前のフルバックアップのひとつずつ指定すれば復旧できる.
復旧用.sqlはフルバックアップファイルだけで復旧するならば
restore database "復旧するDB名" from disk='".bakファイルのパス"'
だけでOK
ただし差分バックアップファイルを用いる場合は
restore database "復旧するDB名" from disk='"フル.bakファイルのパス" ' WITH NORECOVERY restore database "復旧するDB名" from disk='"差分.bakファイルのパス"'
と, フル→差分の順に呼ぶことと, フルバックアップファイルを呼んだ際, WITH句で"NORECOVERY"を指定し, トランザクションのロールバックを防ぐことで, 続けて差分.bakを呼んで復旧することが出来る.
そして, これらの処理を, 叩くだけでこなしてくれるようなbatのコマンド
バックアップを取る.bat
sqlcmd -U "ユーザID" -P "パスワード" -v buckupdate ="%date:/=%" -i .bakまでのパス
このとき, -U -Pは大文字でないと反応してくれない点に注意.
-v で.batを叩いた時点の日付をとって, SQLファイルに投げてくれる(ex> 20120906)
こうすることで, ファイル名に日付をつけることが出来るため, 復旧時に使いやすくなる.
なおSQL文内で使うときは $(buckupdate) で投げた値を使える.
(おまけ: "%date%"と表記するとexは2012/09/06となる. また時間を使いたいときは"%time%")
(おまけ2: "%date:/=%"の「:/=」の部分で, 表記される「/」を「」へと変換している.)
そして復旧する.bat
SET /P input="復元に使うファイルの日付を入力してください"
sqlcmd -U "ユーザID" -P "パスワード" -v buckupdate =%input% -i 復旧用.sqlのパス
復旧を行なう際は, 復旧用ファイルを指定する指定しなければいけない.
そこでSET /Pコマンドでユーザーからの入力をうけつけ, それを -v に与えて.sql内で用いる.
入力のさせ方などは工夫の見せ所.
ファイル名などを工夫してやると良いかも.
長かった…('A`) -3
0 件のコメント:
コメントを投稿