BCPコマンドで同一構造のサーバーのテーブルを比較する。
作ったのでメモ。
経緯
DBサーバーを入れ替える時、全データが入替えられているか確認する作業があったのですが、
「SSMSでSelectして目視比較して・・・」みたいな話が持ち上がり初めていたので必死で書きました。
どう考えても目視はやばい。
構造
以下の2ファイルを同一ディレクトリに用意して使います。
- このバッチ
- DB名とテーブル名を持つCSV
以下のように処理してDBのデータを比較します。
- 新旧サーバーの対象のテーブルに対してBCPでエクスポート
- エクスポートの結果をfcコマンドで比較。fcのログを出す。
- 同一なら先頭にok
- 相違なら先頭にngがつく
バッチのソース
@echo off setlocal pushd %~dp0 rem DBとテーブルのリストファイル名 set targetList= rem ユーザーのアカウント set OldSvrUser= set NewSvrUser= set OldSvrPass= set NewSvrPass= rem 比較サーバーインスタンス set OldServer= set NewServer= rem 出力先フォルダ powershell -Command "$(Get-Date).ToString('yyyyMMdd_HHmmss')" > %temp%\ret set /p ymd=< %temp%\ret set BaseFolder=%UserProfile%\Desktop\SvrDataComp\%ymd%\ set OldFolder=%BaseFolder%Old\ set NewFolder=%BaseFolder%New\ mkdir %BaseFolder% mkdir %OldFolder% mkdir %NewFolder% rem 指定のリストからループして出力 for /f "tokens=1,2* delims=," %%i in (%targetList%) do ( call :CompareOldNewServer %%i %%j ) popd endlocal exit rem -------------------------------------------------------------------------------------- rem エクスポート処理 rem -------------------------------------------------------------------------------------- :ExportTable rem 引数 set instance=%1 set db=%2 set table=%3 set exportPath=%4 set usr=%5 set pass=%6 TITLE Exporting [Server:%instance% DB:%db% Table:%table%] bcp "SELECT * FROM %db%.dbo.%table%" queryout %exportPath% -S %instance% -U%usr% -P%pass% -w -k -o %exportPath%.log exit /b rem -------------------------------------------------------------------------------------- rem 新旧サーバーのテーブルのエクスポートと比較 rem -------------------------------------------------------------------------------------- :CompareOldNewServer rem 引数 set db=%1 set table=%2 set fileName=%db%_%table%.txt set oldExport=%OldFolder%%fileName% set newExport=%NewFolder%%fileName% call :ExportTable %OldServer% %db% %table% %oldExport% %OldSvrUser% %OldSvrPass% call :ExportTable %NewServer% %db% %table% %newExport% %NewSvrUser% %NewSvrPass% set compFile=%BaseFolder%ng_%db%_%table%.txt fc /a /c /n /u %oldExport% %newExport% > %compFile% if "%errorlevel%"=="0" move %compFile% %BaseFolder%ok_%db%_%table%.txt exit /b