Известно, что для сохранности базы данных нужно создавать резервные копии. Причем создание резервных копий должно выполняться автоматически, а не тогда, когда об этом вспомнит администратор. В этой статье я хочу поделиться опытом создания bat-файлов, позволяющих настроить плановое резервное копирование базы данных PostgreSql с использованием планировщика Windows.
Особенностью планового резервного копирования является то, что пользователь не следит за ходом выполнения операции и не может проконтролировать результат. Исходя из этого, обязательным требованием является ведение журналов с информацией о результатах резервного копирования. Ниже приведен пример BAT-файла, который выполняет резервное копирование базы данных PostgreSQL, ведет журнал с информацией о датах и результатах выполнения, сохраняет подробные сведения о ходе выполнения каждой резервной копии в отдельный текстовый файл и в случае неудачи отображает диалоговое окно с сообщением.
backup.bat
1. REM ПРИМЕР СОЗДАНИЯ РЕЗЕРВНОЙ КОПИИ БАЗЫ ДАННЫХ POSTGRESQL
2. CLS
3. ECHO OFF
4. CHCP 1251
5.
6. REM Установка переменных окружения
7. SET PGBIN=C:\Program Files (x86)\PostgreSQL\8.4\bin\
8. SET PGDATABASE=mydb
9. SET PGHOST=localhost
10. SET PGPORT=5484
11. SET PGUSER=admin
12. SET PGPASSWORD=admin
13.
14. REM Смена диска и переход в папку из которой запущен bat-файл
15. %~d0
16. CD %~dp0
17.
18. REM Формирование имени файла резервной копии и файла-отчета
19. SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
20. SET DUMPFILE=%PGDATABASE% %DATETIME%.backup
21. SET LOGFILE=%PGDATABASE% %DATETIME%.log
22. SET DUMPPATH=«Backup\%DUMPFILE%»
23. SET LOGPATH=«Backup\%LOGFILE%»
24.
25. REM Создание резервной копии
26. IF NOT EXIST Backup MD Backup
27. CALL "%PGBIN%\pg_dump.exe" --format=custom --verbose --file=%DUMPPATH% 2>%LOGPATH%
28.
29. REM Анализ кода завершения
30. IF NOT %ERRORLEVEL%==0 GOTO Error
31. GOTO Successfull
32.
33. REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
34. :Error
35. DEL %DUMPPATH%
36. MSG * «Ошибка при создании резервной копии базы данных. Смотрите backup.log.»
37. ECHO %DATETIME% Ошибки при создании резервной копии базы данных %DUMPFILE%. Смотрите отчет %LOGFILE%. >> backup.log
38. GOTO End
39.
40. REM В случае удачного резервного копирования просто делается запись в журнал
41. :Successfull
42. ECHO %DATETIME% Успешное создание резервной копии %DUMPFILE% >> backup.log
43. GOTO End
44.
45. :End
Сведения о большинстве команд, примененных в «backup.bat» достаточно распространены. Информацию о назначении каждой команды можно получить путем вызова из командной строки следующей команды: "[Имя команды] /?". Я хочу акцентировать внимание на нескольких менее известных моментах.
Строки 15, 16 выполняют переход в папку в которой находится файл «backup.bat». "%0" возвращает имя bat-файла; "%~d0" и "%~dp0" возвращают соответственно диск и путь к bat-файлу. Подробные сведения о работе с параметрами файла можно посмотреть по этой ссылке.
В строке 19 формируется строковое представление даты и времени в нужном формате. При формировании происходит обращение к переменным окружения DATE и TIME, которые хранят текстовое представление даты и времени соответственно. После имени переменной указывается строка вида ":~m,n", где m — позиция в строке, n — количество символов.
В строке 27 вызывается утилита резервного копирования pg_dump.exe. Вызов выполняется с применением команды CALL, это позволяет дождаться завершения утилиты и проанализировать результат выполнения. Вызов утилиты завершается строкой «2>%LOGPATH%». Эта строка означает что поток ошибок STDERR, номер которого 2, приложения pg_dump.exe перенаправляется в файл, имя которого сохранено в переменной окружения LOGPATH. Так как приложение pg_dump.exe выводит все сообщения в стандартный поток ошибок, то в файле LOGPATH будет сохранен подробный отчет о выполнении резервного копирования.
В строках 37 и 42 выполняется перенаправление вывода в файл backup.log. Перенаправление осуществляется оператором ">>". Различие между операторами ">" и ">>" в том, что первый каждый раз создает новый файл, затирая ранее записанные данные, а второй — дописывает данные в существующий файл. Таким образом можно вести журнал с подробными сведениями о результатах резервного копирования.
После создания и проверки bat-файла для создания резервных копий можно создавать задание планировщика Windows. Задание также может быть создано из командной строки. Для этого можно воспользоваться командой SCHTASKS. Ниже приведен пример использования этой команды.
schedule.bat
1. CLS
2. ECHO OFF
3. CHCP 1251
4. SCHTASKS /Create /RU SYSTEM /SC DAILY /TN «Резервное копирование» /TR «D:\Db\backup.bat» /ST 02:00:00
5. IF NOT %ERRORLEVEL%==0 MSG * «Ошибка при создании задачи резервного копирования.»
В результате выполнения schedule.bat будет создана задача «Резервное копирование». Параметры задачи можно посмотреть и изменить через оконный интерфейс. Использование bat-файла для создания задания планировщику может быть полезным в случаях, когда настройку резервного копирования нужно выполнять многократно.
По аналогии можно настроить выполнение скриптов обслуживания базы данных, удаление устаревших данных, резервное копирование отдельных таблиц истории в конце месяца,…
Особенностью планового резервного копирования является то, что пользователь не следит за ходом выполнения операции и не может проконтролировать результат. Исходя из этого, обязательным требованием является ведение журналов с информацией о результатах резервного копирования. Ниже приведен пример BAT-файла, который выполняет резервное копирование базы данных PostgreSQL, ведет журнал с информацией о датах и результатах выполнения, сохраняет подробные сведения о ходе выполнения каждой резервной копии в отдельный текстовый файл и в случае неудачи отображает диалоговое окно с сообщением.
backup.bat
1. REM ПРИМЕР СОЗДАНИЯ РЕЗЕРВНОЙ КОПИИ БАЗЫ ДАННЫХ POSTGRESQL
2. CLS
3. ECHO OFF
4. CHCP 1251
5.
6. REM Установка переменных окружения
7. SET PGBIN=C:\Program Files (x86)\PostgreSQL\8.4\bin\
8. SET PGDATABASE=mydb
9. SET PGHOST=localhost
10. SET PGPORT=5484
11. SET PGUSER=admin
12. SET PGPASSWORD=admin
13.
14. REM Смена диска и переход в папку из которой запущен bat-файл
15. %~d0
16. CD %~dp0
17.
18. REM Формирование имени файла резервной копии и файла-отчета
19. SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
20. SET DUMPFILE=%PGDATABASE% %DATETIME%.backup
21. SET LOGFILE=%PGDATABASE% %DATETIME%.log
22. SET DUMPPATH=«Backup\%DUMPFILE%»
23. SET LOGPATH=«Backup\%LOGFILE%»
24.
25. REM Создание резервной копии
26. IF NOT EXIST Backup MD Backup
27. CALL "%PGBIN%\pg_dump.exe" --format=custom --verbose --file=%DUMPPATH% 2>%LOGPATH%
28.
29. REM Анализ кода завершения
30. IF NOT %ERRORLEVEL%==0 GOTO Error
31. GOTO Successfull
32.
33. REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
34. :Error
35. DEL %DUMPPATH%
36. MSG * «Ошибка при создании резервной копии базы данных. Смотрите backup.log.»
37. ECHO %DATETIME% Ошибки при создании резервной копии базы данных %DUMPFILE%. Смотрите отчет %LOGFILE%. >> backup.log
38. GOTO End
39.
40. REM В случае удачного резервного копирования просто делается запись в журнал
41. :Successfull
42. ECHO %DATETIME% Успешное создание резервной копии %DUMPFILE% >> backup.log
43. GOTO End
44.
45. :End
Сведения о большинстве команд, примененных в «backup.bat» достаточно распространены. Информацию о назначении каждой команды можно получить путем вызова из командной строки следующей команды: "[Имя команды] /?". Я хочу акцентировать внимание на нескольких менее известных моментах.
Строки 15, 16 выполняют переход в папку в которой находится файл «backup.bat». "%0" возвращает имя bat-файла; "%~d0" и "%~dp0" возвращают соответственно диск и путь к bat-файлу. Подробные сведения о работе с параметрами файла можно посмотреть по этой ссылке.
В строке 19 формируется строковое представление даты и времени в нужном формате. При формировании происходит обращение к переменным окружения DATE и TIME, которые хранят текстовое представление даты и времени соответственно. После имени переменной указывается строка вида ":~m,n", где m — позиция в строке, n — количество символов.
В строке 27 вызывается утилита резервного копирования pg_dump.exe. Вызов выполняется с применением команды CALL, это позволяет дождаться завершения утилиты и проанализировать результат выполнения. Вызов утилиты завершается строкой «2>%LOGPATH%». Эта строка означает что поток ошибок STDERR, номер которого 2, приложения pg_dump.exe перенаправляется в файл, имя которого сохранено в переменной окружения LOGPATH. Так как приложение pg_dump.exe выводит все сообщения в стандартный поток ошибок, то в файле LOGPATH будет сохранен подробный отчет о выполнении резервного копирования.
В строках 37 и 42 выполняется перенаправление вывода в файл backup.log. Перенаправление осуществляется оператором ">>". Различие между операторами ">" и ">>" в том, что первый каждый раз создает новый файл, затирая ранее записанные данные, а второй — дописывает данные в существующий файл. Таким образом можно вести журнал с подробными сведениями о результатах резервного копирования.
После создания и проверки bat-файла для создания резервных копий можно создавать задание планировщика Windows. Задание также может быть создано из командной строки. Для этого можно воспользоваться командой SCHTASKS. Ниже приведен пример использования этой команды.
schedule.bat
1. CLS
2. ECHO OFF
3. CHCP 1251
4. SCHTASKS /Create /RU SYSTEM /SC DAILY /TN «Резервное копирование» /TR «D:\Db\backup.bat» /ST 02:00:00
5. IF NOT %ERRORLEVEL%==0 MSG * «Ошибка при создании задачи резервного копирования.»
В результате выполнения schedule.bat будет создана задача «Резервное копирование». Параметры задачи можно посмотреть и изменить через оконный интерфейс. Использование bat-файла для создания задания планировщику может быть полезным в случаях, когда настройку резервного копирования нужно выполнять многократно.
По аналогии можно настроить выполнение скриптов обслуживания базы данных, удаление устаревших данных, резервное копирование отдельных таблиц истории в конце месяца,…