Ресторация баз MSSQL windows-shell style
Jul. 28th, 2012 03:10 pmПонятно, что можно и нужно скриптовать такие вещи на T-SQL, а вот можно ли из шелла? Можно, ресторация 100500 бэкапов из текущего каталога с протоколированием в txt-файлы:
setlocal enabledelayedexpansion
for /F %%A in ('dir /b *.bak') do (
set filetemp=%%A
set file=!filetemp:~0,-24!
echo !file!
sqlcmd -S. -E -Q "restore database [!file!] from disk='%cd%\%%A' with MOVE '!file!' TO 'c:\sqldata\!file!.mdf', MOVE '!file!_log' TO 'c:\sqldata\!file!_log.ldf'" -o c:\temp\!file!.txt
)
мувинг файлов сделан т.к. я БД мигрировал с других серверов с 2005 SQL (бэкапы делались стандартным мейнтенанс планом, поэтому 24 последних символа отрезаются, там _backup_YYYYMMDDHHMM.bak), соответственно пути были разные, поэтому. Очевидно слабое место это предположение, что logical names файлов имеют то же название, что и БД, что не всегда так. По-умолчанию это так, и если кому-нибудь не приходит в голову при создании БД указывать что-то левое, то оно так и остаётся. На практике logical names имеют то же название в 95% случаев. Из виндовага шелла, впрочем, эту проблемку решить можно, дополнив скрипт получением выдачи стейтмента FILELISTONLY, его парсинга и продуцирования переменных, содержащих реальные названия файловых объектов. Но мне это было не надо. ;-)
setlocal enabledelayedexpansion
for /F %%A in ('dir /b *.bak') do (
set filetemp=%%A
set file=!filetemp:~0,-24!
echo !file!
sqlcmd -S. -E -Q "restore database [!file!] from disk='%cd%\%%A' with MOVE '!file!' TO 'c:\sqldata\!file!.mdf', MOVE '!file!_log' TO 'c:\sqldata\!file!_log.ldf'" -o c:\temp\!file!.txt
)
мувинг файлов сделан т.к. я БД мигрировал с других серверов с 2005 SQL (бэкапы делались стандартным мейнтенанс планом, поэтому 24 последних символа отрезаются, там _backup_YYYYMMDDHHMM.bak), соответственно пути были разные, поэтому. Очевидно слабое место это предположение, что logical names файлов имеют то же название, что и БД, что не всегда так. По-умолчанию это так, и если кому-нибудь не приходит в голову при создании БД указывать что-то левое, то оно так и остаётся. На практике logical names имеют то же название в 95% случаев. Из виндовага шелла, впрочем, эту проблемку решить можно, дополнив скрипт получением выдачи стейтмента FILELISTONLY, его парсинга и продуцирования переменных, содержащих реальные названия файловых объектов. Но мне это было не надо. ;-)