Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Доработка и проверка скрипта архивирования (http://forum.oszone.net/showthread.php?t=332749)

igor.kinma 24-01-2018 13:16 2793487

Доработка и проверка скрипта архивирования
 
Добрый день уважаемые форумчане. Прошу Вашей помощи в проверке и доработке файла .bat так как сам я не очень силен в этой области, но что то нашел в интернете что то подправил сам. И так задача:

Есть 2 сервера:

1 хранятся Бд SQL и 1C. Путь D:\Programs\1C и резервные копии БД SQL D:\MSSQL\MSSQL\Backup\21_00. Есть промежуточные папка D:\ARHIV\ARHIV_1C и D:\ARHIV\ARHIV_BD
2 сервер на котором должны храниться копии сервера 1. Путь \\Server-domain\d$\ARHIV\ARHIV_BD и \\Server-domain\d$\ARHIV\ARHIV_1C .

Нужно сделать так что бы каждый день на сервере 1 делались архивы 1С и BD и копировались на сервер 2. При этом архивы на сервере 1 должны храниться не более 7 дней. Сделал такой исполняемый файл и сохранил его как start.bat:

код
D:

cd D:\Programs\1C

rar a -agYYYY.MM.DD -m5 -r -x D:\ARHIV\ARHIV_1C\backup_.rar *.*

cd D:\MSSQL\MSSQL\Backup\21_00

rar a -agYYYY.MM.DD -m5 -r -x D:\ARHIV\ARHIV_BD\backup_.rar *.*

copy /Y D:\ARHIV\ARHIV_1C\*.rar \\Server-domain\d$\ARHIV\ARHIV_1C\*.rar

copy /Y D:\ARHIV\ARHIV_BD\*.rar \\Server-domain\d$\ARHIV\ARHIV_BD\*.rar

Forfiles /P D:\ARHIV\ARHIV_1C /S /M *.* /D -7 /C "cmd /c del /Q @path"

Forfiles /P D:\ARHIV\ARHIV_BD /S /M *.* /D -7 /C "cmd /c del /Q @path"


Скажите все ли тут так? можно ли что то облегчить? И как к моей задаче сделать Log файл. Заранее всем спасибо за советы и участие в теме!

P.S. Знаю что команды forfiles и copy можно заменить командой robocopy, но как понять не могу. Хотя возможно я ошибаюсь что их можно заменить...

igor.kinma 25-01-2018 09:32 2793659

Друзья давайте по активнее. Правда нужна помощь.

Busla 25-01-2018 10:19 2793666

Цитата:

Цитата igor.kinma
сам я не очень силен в этой области »

заплатите тому кто силён, потому как сейчас почти всё не так

Резервное копирование делают на случай сбоев в работе. Ваш "скрипт" никак не учитывает возможные сбои.

igor.kinma 25-01-2018 11:44 2793690

Busla ?спасибо за помощь.

megaloman 25-01-2018 15:13 2793732

igor.kinma,
Цитата:

Цитата igor.kinma
давайте по активнее. »

Яволь, майн генераль! :)
Код:

@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "Z:\Programs\1C" "Z:\ARHIV\ARHIV_1C" "Backup_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_1C" "Z:\ARHIV\ARHIV_1C\%DArc%.log"

Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"

GoTo :Eof

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        >nul %Arc% a -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
                Echo ++++++ Files In Archives "%~2\%~3"
                Echo:
                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives from %2  to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"

                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:

                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
        )
        )
GoTo :Eof

Укажите Ваши пути в скрипте, там где Call :Backup ..... !!
Я не знаю объёма Ваших баз, ИМХО, ключ -m5 плох: не даёт существенного выигрыша в объеме, но зато при больших базах тратится громадное время. Я сделал -m3, но Вашу свободу никто не смеет ограничивать.
Цитата:

Цитата igor.kinma
архивы на сервере 1 должны храниться не более 7 дней »

Я сделал, чтобы хранились последние 7 архивов, ИМХО, это безопаснее.
Цитата:

Цитата igor.kinma
Сделал такой исполняемый файл и сохранил его как start.bat: »

Не делайте такого, не называйте Ваши батники именами CMD-команд, можно вляпаться в неприятности.
Цитата:

Цитата igor.kinma
так как сам я не очень силен в этой области »

Дерзайте! Под лежачий камень ...

igor.kinma 06-02-2018 14:08 2796206

Цитата:

Цитата megaloman
Яволь, майн генераль! :) »

Уважаемый megaloman большое спасибо за скрипт все работает как надо. Но я не учел одно большое но когда описывал свою задачу!

Помогите пожалуйста неумному в доработке Вашего скрипта или создании дополнительного:

Базы данных 1С должны архивироваться каждый день в D:\ARHIV\1C и иметь вид Backup(1C)_дата.rar
Базы данных SQL должны архивироваться каждый день в D:\ARHIV\BD с заменой архива. Почему именно с заменой? На SQL сервере настроено резервное копирование БД каждый день в 21:00 с пн по пт. с удалением файлов старше 6 дней.

Тоесть я полагаю что данный архив должен называться Backup(SQL)_update.rar и каждый день в него должны добавляться недостающие файлы, а в пятницу после очередного пополнения, он должен быть переименован в Backup(SQL)_дата.rar. Таким образом он будет содержать в себе файлы SQL баз с пн по пт. (всего 5 файлов)

Ну и соответственно все это дело должно каждый день копироваться на сервер 1. по следующему принципу:

Архив 1C каждый день с названием Backup(1C)_дата.rar
Архив SQL баз каждый день с названием Backup(SQL)_update.rar, а в пятницу Backup(SQL)_дата.rar и после копирования, если оно удачно удалить файл Backup(SQL)_update.rar
И так же должно сохраниться условие хранение 7 архивов.

P.S Если для всего этого необходимо несколько файлов .bat то ни чего страшного главное что бы все это работало. Заранее Вам огромное спасибо.

igor.kinma 06-02-2018 14:25 2796209

Немного подумав на ум приходит 3 .bat файла.

Архив и перенос Баз 1С
Код:

@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "D:\Programs\1C" "D:\ARHIV\1C" "Backup(1С)_%DArc%.rar" "\\Server-domain\d$\ARHIV\1C" "D:\ARHIV\LOG\1C_%DArc%.log"

GoTo :Eof

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        >nul %Arc% a -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
                Echo ++++++ Files In Archives "%~2\%~3"
                Echo:
                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives from %2  to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"

                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:

                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
        )
        )
GoTo :Eof



Архивирование и перенос SQL
Код:

@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "D:\MSSQL\MSSQL\Backup\21_00" "D:\ARHIV\BD" "Backup(SQL)_update.rar" "\\Server-domain\d$\ARHIV\BD" "D:\ARHIV\LOG\SQL_%DArc%.log"

GoTo :Eof

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        >nul %Arc% u -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
                Echo ++++++ Files In Archives "%~2\%~3"
                Echo:
                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives from %2  to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"

                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:

                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
        )
        )
GoTo :Eof



Далее нужен 3 скрипт который будет переименовывать архив Backup(SQL)_update.rar в Backup(SQL)_дата.rar, копировать его на сервер и удалять от туда Backup(SQL)_update.rar

Переименование и копирование архива
Код:

@Echo Off

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

RENAME D:\ARHIV\BD\Backup(SQL)_update.rar Backup(SQL)_%DArc%.rar
xcopy D:\ARHIV\BD\*.rar \\Server-domain\d$\ARHIV\BD /H /Y /C
erase \\Server-domain\d$\ARHIV\BD\Backup(SQL)_update.rar


megaloman 07-02-2018 13:08 2796477

Немного подумав, на ум приходит доработка 1 командного файла
Код:

@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%
Call :DayOfWeek "DOW"

Call :Backup "Z:\Programs\1C" "Z:\ARHIV\ARHIV_1C" "Backup(1C)_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_1C" "Z:\ARHIV\ARHIV_1C\%DArc%.log"

If "%DOW%"=="5" (
        >>"Z:\ARHIV\ARHIV_BD\%DArc%.log" (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  "Z:\MSSQL\MSSQL\Backup\21_00"
        Echo ++++++ Ren "Z:\ARHIV\ARHIV_BD\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar"
        Ren "Z:\ARHIV\ARHIV_BD\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar" 2>&1
        )
        Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup(SQL)_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"
) Else (
        Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup(SQL)_update.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"
)
rem                          1                            2                  3                          4                                  5
GoTo :Eof

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        >nul %Arc% u -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
                Echo ++++++ Files In Archives "%~2\%~3"
                Echo:
                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives from %2  to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"

                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:

                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~dp5*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~dp5%%f"
        )
        )
GoTo :Eof

:DayOfWeek
rem Выдаёт номер дня недели в переменную имя которой указано в вызове в кавычках
        Set /A YYYY=%date:~6,4%, MM=1%date:~3,2%-100, DD=1%date:~0,2%-100
        Set /A %~1=((%YYYY%-1901)*365 + (%YYYY%-1901)/4 + %DD% + (!(%YYYY% %% 4))*(!((%MM%-3)^&16))+(%MM%-1)*30+2*(!((%MM%-7)^&16))-1+((65611044^>^>(2*%MM%))^&3))%%7+1
GoTo :Eof

Цитата:

Цитата igor.kinma
Архив SQL баз каждый день с названием Backup(SQL)_update.rar, а в пятницу Backup(SQL)_дата.rar и после копирования, если оно удачно удалить файл Backup(SQL)_update.rar »

Это не выгодно. Я переименовал в пятницу архив Backup(SQL)_update.rar в Backup(SQL)_дата.rar и затем пополнил этот архив (команда u в rar).
Так, как описали Вы, архиватор заново будет архивировать все файлы, накопившиеся за неделю - лишние траты времени и места.
И вообще, я заменил команду a в RAR на u, чтобы не тратить время на переархивирование старых файлов в Backup(SQL)_update.rar.

Определение дня недели не помню где подсмотрел

igor.kinma 07-02-2018 15:43 2796512

megaloman, Огромное Вам человеческое спасибо!Запустил Ваш скрипт в планировщик с пн по пт в 21:30. Будем тестировать.
Но есть один вопрос. Копирование на \Server-domain\ идет всех файлов из папок Z:\ARHIV\ARHIV_BD и Z:\ARHIV\ARHIV_1C или только последних которые создались?

megaloman 07-02-2018 16:07 2796516

igor.kinma, 1C архивируется, а затем и копируется всё заново. Если не устраивает, то надо наманер как для баз SQL именовать архив без привязки к дате, обновлять его (при этом будут переархивированы обновлённые файлы и добавлены новые, а затем уже копировать этот файл с признаком даты в имени. Естественно, при этом в архиве будут все файлы. Вы не объяснили, что архивируется и можно ли после архивирования исходные файлы удалить. Если это бэкапы - вполне можно. И даже нужно, иначе будем постоянно архивировать всё, включая бэкапы столетней давности. Всего-то в Rar добавить ключ. Тогда получим архивы только свежих файлов. А вот если это рабочие базы .... Увы.
С sql мне понятнее. Там бэкапы, да и то, после успешного архивирования я бы их удалял (соответствующий ключ в rar).

В Вашей первоначальной постановке архивируется всё. Иного Вы не озвучивали.
Если что-то не устраивает, постарайтесь четче сформулировать Ваши хотелки :) Может быть можно как-то привязываться к именам исходных файлов?

igor.kinma 07-02-2018 16:22 2796519

megaloman, Хорошо я попробую сформулировать по конкретней как и что у меня устроено и что нужно, но чуть по позже ) Сейчас пока в кратце могу сказать что недавно словили шифровальщик и хапнули много горя( Вот теперь и хочу сделать достойную а главное автоматизированную систему архивации)

igor.kinma 07-02-2018 17:18 2796532

megaloman, Сейчас постараюсь объяснить что и как устроено и что бы хотелось получить в результате.

Дано:

1-сервер на нем есть рабочая база 1С Путь D:\Programs\1C к этой папке дан общий доступ и SQL сервер с базами. с пн по пт в 21:00 делается бекап Баз (.bak) с удалением файлов старше 6 дней. Бекапы сохраняются в D:\MSSQL\MSSQL\Backup\21_00.
Так же на этом же сервере есть папки D:\ARHIV\1C и D:\ARHIV\BD (где должны лежать rar архивы)

2-сервер является резервным на нем должны храниться копии архивов. На нем так же есть папки D:\ARHIV\1C и D:\ARHIV\BD. Сетевой путь \\Server-domain\d$\ARHIV....

Что хочется:
Что бы с пн по пт в 21:30 создавался архив (.rar) D:\Programs\1C и D:\MSSQL\MSSQL\Backup\21_00 на сервере 1 и копировался на сервер 2.
- Архив 1С будет каждый раз новый что бы иметь возможность восстановить на любую дату
- Архив SQL должен обновляться с пн по чт, а в пятницу полный архив. или обновляться с пн по пт и переименовываться.

Когда наступает вечер пятницы 21:00 в папке D:\MSSQL\MSSQL\Backup\21_00 будут лежать копии баз за неделю. Следовательно её нужно заархивировать, присвоить дату и скопировать на 2 сервер, а промежуточный архив в папке D:\ARHIV\BD с пн по чт удалить на обои серверах, так как он уже не нужен. В итоге что мы должны получить утром в понедельник придя на работу

5 архивов 1С (.rar) каждый который с датой создания и которые размещены на сервер 1 и 2.
1 архив SQL баз (.rar) с пятничной датой который содержит в себе бекапы баз из папки D:\MSSQL\MSSQL\Backup\21_00 с пн по пт. и так же расположен на сервере 1 и 2.

Все начинается новая неделя и архивы на сервере 1 нам плодить не нужно так как они все есть на 2 сервере, но мы их не удаляем а перезаписываем по 1. (тоесть в 21:30 создается архив а старый за понедельник удаляется) и новый архив так же копируется на сервер 2 (но только новый т.к. копировать все нам не нужно они уже есть на сервере. Что же касается архива c Базами SQL так же создается новый но не удаляя пятничный. Пятничный архив должен удалиться уже на след. понедельник.

Вывод, цель и чего хотелось достичь: каждый понедельник у нас на сервере 1 всегда должен быть полноценный архив SQL и 1С за прошедшую неделю, а сервер 2 является просто сборщиком архивов, на случай падения сервера 1.

Что касаемо удаления:

D:\Programs\1C - рабочая база удалять нельзя.
D:\MSSQL\MSSQL\Backup\21_00 - бекабы сделанные SQL сервером. Удалять можно, но не желательно так как если придется восстанавливать базу скажем так на вчера ни чего из архива доставать не нужно. К тому же файлы старше 6 дней затираются сами.

Вот это как бы основная задача. Если что то я замудрил или как то можно упростить не во вред безопасности пишите.

megaloman 07-02-2018 18:04 2796544

igor.kinma, Имхо, Вы получили что хотели. Единственное, я поленился удалять Backup(SQL)_update.rar на 2 сервере, так как в понедельник он всё равно перезапишется. А если хотите автоматизации, чтобы потом не думать, надо ограничивать число архивов на втором сервере - иначе забьёте весь диск.

igor.kinma 07-02-2018 23:40 2796618

megaloman, я понимаю что это нагло с моей стороны но именно об этом я и хотел Вас попросить. а Именно сделать второй файл который я бы запустил в планировщик на сервере 2.

Дано:

Хочу на сервере 2 сделать папки: Неделя Месяц Год.

Задача:

Сделать Файл который будет отслеживать кол-во архивов и копировать нужные архивы в папки.

Тоесть архивы с сервера 1 должны копироваться на сервер 2 в папку неделя. В ней должны храниться все архивы за весь месяц. Затем в папку месяц должны копироваться архивы на 1, 15 и на конец месяца. А В папке неделя архивы должны перезаписываться.

Попробую пояснить в январе 31 день. Хотелось бы что бы в папке неделя хранился 31 архив а в папку месяц копировался архив на 01.01.2018, 15.01.2018 и 31.01.2018. Затем в Папке неделя архивы начали бы перезаписываться. на Февральские.

Тоесть на конец месяца в папке неделя должны быть февральские архивы а в папке месяц архивы на 01.02.2018, 15.02.2018, 28.02.2018

ну и т.д.

Скажите пожалуйста реально ли написать такой Файл?

megaloman, Запустил Ваш скрипт в Планировщик. (Немного подумав, на ум приходит доработка 1 командного файла) он отработал как положено в 21:30. Что получил:

Архив баз 1С создался и скопировался. а Архив SQL баз не создался и не скопировался ! Лог файл то же создался только на базы 1С, на SQL да же нет лог файла

На всякий случай скидываю поправленный файл. Может я что накосячил

мой скрипт
Код:

Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%
Call :DayOfWeek "DOW"

Call :Backup "D:\Programs\1C" "D:\ARHIV\1C" "Backup(1C)_%DArc%.rar" "\\Server-domain\d$\ARHIV\1C" "D:\ARHIV\log\1C_%DArc%.log"

If "%DOW%"=="5" (
        >>"D:\ARHIV\log\SQL_%DArc%.log" (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  "D:\MSSQL\MSSQL\Backup\21_00"
        Echo ++++++ Ren "D:\ARHIV\BDSQL\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar"
        Ren "D:\ARHIV\BDSQL\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar" 2>&1
        )
        Call :Backup "D:\MSSQL\MSSQL\Backup\21_00" "D:\ARHIV\BDSQL" "Backup(SQL)_%DArc%.rar" "\\Server-domain\d$\ARHIV\SQL" "D:\ARHIV\log\SQL_%DArc%.log"
) Else (
        Call :Backup "D:\MSSQL\MSSQL\Backup\21_00" "D:\ARHIV\BDSQL" "Backup(SQL)_update.rar" "\\Server-domain\d$\ARHIV\SQL" "D:\ARHIV\log\SQL_%DArc%.log"

rem                          1                            2                  3                          4                                  5
GoTo :Eof

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        >nul %Arc% u -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
                Echo ++++++ Files In Archives "%~2\%~3"
                Echo:
                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives from %2  to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"
                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~dp5*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~dp5%%f"
        )
        )
GoTo :Eof

:DayOfWeek
rem Выдаёт номер дня недели в переменную имя которой указано в вызове в кавычках
        Set /A YYYY=%date:~6,4%, MM=1%date:~3,2%-100, DD=1%date:~0,2%-100
        Set /A %~1=((%YYYY%-1901)*365 + (%YYYY%-1901)/4 + %DD% + (!(%YYYY% %% 4))*(!((%MM%-3)^&16))+(%MM%-1)*30+2*(!((%MM%-7)^&16))-1+((65611044^>^>(2*%MM%))^&3))%%7+1
GoTo :Eof


megaloman 08-02-2018 09:46 2796653

igor.kinma,
Накосячили. Потеряли скобку. Хорошо хоть, что свой код предоставили.
Код:

)
rem                          1                            2                  3                          4                                  5
GoTo :Eof

Давайте решать проблемы по мере их поступления. Я бы предложил запустить скрипт немедленно и убедиться в его нормальной работе, а уж потом ждать его отработки в планировщике.

igor.kinma 08-02-2018 09:57 2796654

megaloman, Спасибо сейчас поправлю у себя и проверю. Правда сейчас люди работают в 1С и часть файлов не заархивируется, но для теста думаю сойдет.

Поправил, запустил, ждем...

megaloman 08-02-2018 10:26 2796661

igor.kinma, Не знаю объём Ваших баз, но, по крайней мере, для отладки указал бы в RAR ключ -m1. Время радикально уменьшится.
А чтобы не дёргать 1C закомментировал бы строку
rem Call :Backup "D:\Programs\1C" ....
Наверное, если есть вероятность использования файлов во время архивирования, лучше добавить в RAR ключ -dh. Всегда есть вероятность, что какая-то тётушка забыла выйти из программы вечером. Какую при этом копию Вы получите, не знаю, не уверен, что сможете восстановить базу после этого.
>nul %Arc% u -m3 -r -ep1 -dh "%~2\%~3" "%~1\*.*"
Цитата из хелпа RAR
Ключ -DH — открывать совместно используемые файлы.
--------------------------------------------------------------------------------
Позволяет обрабатывать файлы, открытые для записи другими программами.
Это опасный ключ, так как он разрешает архивировать те файлы, которые в тот же момент могут быть изменены другой программой. Если при этом будет нарушена внутренняя структура заархивированного файла, то программа для его обработки после распаковки такого файла может его не открыть. Используйте этот ключ очень осторожно!
Цитата:

Цитата igor.kinma
Сделать Файл который будет отслеживать кол-во архивов и копировать нужные архивы в папки. »

Копировать или перемещать?

igor.kinma 08-02-2018 10:50 2796665

megaloman, Да объем баз действительно большой по этому пока и не отписываюсь о результатах, но уже заметил то ли проблему, то ли долгую работу.

1) Архив 1С создался и скопировался
2) Архив SQL баз создался но объем файла 0. Ждал 30 минут. Сейчас отменил задачу и удалил из папки D:\MSSQL\MSSQL\Backup\21_00 все файлы оставил только 1 для теста.

Вот скрин окна на каком месте все висит:Файл 151136

строка @Echo Off убрана для теста

P.S. Судя по всему имеет место быть зависание. прошло 10 минут а все так же и осталось вот скрин вместе с лог файлом Файл 151138

megaloman 08-02-2018 11:05 2796668

Цитата:

Цитата igor.kinma
Архив SQL баз создался но объем файла 0 »

ИМХО, не создался, а создаётся. Упаковщик не отработал еще. Какой объём бэкапов? Покажите лог, созданный скриптом. На скрине ничего не видно, так как нормальный вывод RAR направлен в nul.

igor.kinma 08-02-2018 11:06 2796669

megaloman, Ура спустя 20 минут архив создался и скопировался. Но есть небольшой баг в лог файлах, а именно ломаный текст вот скидываю сами файлы.
1) Файл 151139
2) Файл 151140

Можно ли как то уменьшить лог и исправить текст?

P.S. полный объем архивируемых баз SQL - 40 Гб а 1С - 5 Гб

igor.kinma 08-02-2018 11:21 2796673

Цитата:

Цитата megaloman
Копировать или перемещать? »

А тут в принципе роли не играет если переместить то они все равно останутся но в месячной папке, а если скопировать то они все равно перезапишутся (удаляться) в случаи когда месяц 30 или 28 дней. 31 день должен будет удалиться.

Скорее всего проще сделать перемещение.

megaloman 08-02-2018 11:40 2796678

Цитата:

Цитата igor.kinma
Но есть небольшой баг в лог файлах, а именно ломаный текст »

Описанный баг - не баг, а фича. Это не баг. Надо смотреть лог-файл в редакторе\вьювере в 866 кодировке (DOS)(я работаю в FAR-менеджере, его редактор позволяет, есть куча редакторов, в которых можно выбрать кодировку), а Вы смотрите в, например, блокноте (1251).
И вообще, минимум неприятностей при работе с cmd-файлами - сохранять их в 866 кодировке. Повторюсь, с батниками я работаю в FAR - для этих целей удобнее всего. RAR выдаёт кириллицу в 866 кодировке.
Уменьшить лог - пожалуйста, можно убрать выдачу содержимого архива.
Вот кусок с исправлениями. При запуске батника будет видна работа архиватора. Закомментирована выдача содержимого архива
Код:

:Backup
        >>%5 (
        Echo ++++++
        Echo ++++++ %Date%  %Time%  %1
        )
       
        %Arc% u -m3 -r -ep1 -dh "%~2\%~3" "%~1\*.*"
       
        >>%5 (
        If Not Exist "%~2\%~3" (
                Echo !!!!!! Archive not created "%~2\%~3"
        ) Else (
rem                Echo ++++++ Files In Archives "%~2\%~3"
rem                Echo:
rem                %Arc% lb "%~2\%~3"
                Echo:
                Echo ++++++ Copy arhives "%~2\%~3" to  %4
                Echo:
                Xcopy /D /Y /F "%~2\*.rar" "%~4\"

                Echo:
                Echo ++++++ Delete arhives from %2
                Echo:

                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
                FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~dp5*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~dp5%%f"
        )
        )
GoTo :Eof


igor.kinma 08-02-2018 11:48 2796680

megaloman, Огромное Вам спасибо за потраченное время. Очень Вам признателен и бесконечно благодарен. Если будет время а главное желание может попробуете сделать файл для 2 сервера. Или может это все можно объединить в 1 файл? (думаю что нет)

igor.kinma 08-02-2018 12:11 2796688

megaloman, Да конечно любой полет Вашей фантазии. Делайте как считаете нужным и правильным.

Просто изначально хотелось получить полноценный архив за неделю на сервере 1 и полноценный месячный архив на сервере 2 с возможностью восстановления на каждый месяц в течении года на 01 (начало месяца) 15 (середина месяца) и 30(31)(28-февраль) на конеч месяца. Ну и конечно основной архив на 31.12.2018 и т.д.

что касается ухода за базой конечно вы правы просто я так же не занимаюсь обслуживанием 1С а только ее архивированием. Ну Log файлы бородатой давности и правда не к чему)

megaloman 08-02-2018 12:28 2796695

Цитата:

Цитата igor.kinma
Если будет время а главное желание может попробуете сделать файл для 2 сервера. »

Мне надо переосмыслить Вашу постановку. Мне она не очень нравится. Лучше бы сделать батник на 1 сервере и в одном батнике. Думаю, что можно и нужно.
Мысли вслух - дополнено
За базой ведь тоже надо ухаживать. Посмотрел распечатку содержимого архива 1С - там есть логи восьмилетней давности. Куча старых файлов .log (имхо, однозначно надо удалить, оставить штук 5 последних в каждой папке), .log.cfl (имхо, скорее всего тоже надо удалить, оставить штук 5 последних - я не спец по 1С) Это под силу тому же батнику, по сравнению с архивацией - ничтожное время

Заархивированные бэкапы SQL тоже надо удалять. Иначе получается эпидерсия. SQL у вас хранит 6 бэкапов. Условно 1,2,3,4,5,6 число. Вы их архивируете в архив update. В понедельник архива update уже нет. Зато получим новый бэкап за 7 число и 5 старых, то есть
2,3,4,5,6,7, которые попадут в update в понедельник, и, так как архивация будет работать всю неделю, в конце недели будут бэкапы 7,8,9,10,11, и в update поимеем заархивированные файлы
2,3,4,5,6,7,8,9,10,11
То есть архивы двукратно раздуты. Да у Вас с Вашим объёмом это кошмар.
Вывод: Надо делать архивы SQL ежедневно с датой. Заархивированное удалять.

igor.kinma 08-02-2018 12:46 2796699

Цитата:

Цитата megaloman
Вывод: Надо делать архивы SQL ежедневно с датой. Заархивированное удалять. »

Не проблема настрою в SQL 2 задания:

1) Бекапить в 21:00 в папку D:\MSSQL\MSSQL\Backup\21_00 с удалением файлов старше 6 дней. (для себя, что бы можно было восстановить недельный бекап не разворачивая архив)
2) Бекапить в 21:30 в папку D:\MSSQL\MSSQL\Backup\Today c удалением файлов старше 1 дня. (для архивирования)

Сам скрипт архивирования буду запускать в 22:00

igor.kinma 09-02-2018 22:40 2797076

megaloman, Добрый вечер. Простите не знаю как по имени. Наступила пятница и Ваш скрипт отработал, но не совсем так как надо:

1) на сервер 2 осталось 2 архива Backup(SQL)_update.rar и Backup(SQL)_дата.rar
2) В архиве Backup(SQL)_дата.rar оказалось 6 файлов а не 5

megaloman 11-02-2018 21:18 2797394

Вложений: 1
igor.kinma, Я не разбирался с этим скриптом, считаю, что это бесперспективно: изначально мне постановка не нравилась.
Вот новый скрипт
Код:

@Echo Off
cls
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""
Set "ArcExt=rar"

Set "C1_From=D:\Programs\1C"
Set "C1_Arc1=D:\ARHIV\1C"
Set "C1_Arc2=\\Server-domain\d$\ARHIV\1C"
Set "C1_Log=D:\ARHIV\Log"
Set "C1_Fat=D:\Fatal_Error_1C_Bak"
Set "C1_AKey=u -m3 -r -ep1 -dh"

Set "Sql_From=D:\MSSQL\MSSQL\Backup\21_00"
Set "Sql_Arc1=D:\ARHIV\SQL"
Set "Sql_Arc2=\\Server-domain\d$\ARHIV\Sql"
Set "Sql_Log=D:\ARHIV\Log"
Set "Sql_Fat=D:\Fatal_Error_SQL_Bak"
Set "Sql_AKey=u -m2 -ep1"

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "YYYY=%TDate:~0,4%"
Set "MM=%TDate:~4,2%"
Set "DD=%TDate:~6,2%"
Set "DArc=%YYYY%.%MM%.%DD%"

Call :Back_C1 "%C1_From%" "%C1_Arc1%" "%C1_Arc2%" "%C1_Log%" "%C1_AKey%"

Call :Back_SQL "%SQL_From%" "%SQL_Arc1%" "%SQL_Arc2%" "%SQL_Log%" "%Sql_AKey%"

REM Pause
GoTo :Eof

:Back_C1
rem Число хранимых архивов
        Set /A NDays1=6
        Set /A NMonth1=7

        Set /A NDays2=14
        Set /A NMonth2=10

rem Дата промежуточного бэкапа за месяц
        Set /A Middle=15

        Set "LogFile="%~4\%DArc%_1C_Backup.log""

        Call :MakeDir %1 %2 %3 %4 "%C1_Fat%_%DArc%.log" %LogFile%
        Set /A Back_Err=%ErrorLevel%
        If %Back_Err%==2 Exit /B 2

        If Not Exist "%~2\Month\%YYYY%.%MM%.??_1C_Backup.%ArcExt%" (Set /A LogMonth=1) Else (Set /A LogMonth=0)
        If %LogMonth%==1 Call :MonthEnd "%~2\Days\20*1C*.%ArcExt%" "%~2\Month" 

        If Not Exist "%~2\Year\%YYYY%.??.??_1C_Backup.%ArcExt%" (Set /A LogYear=1) Else (Set /A LogYear=0)
        If %LogYear%==1 Call :MonthEnd "%~2\Days\20*1C*.%ArcExt%" "%~2\Year" 

        Set "ArcName1=%~2\Update_1C_Backup.%ArcExt%"
        Set "ArcName2=%~2\Days\%DArc%_1C_Backup.%ArcExt%"

        If %LogMonth%==1 (
                (Echo: &Echo **** Del "%ArcName1%") >>%LogFile%
                Del "%ArcName1%" 2>nul
        )

        Call :MakeArc "%ArcName1%" "%~1\*.*" %5 %LogFile%
        If Not %ErrorLevel%==0 Exit /B %ErrorLevel%
       
        (Echo: &Echo **** Copy "%ArcName1%" ---^> "%ArcName2%") >>%LogFile%
        Copy "%ArcName1%" "%ArcName2%" >>%LogFile% 2>&1 &&Echo ++++ copyed successful >>%LogFile%
       
        Call :MonthMid "%~2\Month\%YYYY%.%MM%.??_1C*.%ArcExt%" "%ArcName2%" "%~2\Month" %Middle% %LogFile%

        If %LogMonth%==1 Call :MonthEnd "%~2\Days\20*1C*.%ArcExt%" "%~2\Month" 
        If %LogYear%==1 Call :MonthEnd "%~2\Days\20*1C*.%ArcExt%" "%~2\Year" 
       
        Echo: >>%LogFile%
        Call :Purgen "%~2\Days\20*1C*.%ArcExt%" %NDays1% %LogFile%
        Call :Purgen "%~4\20*1C*.log" %NDays1% %LogFile%
        Call :Purgen "%~2\Month\20*1C*.%ArcExt%" %NMonth1% %LogFile%

        If %Back_Err%==0 (
                (Echo: &Echo **** Xcopy /D /F "%~2\Days\20*1C*.%ArcExt%" ---^> "%~3\Days\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Days\20*1C*.%ArcExt%" "%~3\Days\" >>%LogFile% 2>&1

                (Echo: &Echo **** Xcopy /D /F "%~2\Month\20*1C*.%ArcExt%" ---^> "%~3\Month\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Month\20*1C*.%ArcExt%" "%~3\Month\" >>%LogFile% 2>&1

                (Echo: &Echo **** Xcopy /D /F "%~2\Year\20*1C*.%ArcExt%" ---^> "%~3\Year\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Year\20*1C*.%ArcExt%" "%~3\Year\" >>%LogFile% 2>&1

                Call :Purgen "%~3\Days\20*1C*.%ArcExt%" %NDays2% %LogFile%
                Call :Purgen "%~3\Month\20*1C*.%ArcExt%" %NMonth2% %LogFile%
        )
GoTo :Eof

:Back_SQL
rem Число хранимых архивов
        Set /A NDays1=6
        Set /A NMonth1=7

        Set /A NDays2=14
        Set /A NMonth2=10

rem Число сохраняемых SQL бэкапов
        Set /A NSQLbak=5

rem Дата промежуточного бэкапа за месяц
        Set /A Middle=15

        Set "LogFile="%~4\%DArc%_SQL_Backup.log""

        Call :MakeDir %1 %2 %3 %4 "%SQL_Fat%_%DArc%.log" %LogFile%
        Set /A Back_Err=%ErrorLevel%
        If %Back_Err%==2 Exit /B 2

        If Not Exist "%~2\Month\%YYYY%.%MM%.??_SQL_Backup.%ArcExt%" (Set /A LogMonth=1) Else (Set /A LogMonth=0)
        If %LogMonth%==1 Call :MonthEnd "%~2\Days\20*SQL*.%ArcExt%" "%~2\Month" 

        If Not Exist "%~2\Year\%YYYY%.??.??_SQL_Backup.%ArcExt%" (Set /A LogYear=1) Else (Set /A LogYear=0)
        If %LogYear%==1 Call :MonthEnd "%~2\Days\20*SQL*.%ArcExt%" "%~2\Year" 

        Set "ArcName1=%~2\%DArc%_SQL_Backup.%ArcExt%"
        Set "ArcName2=%~2\Days\%DArc%_SQL_Backup.%ArcExt%"

        Call :MakeArc "%~2\%DArc%_SQL_Backup.%ArcExt%" "%~1\*.*" %5 %LogFile%
        If Not %ErrorLevel%==0 Exit /B %ErrorLevel%

        Set "SQLbak=%~1\SQLbak"
        Md "%SQLbak%" 2>nul
        Set "CSQLbak=Move /Y "%~1\*.*" "%SQLbak%\""
        (Echo: &Echo **** %CSQLbak%) >>%LogFile%
        %CSQLbak% >>%LogFile% 2>&1 &&Echo ++++ movied successful >>%LogFile%
        Call :Purgen "%SQLbak%\*.*" %NSQLbak% %LogFile%

        (Echo: &Echo **** Move "%ArcName1%" ---^> "%ArcName2%") >>%LogFile%
        Move /Y "%ArcName1%" "%ArcName2%" >>%LogFile% 2>&1 &&Echo ++++ movied successful >>%LogFile%
       
        Call :MonthMid "%~2\Month\%YYYY%.%MM%.??_SQL*.%ArcExt%" "%ArcName2%" "%~2\Month" %Middle% %LogFile%

        If %LogMonth%==1 Call :MonthEnd "%~2\Days\20*SQL*.%ArcExt%" "%~2\Month" 
        If %LogYear%==1 Call :MonthEnd "%~2\Days\20*SQL*.%ArcExt%" "%~2\Year" 

        (Echo: &Echo **** Xcopy /D /F "%~2\Days\20*SQL*.%ArcExt%" ---^> "%~3\Days\") >>%LogFile%
        Xcopy /D /F /Y "%~2\Days\20*SQL*.%ArcExt%" "%~3\Days\" >>%LogFile% 2>&1

        Echo: >>%LogFile%
        Call :Purgen "%~2\Days\20*SQL*.%ArcExt%" %NDays1% %LogFile%
        Call :Purgen "%~4\20*SQL*.log" %NDays1% %LogFile%
        Call :Purgen "%~2\Month\20*SQL*.%ArcExt%" %NMonth1% %LogFile%

        If %Back_Err%==0 (
                (Echo: &Echo **** Xcopy /D /F "%~2\Days\20*SQL*.%ArcExt%" ---^> "%~3\Days\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Days\20*SQL*.%ArcExt%" "%~3\Days\" >>%LogFile% 2>&1

                (Echo: &Echo **** Xcopy /D /F "%~2\Month\20*SQL*.%ArcExt%" ---^> "%~3\Month\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Month\20*SQL*.%ArcExt%" "%~3\Month\" >>%LogFile% 2>&1

                (Echo: &Echo **** Xcopy /D /F "%~2\Year\20*SQL*.%ArcExt%" ---^> "%~3\Year\") >>%LogFile%
                Xcopy /D /F /Y "%~2\Year\20*SQL*.%ArcExt%" "%~3\Year\" >>%LogFile% 2>&1

                Call :Purgen "%~3\Days\20*SQL*.%ArcExt%" %NDays2% %LogFile%
                Call :Purgen "%~3\Month\20*SQL*.%ArcExt%" %NMonth2% %LogFile%
        )
GoTo :Eof

:MakeDir
        2>nul (Md %2 &Md %3 &Md %4)

        If Not Exist %4 (Call :MsgErr1 %4 %5 &Exit /B 2)
        Call :TxtStart %1 %6 ||Exit /B 2

        If Not Exist %1 (Call :MsgErr1 %1 %6 &Exit /B 2)
        If Not Exist %2 (Call :MsgErr1 %2 %6 &Exit /B 2)
        2>nul (Md "%~2\Days" &Md "%~2\Month" &Md "%~2\Year")

        If Not Exist %3 (Call :MsgErr1 %3 %6 &Exit /B 1)
        2>nul (Md "%~3\Days" &Md "%~3\Month" &Md "%~3\Year")

        If Exist %1 If Exist %2 If Exist %3 If Exist %4 (Set /A %~5=0 &Set "%~6=" &Exit /B 0)
GoTo :Eof

:MsgErr1
        Echo ---- folder %1 not accessible >>%2
GoTo :Eof

:Purgen
        FOR /F "usebackq skip=%2 delims=" %%f IN (`2^>nul Dir %1 /B /A:-D /O:-D /T:C`) DO (Del "%~dp1%%f" >nul &&Echo ++++ Deleted "%~dp1%%f" >>%3)
GoTo :Eof

:MonthEnd
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir %1 /B /A:-D /O:-D /T:C`) DO (
                (Echo: &Echo **** Copy "%~dp1%%f" ---^> "%~2\") >>%LogFile%
                Copy "%~dp1%%f" "%~2\" >>%LogFile% 2>&1 &&Echo ++++ copyed successful >>%LogFile%
                GoTo :Eof
        )
GoTo :Eof

:MonthMid
        SetLocal
        Set /A DtM=%4+100
        Set /A DtT=1%DD%
        If %DtT% LSS %DtM% GoTo :Eof

        FOR /F "usebackq skip=1 delims=" %%f IN (`2^>nul Dir %1 /B /A:-D /O:-D /T:C`) DO GoTo :Eof

        (Echo: &Echo **** Copy %2 ---^> "%~3\") >>%5
        Copy %2 "%~3\" >>%5 2>&1 &&Echo ++++ copyed successful >>%5
        EndLocal
GoTo :Eof

:MakeArc
        %Arc% %~3 %1 %2 2>>%4
        If Not %ErrorLevel%==0 (
                (Echo: &Echo ---- backup %ArcExt% error=%ErrorLevel% %1) >>%4
        ) Else (
                (Echo: &Echo **** archive available %1) >>%4
        )
Exit /B %ErrorLevel%

:TxtStart
        (Echo ++++ ++++ ++++ &Echo ++++ %Date%  %Time%  backuping %1) >>%2
        If Not Exist %Arc% (Echo ---- %Arc%  not found >>%2 &Exit /B 2)
Exit /B 0

Кратко о настройках на примере SQL (1C аналогично):
Откуда берём файлы для архивации Set "Sql_From=D:\MSSQL\MSSQL\Backup\21_00"
Куда помещаем архивы rar на 1 сервере Set "Sql_Arc1=D:\ARHIV\SQL"
Куда помещаем архивы rar на 2 сервере Set "Sql_Arc2=\\Server-domain\d$\ARHIV\Sql"
Куда помещаем логи Set "Sql_Log=D:\ARHIV\Log"
Куда помещаем лог если Sql_Log недоступен Set "Sql_Fat=D:\Fatal_Error_SQL_Bak"
Ключи для работы RAR Set "Sql_AKey=u -m2 -ep1"

При работе скрипта создадутся папки для хранения ежедневных, за каждый месяц 3 архива, за каждый год 2 архива.
D:\ARHIV\SQL\Days
D:\ARHIV\SQL\Month
D:\ARHIV\SQL\Year

Будет создана папка
D:\MSSQL\MSSQL\Backup\21_00\SQLbak\
Туда будут перемещаться созданные MS SQL бэкапы, чтобы они повторно не архивировались.
Число хранимых RAR-архивов на 1 и 2 сервере, SQL-бэкапов и день создания промежуточного архива за месяц
rem Число хранимых архивов (можете изменить)
Set /A NDays1=6
Set /A NMonth1=7

Set /A NDays2=14
Set /A NMonth2=10

rem Число сохраняемых SQL бэкапов
Set /A NSQLbak=5

rem Дата промежуточного бэкапа за месяц
Set /A Middle=15

Пробуйте. Сначала без планировщика.
Не советую менять папки и маски файлов - мне будет трудно разобраться.
У меня нет иллюзий, что я не делаю ошибок. У меня нет реальной системы. Отладку делал на искусственно созданной среде.
К пятнице никак не привязываюсь - не вижу смысла. Хранится достаточное число архивов, чтобы восстановить нужное состояние.
Папки руками не делайте - сами сделаются.

igor.kinma 11-02-2018 23:40 2797420

megaloman, Решил не ждать до завтра запустил Ваш скрипт прямо сейчас. Время запуска 11.02.2018 (23:23). Итог:

Сервер 1:

Создались папки ( D:\ARHIV\1C\Days, D:\ARHIV\1C\Month, D:\ARHIV\1C\Year)
В них создались архивы:
1) D:\ARHIV\1C\Days\2018.02.11_1C_Backup
2) D:\ARHIV\1C\Month\2018.02.11_1C_Backup
3) D:\ARHIV\1C\Year\2018.02.11_1C_Backup
Создался архив: D:\ARHIV\1C\Update_1C_Backup

Создались папки (D:\ARHIV\SQL\Days, D:\ARHIV\SQL\Month, D:\ARHIV\SQL\Year)
Архивы ни какие не создались!

Папка: D:\MSSQL\MSSQL\Backup\21_00 В ней то же ни чего не создалось!


Сервер 2:

Создались папки ( \\Server-domain\d$\ARHIV\1C\Days, \\Server-domain\d$\ARHIV\1C\Month, \\Server-domain\d$\ARHIV\1C\Year)
В них создались архивы:
1) ...\1C\Days\2018.02.11_1C_Backup
2) ...\1C\Month\2018.02.11_1C_Backup
3) ...\1C\Year\2018.02.11_1C_Backup

Создались папки (...\SQL\Days, ...\SQL\Month, ...\SQL\Year)
Архивы ни какие не создались!

Высылаю лог файлы... Файл 151208 , Файл 151209

megaloman 11-02-2018 23:51 2797421

igor.kinma, rar error=10 Нет файлов, удовлетворяющих указанной маске, и параметров.
В папке "D:\MSSQL\MSSQL\Backup\21_00" ничего нет

igor.kinma 11-02-2018 23:55 2797422

megaloman, Увы но к сожалению есть, но только во вложенных папках.

Наверное из за этого. Дело все в том что каждый бекап БД создается в папке с названием БД

1) База kin2017 хранится в D:\MSSQL\MSSQL\Backup\21_00\kin2017
2) База kin2018 Хранится в D:\MSSQL\MSSQL\Backup\21_00\kin2018

и т.д.

P.S. Так устроен SQL. Он для каждой БД создает вложенную папку с её названием

igor.kinma 11-02-2018 23:58 2797424

Цитата:

Цитата megaloman
Вы не озвучивали!! »

Извините пожалуйста думал это не критично. Вроде такая мелочь а надо было учесть (

megaloman 12-02-2018 00:47 2797428

igor.kinma,
Быстрое решение.
Замените красную строку в предыдущем коде
Код:

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%SQL_From%\*.*" /B /A:D`) DO (
        Call :Back_SQL "%SQL_From%\%%d" "%SQL_Arc1%\%%d" "%SQL_Arc2%\%%d" "%SQL_Log%" "%Sql_AKey%"
)

Убейте пустые папки в D:\ARHIV\SQL\ и \\Server-domain ..... Days Month Year

Цитата:

Цитата igor.kinma
Так устроен SQL. Он для каждой БД создает вложенную папку с её названием »

Такого не упомню ... Версия MS SQL? Предложенное решение вполне при такой постановке логично

igor.kinma 12-02-2018 11:50 2797480

megaloman, Доброе утро. Заменил строчку, запустил скрипт. Итог:

Сервер 1:

Создалась папка D:\MSSQL\MSSQL\Backup\21_00\...\SQLbak
В не переместились все файлы из D:\MSSQL\MSSQL\Backup\21_00\...

Создались папки ( D:\ARHIV\1C\Days, D:\ARHIV\1C\Month, D:\ARHIV\1C\Year)
В них создались архивы:
1) D:\ARHIV\1C\Days\ (нет архива)
2) D:\ARHIV\1C\Month\(нет архива)
3) D:\ARHIV\1C\Year\(нет архива)
D:\ARHIV\1C\Update_1C_Backup.rar

Создались папки ( D:\ARHIV\SQL\...\Days, D:\ARHIV\SQL\...\Month, D:\ARHIV\SQL\...\Year)
В них создались архивы:
1) D:\ARHIV\SQL\...\Days\ (2018.02.12_SQL_Backup.rar)
2) D:\ARHIV\SQL\...\Month\(2018.02.12_SQL_Backup.rar)
3) D:\ARHIV\SQL\...\Year\(2018.02.12_SQL_Backup.rar)
4) D:\ARHIV\SQL\ (нет архива)

Сервер 2:

Создались папки ( \\Server-domain\d$\ARHIV\1C\Days, \\Server-domain\d$\ARHIV\1C\Month, \\Server-domain\d$\ARHIV\1C\Year)
В них создались архивы:
1) \\Server-domain\d$\ARHIV\1C\Days\Пусто
2) \\Server-domain\d$\ARHIV\1C\Month\Пусто
3) \\Server-domain\d$\ARHIV\1C\Year\Пусто
\\Server-domain\d$\ARHIV\1C то же пусто (тоесть Update_1C_Backup.rar не скопировался)

Создались папки ( \\Server-domain\d$\ARHIV\SQL\...\Days, \\Server-domain\d$\ARHIV\SQL\...\Month, \\Server-domain\d$\ARHIV\SQL\...\Year)
В них создались архивы:
1) \\Server-domain\d$\ARHIV\SQL\...\Days\ (2018.02.12_SQL_Backup.rar)
2) \\Server-domain\d$\ARHIV\SQ\...\Month\(2018.02.12_SQL_Backup.rar)
3) \\Server-domain\d$\ARHIV\SQ\...\Year\(2018.02.12_SQL_Backup.rar)
\\Server-domain\d$\ARHIV\SQL (пусто)


... Заменены названия папок содержащие названия БД (kin2017, kin2018 и т.д.)

Прикрепляю Лог: Файл 151217, Файл 151218

megaloman 12-02-2018 12:54 2797493

igor.kinma, 1. 1C. Народ работает, поэтому часть файлов заблокировано и полноценный архив не создан. ИМХО, это правильно, не надо неполноценный архив хранить, не надо тешить себя иллюзией, что полноценная копия есть.
Цитата:

Цитата igor.kinma
\\Server-domain\d$\ARHIV\1C то же пусто (тоесть Update_1C_Backup.rar не скопировался) »

Update_1C_Backup.rar под таким именем не копируется никогда и никуда. Если создаётся полноценный архив (RAR выдаёт код завершения %ErrorLevel%=0), тогда этот файл копируется в нужные папки с именем Дата_1С_.......
Если сегодня вечером Вы снова запустите скрипт и если никто не будет держать файлы (RAR сделает нормальный архив), то получите нормальный результат.

2. SQL. По логу скрипт отработал нормально. Бэкапы на обоих серверах разложились правильно. Единственное, естественно, что реально заархивировались вчерашние бэкапы (точнее, там сейчас в каждом Rar-файле 5 бэкапов за неделю) в архив с сегодняшней датой. Если Вы сегодня вечером намерены запустить скрипт для архивирования сегодняшних бэкапов, хотелось бы, чтобы эти архивы старых бэкапов не перезаписались. Поэтому, переименуйте все 2018.02.12_SQL_Backup.rar в, например, 2018.02.09_SQL_Backup.rar. Чтобы не делать это ручками, вот скрипт
Код:

@Echo Off
cls

Set "Sql_Arc1=D:\ARHIV\SQL"
Set "Sql_Arc2=\\Server-domain\d$\ARHIV\Sql"

Set "Name1=2018.02.12_SQL_Backup.rar"
Set "Name2=2018.02.09_SQL_Backup.rar"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Sql_Arc1%\%Name1%" /B /A:-D /S`) DO Ren "%%f" "%Name2%"
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%Sql_Arc2%\%Name1%" /B /A:-D /S`) DO Ren "%%f" "%Name2%"

Pause

Кстати, в дальнейшем архивация будет работать для SQL в 5 раз быстрее, так как будет архивироваться только по одному бэкапу в каждой папке.

Итак, ИМХО, полёт нормальный.

igor.kinma 12-02-2018 13:08 2797496

megaloman, Большое спасибо. Запущу этот скрипт в Планировщик в 21:30 и понаблюдаю за работой. Если можно объясните пожалуйста что будет храниться в папках Days, Month и Year. И файлы из папки D:\MSSQL\MSSQL\Backup\21_00\...\SQLbak буду сами удаляться ?

megaloman 12-02-2018 14:07 2797505

что будет храниться в папках Days, Month и Year. И файлы из папки D:\MSSQL\MSSQL\Backup\21_00\...\SQLbak буду сами удаляться

Для каждой задачи своя процедура :Back_C1 :Back_SQL в которой есть некоторые настроечные параметры

Days Ежедневные архивы.
Число хранимых ежедневных архивов на 1 и втором серверах NDays1=6 и NDays2=14 Думайте сами сколько надо. Если надо, измените в соответствующей процедуре. Там есть пояснение.

Month Три архива за месяц: первый и последний рабочий день, и за первый рабочий день на дату Middle=15
Число хранимых архивов за месяц на 1 и втором серверах NMonth1=7 (больше двух мес) и NMonth2=10 (больше квартала)

Year Два архива в год, за первый и последний рабочие дни года. Автоматическое удаление старых архивов не предусмотрено.

Файлы из папки D:\MSSQL\MSSQL\Backup\21_00\...\SQLbak буду сами удаляться
Число сохраняемых SQL бэкапов NSQLbak=5

igor.kinma 21-02-2018 10:58 2799344

И так Уважаемый megaloman, Ваш скрипт работает с 12.02.2018. Что Мы имеем на 21.02.2018

На сервере 1:

1c

1) \\SERVER\D$\ARHIV\1C\Days\ лежат архивы с 13.02.2018 по 20.02.2018
2) \\SERVER\D$\ARHIV\1C\Month\ лежат архивы 2018.02.15_1C_Backup.rar и 2018.02.20_1C_Backup.rar
3) \\SERVER\D$\ARHIV\1C\Year\ лежат архивы 2018.02.19_1C_Backup.rar и 2018.02.20_1C_Backup.rar
4) \\SERVER\D$\ARHIV\1C\ лежит архив Update_1C_Backup.rar

SQL

1)\\SERVER\D$\ARHIV\SQL\kin2017\Days\ лежат архивы с 13.02.2018 по 20.02.2018
2) \\SERVER\D$\ARHIV\SQL\kin2017\Month\ лежат архивы 2018.02.15_SQL_Backup.rar и 2018.02.20_SQL_Backup.rar
3) \\SERVER\D$\ARHIV\SQL\kin2017\Year\ лежат архивы 2018.02.19_SQL_Backup.rar и 2018.02.20_SQL_Backup.rar

Log

\\SERVER\D$\ARHIV\Log\ лежат логи с 2018.02.13 по 2018.02.20

На сервере 2:

1c

1) \\SERVER-DOMAIN\D$\ARHIV\1C\Days\ лежат архивы с 12.02.2018 по 20.02.2018
2) \\SERVER-DOMAIN\D$\ARHIV\1C\Month\ лежат архивы 2018.02.15_1C_Backup.rar и 2018.02.20_1C_Backup.rar
3) \\SERVER-DOMAIN\D$\ARHIV\1C\Year\ лежат архивы 2018.02.19_1C_Backup.rar и 2018.02.20_1C_Backup.rar

SQL

1)\\SERVER-DOMAIN\D$\ARHIV\SQL\kin2017\Days\ лежат архивы с 12.02.2018 по 20.02.2018
2) \\SERVER-DOMAIN\D$\ARHIV\SQL\kin2017\Month\ лежат архивы 2018.02.15_SQL_Backup.rar и 2018.02.20_SQL_Backup.rar
3) \\SERVER-DOMAIN\D$\ARHIV\SQL\kin2017\Year\ лежат архивы 2018.02.19_SQL_Backup.rar и 2018.02.20_SQL_Backup.rar


Вроде все хорошо но смущают архивы в папках Month и Year


Время: 22:59.

Время: 22:59.
© OSzone.net 2001-