□技術メモ - SqlServer ※管理人の個人的な技術メモです。このページの内容の実行結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○SQLにおいて, ''内の記述にunicodeを含む場合はNプレフィクスが必要。 例: update T_AREA set areaname = N'齋籐町' where areacode = '001'; ○ローカルDBの起動 ・SqlServer構成マネージャ−SqlServerのサービス−SqlExpress−右クリックして開始 ・ManagementStudio−サーバ名からSqlExpressを選択−windows認証 ○バッチによるSQLの実行 .batについて sqlcmd -Q "SQL文をここに書く" -S サーバ名 -U UserID -P password (例) sqlcmd -Q "insert into tTest(CD, VAL) values('01','こんにちは')" -S NOGUCHI_PC\SQLEXPRESS -U noguchi -P password ○SqlServerのバックアップについて ・バックアップには完全バックアップと差分バックアップがある。 ・完全バックアップを取得した箇所は差分ベースと呼ばれる。 ・差分バックアップの方が作成速度が速いが、定期的に完全バックアップを取っておいた方がよい。 ・差分バックアップをリストアするには以下の手順で行う。   完全バックアップのリストア→差分のリストア→トランザクションログのリストア ・障害発生時は末尾ログを取得する。末尾ログを取得できない場合は最後のログを取得した時点までのバックアップとなる。 ○SqlServerのバックアップと復元について ・以下の順序でイベントが発生したとする。 ・復旧に必要となるバックアップに○を付ける。  DB作成  完全バックアップ1取得  ログ1取得  ログ2取得  完全バックアップ2取得○  ログ3取得  ログ4取得  差分バックアップ1取得  ログ5取得  ログ6取得  差分バックアップ2取得○  ログ7取得○  ログ8取得○  障害発生  末尾ログ取得○ ・以下に各バックアップを実行する際のSQLを記述する。  下記のSQLをバッチとして実行すればよい。 ・完全バックアップ --RECOVERY FULLを指定することでLOGのバックアップを取得できるようになる。 --WITH FORMAT(もしくはINIT)で既存ファイルへの上書きになる。 ALTER DATABASE db名 SET RECOVERY FULL BACKUP DATABASE db名 TO DISK = N'完全バックアップのフルパス' WITH FORMAT ・差分バックアップ --WITH DIFFERENTIALで差分バックアップになる。 BACKUP DATABASE db名 TO DISK = N'差分バックアップのフルパス' WITH FORMAT, DIFFERENTIAL ・ログバックアップ BACKUP LOG db名 TO DISK = N'ログバックアップのフルパス' WITH FORMAT ・末尾ログバックアップ BACKUP LOG db名 TO DISK = N'末尾ログバックアップのフルパス' WITH FORMAT, NO_TRUNCATE ※バックアップファイルの拡張子は.bakとする。ネットワークパスへの保存はできない。ローカル指定すること。 ○リストアの手順について ・以下のSQLをバッチから実行すればよい。 ・上記の順でイベントが発生した場合に復旧する手順は以下の通り。 BACKUP LOG db名 TO DISK = N'末尾ログバックアップのフルパス' WITH FORMAT, NO_TRUNCATE --障害発生直後の末尾ログを取得する --最新の完全バックアップと、それを差分ベースとした最新の差分バックアップを復元する RESTORE DATABASE db名 FROM DISK = N'完全バックアップ2のフルパス' WITH NORECOVERY, REPLACE --REPLACE指定によりバックアップが現在のDB上に復元される。 RESTORE DATABASE db名 FROM DISK = N'差分バックアップ2のフルパス' WITH NORECOVERY --差分バックアップのリストア RESTORE LOG db名 FROM DISK = N'ログ7のフルパス' WITH NORECOVERY RESTORE LOG db名 FROM DISK = N'ログ8のフルパス' WITH NORECOVERY RESTORE LOG db名 FROM DISK = N'末尾ログのフルパス' WITH NORECOVERY, STOPAT = '2014-12-05 00:00:00' --STOPATで時刻指定で復旧できる --RESTORE LOG db名 FROM DISK = N'末尾ログのフルパス' WITH NORECOVERY, STOP_ON_ERROR --STOP_ON_ERROR(デフォルト)は、エラー発生直前まで復旧する --RESTORE LOG db名 FROM DISK = N'末尾ログのフルパス' WITH NORECOVERY, CONTINUE_AFTER_ERROR --エラー発生後も復旧を続ける RESTORE DATABASE db名 WITH RECOVERY --最後にWITH RECOVERY指定で復旧できる ○ManagementStudioでのバックアップ ・単体のバックアップファイルのバックアップ、リストアはManagementStudioで行える。 ・上記の復旧手順に該当するリストアをManagementStudioから行えるのだろうか?とも思うのだが  復旧については事前に手順を確認できるバッチ実行の方が良いように思うので、まずは計画的なバックアップについて確認したい。 ○検証手順 ・以下の@〜EのバックアップをManagementStudioの操作で生成できて、それをRestoreした結果と 上記のコマンドでRestoreした結果が一致すればよい。 INSERT INTO tTest(CD, VAL) as Values('01','create') INSERT INTO tTest(CD, VAL) as Values('02','full') ALTER DATABASE db名 SET RECOVERY FULL BACKUP DATABASE db名 TO DISK = N'完全バックアップのフルパス' WITH FORMAT @ INSERT INTO tTest(CD, VAL) as Values('03','def1') BACKUP DATABASE db名 TO DISK = N'差分バックアップのフルパス1' WITH FORMAT, DIFFERENTIAL A INSERT INTO tTest(CD, VAL) as Values('04','def2') BACKUP DATABASE db名 TO DISK = N'差分バックアップのフルパス2' WITH FORMAT, DIFFERENTIAL B INSERT INTO tTest(CD, VAL) as Values('05','log1') BACKUP LOG db名 TO DISK = N'ログバックアップのフルパス1' WITH FORMAT C INSERT INTO tTest(CD, VAL) as Values('06','log2') BACKUP LOG db名 TO DISK = N'ログバックアップのフルパス2' WITH FORMAT D INSERT INTO tTest(CD, VAL) as Values('07','tail') BACKUP LOG db名 TO DISK = N'末尾ログバックアップのフルパス' WITH FORMAT, NO_TRUNCATE E (確認中) -----------------------------------------------------------