<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Плановое создание архивной копии SQL баз]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5853&amp;type=atom" />
	<updated>2011-05-29T21:48:46Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=5853</id>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Плановое создание архивной копии SQL баз]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=48814#p48814" />
			<content type="html"><![CDATA[<p>Очень часто нужно ставить на архивирование базы в SQL. Обычно я пользуюсь следующим скриптом в планировщике:</p><div class="codebox"><pre><code>@ECHO OFF
COLOR 0A

:: этот скрипт предназначен для выгрузки баз из SQL
:: и архивации выгруженных баз архиватором 7zip
:: для работы нужен архиватор 7zip

:: указываем временный каталог(tmpcat), каталог для архивов(arhcat),
:: пользователя для SQL(SQLuser), пароль для пользователя SQL(SQLpassword)
:: и имя сервера SQL(SQLserver)
set tmpcat=E:\Sql backup\tmpcat
set arhcat=E:\Sql backup
set SQLserver=testserver\sqlexpress2008
set SQLuser=sa
set SQLpassword=hsdgfdf34

:: создаем запись о дате начала скрипта в логе
echo -------------- %date%  %time% -------------- &gt;&gt; &quot;log.txt&quot;

:: проверяем наличие директории arhcat
if not exist &quot;%arhcat%&quot; md &quot;%arhcat%&quot;
if not exist &quot;%arhcat%&quot; (
    echo ЌҐв ¤®бвгЇ  Є Ї ЇЄҐ &quot;%arhcat%&quot;
    echo Нет доступа к папке &quot;%arhcat%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
) else (
    echo Џ®ЁбЄ Ї ЇЄЁ &quot;%arhcat%&quot; ... ­ ©¤Ґ­ 
    echo Поиск папки &quot;%arhcat%&quot; ... найдена &gt;&gt; &quot;log.txt&quot;
)
echo Тест на запись в папку %arhcat% &gt; &quot;%arhcat%\testfile.txt&quot;
if not exist &quot;%arhcat%\testfile.txt&quot; (
    echo ЌҐв ¤®бвгЇ  ­  § ЇЁбм Є Ї ЇЄҐ &quot;%arhcat%&quot;
    echo Нет доступа на запись к папке &quot;%arhcat%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
) else (
    del /F /Q &quot;%arhcat%\testfile.txt&quot;
    echo „®бвгЇ ­  § ЇЁбм ў Ї ЇЄг &quot;%arhcat%&quot; ... Ґбвм
    echo Доступ на запись к папке &quot;%arhcat%&quot; ... есть &gt;&gt; &quot;log.txt&quot;
)

:: проверяем наличие директории tmpcat
if not exist &quot;%tmpcat%&quot; md &quot;%tmpcat%&quot;
if not exist &quot;%tmpcat%&quot; (
    echo ЌҐв ¤®бвгЇ  Є Ї ЇЄҐ &quot;%tmpcat%&quot;
    echo Нет доступа к папке &quot;%tmpcat%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
) else (
    echo Џ®ЁбЄ Ї ЇЄЁ &quot;%tmpcat%&quot; ... ­ ©¤Ґ­ 
    echo Поиск папки &quot;%tmpcat%&quot; ... найдена &gt;&gt; &quot;log.txt&quot;
)
echo test to write in directory %tmpcat% &gt; &quot;%tmpcat%\testfile.txt&quot;
if not exist &quot;%tmpcat%\testfile.txt&quot; (
    echo ЌҐв ¤®бвгЇ  ­  § ЇЁбм Є Ї ЇЄҐ &quot;%tmpcat%&quot;
    echo Нет доступа на запись к папке &quot;%tmpcat%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
) else (
    del /F /Q &quot;%tmpcat%\testfile.txt&quot;
    echo „®бвгЇ ­  § ЇЁбм Є Ї ЇЄҐ &quot;%tmpcat%&quot; ... Ґбвм
    echo Доступ на запись к папке &quot;%tmpcat%&quot; ... есть &gt;&gt; &quot;log.txt&quot;
)

:: очищаем временную директорию
del /F /Q &quot;%tmpcat%\*.*&quot;

:: проверяем наличие архиватора
if exist &quot;%programfiles%\7-zip\7z.exe&quot; set &quot;zp_path=%programfiles%\7-zip&quot;
if exist &quot;%programfiles(x86)%\7-zip\7z.exe&quot; set &quot;zp_path=%programfiles(x86)%\7-zip&quot;
if not exist &quot;%zp_path%\7z.exe&quot; if exist %windir%\system32\7z.exe set zp_path=%windir%\system32
if not exist &quot;%zp_path%\7z.exe&quot; if exist %arhcat%\7z.exe set zp_path=%arhcat%
if not exist &quot;%zp_path%\7z.exe&quot; if exist 7z.exe set &quot;zp_path=%~dp0&quot;
if not exist &quot;%zp_path%\7z.exe&quot; if exist 7z.exe set zp_path=%zp_path:~0,-1%
if not exist &quot;%zp_path%\7z.exe&quot; for /f &quot;Usebackq Tokens=1 delims=,&quot; %%I in (`dir %systemdrive%\7z.exe /o:-s/s/p/b`) do set zp_path=%%~dpI
set last_char=%zp_path:~-1%
if &quot;%last_char%&quot;==&quot;\&quot; set zp_path=%zp_path:~0,-1%
if not exist &quot;%zp_path%\7z.exe&quot; (
    echo ЌҐ ­ ©¤Ґ­  аеЁў в®а 7z
    echo Не найден архиватор 7z &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
)
echo ЂаеЁў в®а 7z ­ ©¤Ґ­ ў Ї ЇЄҐ &quot;%zp_path%&quot;
echo Архиватор 7z найден в папке &quot;%zp_path%&quot; &gt;&gt; &quot;log.txt&quot;

:: создаём скрипт для получения списка баз на SQL сервере
echo ‘®§¤ Ґ¬ бЄаЁЇв ¤«п Ї®«гзҐ­Ёп бЇЁбЄ  Ў § ­  SQL бҐаўҐаҐ
echo Создаем скрипт для получения списка баз на SQL сервере &gt;&gt; &quot;log.txt&quot;
echo declare @version varchar(14)&gt;&quot;%tmpcat%\getnamebases.sql&quot;
echo select @version = cast(serverproperty(&#039;ProductVersion&#039;) as varchar(14))&gt;&gt;&quot;%tmpcat%\getnamebases.sql&quot;
echo if substring(@version, 1, charindex(&#039;.&#039;, @version) - 1) ^&gt;= 9 &gt;&gt;&quot;%tmpcat%\getnamebases.sql&quot;
echo select name from sys.databases&gt;&gt;&quot;%tmpcat%\getnamebases.sql&quot;
echo else select name from sysdatabases&gt;&gt;&quot;%tmpcat%\getnamebases.sql&quot;

:: получаем список баз на SQL сервере в файл namebases.txt
echo Џ®«гз Ґ¬ бЇЁб®Є Ў § ­  SQL бҐаўҐаҐ ў д ©« &quot;%tmpcat%\namebases.txt&quot;
echo Получаем список баз на SQL сервере в файл &quot;%tmpcat%\namebases.txt&quot; &gt;&gt; &quot;log.txt&quot;
sqlcmd -S %SQLserver% -U %SQLuser% -P %SQLpassword% -i &quot;%tmpcat%\getnamebases.sql&quot;&gt;&quot;%tmpcat%\namebases.txt&quot;
if /i %errorlevel% geq 1 (
    echo ЌҐв ¤®бвгЇ  Є SQL бҐаўҐаг &quot;%SQLserver%&quot;
    echo Нет доступа к SQL серверу &quot;%SQLserver%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
)

:: удаляем старый скрипт если он есть
if exist &quot;%tmpcat%\getnamebases.sql&quot; del /F /Q &quot;%tmpcat%\getnamebases.sql&quot;

:: составляем список баз для архивирования без системных баз
findstr /i /v &quot;( master name tempdb model msdb ReportServer ReportServerTempDB -&quot; &quot;%tmpcat%\namebases.txt&quot; &gt; &quot;%tmpcat%\namebasesreal.txt&quot;

:: удаляем старый список баз если он есть
if exist &quot;%tmpcat%\namebases.txt&quot; del /F /Q &quot;%tmpcat%\namebases.txt&quot;

:: запускаем цикл перебора из файла со списком баз SQL
for /f &quot;usebackq tokens=1 delims=,&quot; %%I in (&quot;%tmpcat%\namebasesreal.txt&quot;) do Call :realnamebases %%I

:realnamebases

:: задаем наименования баз которые будут игнорироваться при переборе
if &quot;%1&quot;==&quot;&quot; goto :EOF
if &quot;%1&quot;==&quot; &quot; goto :EOF

:: создаём скрипт с именем %1 нужной базы для выгрузки из SQL
echo ‘®§¤ Ґ¬ бЄаЁЇв ¤«п ўлЈаг§ЄЁ Ў §л &quot;%1&quot;
echo Создаем скрипт для выгрузки базы &quot;%1&quot; &gt;&gt; &quot;log.txt&quot;
echo DECLARE @pathName NVARCHAR(512)&gt;&quot;%tmpcat%\%1.sql&quot;
echo SET @pathName = &#039;%tmpcat%\%1.bak&#039;&gt;&gt;&quot;%tmpcat%\%1.sql&quot;
echo BACKUP DATABASE [%1] TO DISK = @pathName WITH NOFORMAT, NOINIT, NAME = N&#039;db_backup&#039;, SKIP, NOREWIND, NOUNLOAD, STATS = 10&gt;&gt;&quot;%tmpcat%\%1.sql&quot;

:: получаем в переменные текущие дату и день
set data=%date:~3,7%
set day=%date:~0,5%
set &quot;mytime=%time:~0,-9%.%time:~3,2%&quot;

:: запускаем в SQL скрипт для выгрузки базы
echo ‡ ЇгбЄ Ґ¬ ўлЈаг§Єг Ў §л &quot;%1&quot;
echo Запускаем выгрузку базы &quot;%1&quot; &gt;&gt; &quot;log.txt&quot;
sqlcmd -S %SQLserver% -U %SQLuser% -P %SQLpassword% -i &quot;%tmpcat%\%1.sql&quot;
if /i %errorlevel% geq 1 (
    echo ЌҐв ¤®бвгЇ  Є SQL бҐаўҐаг &quot;%SQLserver%&quot;
    echo Нет доступа к SQL серверу &quot;%SQLserver%&quot; &gt;&gt; &quot;log.txt&quot;
    pause&gt;nul
    goto :EOF
)

:: проверяем наличие старого архива, если есть удаляем его
if exist &quot;%arhcat%\%1\%1.7z&quot; DEL /F /Q &quot;%arhcat%\%1\%1.7z&quot;

:: проверяем наличие директории для архива
if not exist &quot;%arhcat%\%1\%data%&quot; md &quot;%arhcat%\%1\%data%&quot;

:: запускаем архивацию выгруженной базы SQL средствами 7zip
echo ‡ ЇгбЄ Ґ¬  аеЁў жЁо Ў §л &quot;%1&quot;
echo Запускаем архивацию базы &quot;%1&quot; &gt;&gt; &quot;log.txt&quot;
&quot;%zp_path%\7z.exe&quot; a -t7z &quot;%arhcat%\%1\%1.7z&quot; &quot;%tmpcat%\%1.bak&quot; -m0=LZMA:d26 -ms -mmt

:: копируем архив базы в папку для этой базы
copy /Y &quot;%arhcat%\%1\%1.7z&quot; &quot;%arhcat%\%1\%data%\%1_%day%_%mytime%.7z&quot;

:: проверяем наличие архива, если есть удаляем его
if exist &quot;%arhcat%\%1\%1.7z&quot; DEL /F /Q &quot;%arhcat%\%1\%1.7z&quot;

:: очищаем временную директорию
if exist &quot;%tmpcat%\%1.bak&quot; DEL /F /Q &quot;%tmpcat%\%1.bak&quot;
if exist &quot;%tmpcat%\%1.sql&quot; DEL /F /Q &quot;%tmpcat%\%1.sql&quot;</code></pre></div><p>Не судите строго если где корявая реализация, а лучше укажите на ошибки.</p>]]></content>
			<author>
				<name><![CDATA[Александр_foxware]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26976</uri>
			</author>
			<updated>2011-05-29T21:48:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=48814#p48814</id>
		</entry>
</feed>
