2012年9月6日木曜日

MS SQLのバックアップコマンドとbatからの呼び出し

batを叩いてでMS SQLの復旧用バックアップを取れ!

といった感じのミッション.



まずはバックアップを取り, 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 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...