SQL ServerのDB復元の自動化(オンプレ)

sqlserver-auto-restoreのアイキャッチ画像 Windows

Windowsのバッチファイルを使い、SQL Serverのユーザーを作成し、そのユーザーを使ってDBを復元する方法を解説します。オンプレサーバー向けです。
山括弧<…>で囲まれている箇所は、ご自身の環境に合わせて書き換える必要があります。

ユーザー作成

batファイルは以下のように作成します。

@echo off

set CWD=%~dp0

REM DBサーバー名
Set ServerName=localhost\<DBインスタンス名(e.g. SQLEXPRESS)>

REM ユーザー情報
Set UserID=<作成したいユーザー名>
Set Password=<作成したいユーザーのパスワード>

REM ログ出力先
Set LogPath=%CWD%

REM 起動パラメーター
if "%1"=="" (set ServerName=%ServerName%) Else (set ServerName=%1)
if "%2"=="" (set UserID=%UserID%) Else (set UserID=%2)
if "%3"=="" (set Password=%Password%) Else (set Password=%3)
if "%~4"=="" (set LogPath=%LogPath%) Else (set LogPath=%~4)

REM ログ出力
Set cmdlog=%LogPath%\CreateUserBat.log
Set sqllog=%LogPath%\CreateUserSql.log

echo User Create start. > %cmdlog%
echo ServerName=%ServerName% >> %cmdlog%
echo UserID=%UserID% >> %cmdlog%

REM データベース-セキュリティ-ログイン-作成
sqlcmd -S %ServerName% -o %sqllog% -Q "EXIT(USE [Master] BEGIN TRY IF NOT EXISTS (SELECT * FROM sys.syslogins where name = N'%UserID%') CREATE LOGIN [%UserID%] WITH PASSWORD=N'%Password%',  DEFAULT_DATABASE=[master] , DEFAULT_LANGUAGE=[English], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON ; ALTER SERVER ROLE [sysadmin] ADD MEMBER [%UserID%] ; SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"

REM VIEW SERVER STATE権限付与
If %errorlevel%==0 (
   sqlcmd -S %ServerName% -o %sqllog% -Q "EXIT(USE [master] BEGIN TRY GRANT VIEW SERVER STATE TO [%UserID%] ; SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"
)

REM 終了
echo User Create Result=%errorlevel% >> %cmdlog%
exit /b %errorlevel%

DB復元

batファイルは以下のように作成します。

@echo off
set CWD=%~dp0

REM DBサーバー名
Set ServerName=localhost\<DBインスタンス名(e.g. SQLEXPRESS)>

REM ユーザー情報
Set UserID=<上記で作成したユーザー>
Set Password=<上記で作成したユーザーのパスワード>

REM データベース情報
Set Database=<データベース名>

REM DBファイル
Set inFilePath=<復元したいDBのファイルパス(e.g. C:\sqlserver\db.bak)>

REM ログ出力先
Set LogPath=%CWD%

REM mdf,ldfファイル
Set sqlserverDataPath=<mdf,ldfファイルの保管先(e.g. C:\sqlserver\data)>

REM mdf,ldfの論理名
Set DBFileLogicalName=<mdf,ldfの論理名(e.g. データベース名と同じ)>

REM 起動パラメーター
if "%1"=="" (set ServerName=%ServerName%) Else (set ServerName=%1)
if "%~2"=="" (set inFilePath=%inFilePath%) Else (set inFilePath=%~2)
if "%3"=="" (set Database=%Database%) Else (set Database=%3)
if "%~4"=="" (set LogPath=%LogPath%) Else (set LogPath=%~4)
if "%5"=="" (set UserID=%UserID%) Else (set UserID=%5)
if "%6"=="" (set Password=%Password%) Else (set Password=%6)
if "%~7"=="" (set sqlserverDataPath=%sqlserverDataPath%) Else (set sqlserverDataPath=%~7)
if "%8"=="" (set DBFileLogicalName=%DBFileLogicalName%) Else (set DBFileLogicalName=%8)

REM ログ出力
Set sqllog="%LogPath%\RestoreSql.log"
Set cmdlog="%LogPath%\RestoreBat.log"

REM 絶対パスに変換
call :GET_FILENAME "%inFilePath%"
Set inFilePath=%TmpPath%

call :GET_FILENAME "%sqlserverDataPath%"
Set sqlserverDataPath=%TmpPath%

echo DB setup start. > %cmdlog%
echo ServerName=%ServerName% >> %cmdlog%
echo inFilePath=%inFilePath% >> %cmdlog%
echo UserID=%UserID% >> %cmdlog%
echo sqlserverDataPath=%sqlserverDataPath% >> %cmdlog%
echo Database=%Database% >> %cmdlog%
echo DBFileLogicalName=%DBFileLogicalName% >> %cmdlog%

REM mdf,ldf格納先存在チェック
if not exist "%sqlserverDataPath%" (
    mkdir "%sqlserverDataPath%"
)

REM echo "EXIT(USE [master] BEGIN TRY RESTORE DATABASE [%Database%] FROM DISK = N'%inFilePath%' WITH FILE = 1,  MOVE N'%DBFileLogicalName%' TO N'%sqlserverDataPath%\%Database%.mdf',  MOVE N'%DBFileLogicalName%_log' TO N'%sqlserverDataPath%\%Database%_log.ldf',  NOUNLOAD,  STATS = 5 SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"

REM 復元開始
sqlcmd -S %ServerName% -U %UserID% -P %Password% -d "master" -o %sqllog% -Q "EXIT(USE [master] BEGIN TRY RESTORE DATABASE [%Database%] FROM DISK = N'%inFilePath%' WITH FILE = 1,  MOVE N'%DBFileLogicalName%' TO N'%sqlserverDataPath%\%Database%.mdf',  MOVE N'%DBFileLogicalName%_log' TO N'%sqlserverDataPath%\%Database%_log.ldf',  NOUNLOAD,  STATS = 5 SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"

REM PWSP-セキュリティ-ユーザー-削除
If %errorlevel%==0 (
   sqlcmd -S %ServerName% -U %UserID% -P %Password% -d "master" -o %sqllog% -Q "EXIT(USE [%Database%] BEGIN TRY DROP USER IF EXISTS [%UserID%] SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"
)

REM データベース-セキュリティ-ログイン更新・マッピング
If %errorlevel%==0 (
   sqlcmd -S %ServerName% -U %UserID% -P %Password% -d "master" -o %sqllog% -Q "EXIT(USE [Master] BEGIN TRY ALTER LOGIN [%UserID%] WITH PASSWORD=N'%Password%'; USE [%Database%] CREATE USER [%UserID%] FOR LOGIN [%UserID%] ALTER USER [%UserID%] WITH DEFAULT_SCHEMA=[dbo] ALTER ROLE [db_owner] ADD MEMBER [%UserID%] ;  SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"
)

REM 接続確認
If %errorlevel%==0 (
   sqlcmd -S %ServerName% -U %UserID% -P %Password% -o %sqllog% -Q "EXIT(BEGIN TRY SELECT Getdate() SELECT 0 END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH)"
)

REM 終了
echo DB setup Result=%errorlevel% >> %cmdlog%

GOTO :END

:GET_FILENAME
rem -%変数 を完全修飾パス名に展開します。
Set TmpPath=%~f1
GOTO :EOF

:END
exit /b %errorlevel%

TIPS

  • SQL Server自体のインストール方法はこちらを参考にして下さい。
  • AWS用のDB復元の自動化方法はこちらをご覧下さい。
  • WebサイトとCGIを構築する方法はこちらをご覧下さい。

コメント

タイトルとURLをコピーしました