пятница, 22 января 2010 г.

Плановое резервирование базы данных PostgreSql с помощью batch

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

Особенностью планового резервного копирования является то, что пользователь не следит за ходом выполнения операции и не может проконтролировать результат. Исходя из этого, обязательным требованием является ведение журналов с информацией о результатах резервного копирования. Ниже приведен пример BAT-файла, который выполняет резервное копирование базы данных PostgreSQL, ведет журнал с информацией о датах и результатах выполнения, сохраняет подробные сведения о ходе выполнения каждой резервной копии в отдельный текстовый файл и в случае неудачи отображает диалоговое окно с сообщением.

backup.bat
  1. REM ПРИМЕР СОЗДАНИЯ РЕЗЕРВНОЙ КОПИИ БАЗЫ ДАННЫХ POSTGRESQL
  2. CLS
  3. ECHO OFF
  4. CHCP 1251

  5. REM Установка переменных окружения
  6. SET PGBIN=C:\Program Files (x86)\PostgreSQL\8.4\bin\
  7. SET PGDATABASE=mydb
  8. SET PGHOST=localhost
  9. SET PGPORT=5484
  10. SET PGUSER=admin
  11. SET PGPASSWORD=admin

  12. REM Смена диска и переход в папку из которой запущен bat-файл
  13. %~d0
  14. CD %~dp0

  15. REM Формирование имени файла резервной копии и файла-отчета
  16. SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
  17. SET DUMPFILE=%PGDATABASE% %DATETIME%.backup
  18. SET LOGFILE=%PGDATABASE% %DATETIME%.log
  19. SET DUMPPATH="Backup\%DUMPFILE%"
  20. SET LOGPATH="Backup\%LOGFILE%"

  21. REM Создание резервной копии
  22. IF NOT EXIST Backup MD Backup
  23. CALL "%PGBIN%\pg_dump.exe" --format=custom --verbose --file=%DUMPPATH% 2>%LOGPATH%

  24. REM Анализ кода завершения
  25. IF NOT %ERRORLEVEL%==0 GOTO Error
  26. GOTO Successfull

  27. REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
  28. :Error
  29. DEL %DUMPPATH%
  30. MSG * "Ошибка при создании резервной копии базы данных. Смотрите backup.log."
  31. ECHO %DATETIME% Ошибки при создании резервной копии базы данных %DUMPFILE%. Смотрите отчет %LOGFILE%. >> backup.log
  32. GOTO End

  33. REM В случае удачного резервного копирования просто делается запись в журнал
  34. :Successfull
  35. ECHO %DATETIME% Успешное создание резервной копии %DUMPFILE% >> backup.log
  36. GOTO End

  37. :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-файла для создания задания планировщику может быть полезным в случаях, когда настройку резервного копирования нужно выполнять многократно.

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

вторник, 19 января 2010 г.

Полезный ресурс для работы с bat-файлами

На днях решал задачу автоматизации резервного копирования базы данных PostgreSQL. Было два возможных решения: написать свое приложение на C# или использовать bat-файлы. Я остановил свой выбор на втором решении, которое мне показалось более гибким (для изменения не требуется дополнительных программных средств) и быстрым в решении. В результате с помощью bat-файлов были решены следующие задачи:
  1. Вызов внешнего консольного приложения (pg_dump).
  2. Обработка STDERR консольного приложения.
  3. Генерирование имени файла резервной копии с включением имени базы данных, даты и времени резервного копирования.
  4. Ведение журнала (текстовый файл) успехов/неудач резервного копирования.
  5. Отображение диалогового окна в случае неудачного резервного копирования.
  6. Создание пользователя операционной системы от имени которого будет вызываться задание резервного копирования.
  7. Создание задачи для планировщика задач Windows.

В процессе решения задачи узнал много нового о возможностях bat-файлов. Ответы на все вопросы, возникавшие в процессе работы нашел на сайте Rob van der Woude's Scripting Pages. На мой взгляд, отличный ресурс, который можно рекомендовать.

Наверное, в одном из следующих сообщений выложу пример скрипта для создания резервной копии.

суббота, 16 января 2010 г.

При переходе на Windows 7 перестали открываться скрипты в PgAdmin III

Вопрос:
При переходе на Windows 7 возникла проблема с открытием файлов SQL-скриптов в PGAdminIII (верчия 1.10.1). Все скрипты, сделанные в пердыдушей системе Windows XP SP3, перестали открываться. То есть, при попытке открыть файл скрипта содержимое файла не отображается на экране, окно редактирования скрипта остается пустым. При этом вновь созданные файлы скриптов сохраняются и открываются нормально.

Решение:
При сравнении файлов созданных в предыдущей и текущей системе я обратил внимание, что файлы созданные в предыдущей системе, сохранены в кодировке Windows 1251, а файлы созданные в новой системе сохранены в кодировке UNIX UTF8. Для ставнения файлов я использовал редактор Notepad++.
В результате поиска и сравнения настроек PGAdmin III в Windows XP и Windows 7 я обнаружил что решением вопроса является установка значения False для параметра WriteUnicodeFile в ветке реестра HKEY_CURRENT_USER\Software\pgAdmin III. После установки значения стали открываться файлы созданные как в Windows XP так и в Windows 7.

пятница, 1 января 2010 г.

Упрощения языка WiX v3 (перевод)

Ссылка на оригинал сообщения: Simplifying the WiX v3 language

Упрощения языка WiX v3

Два новых изменения, упрощающих работу с WiX, будут доступны в следующем недельном релизе WiX v3. Изменения направлены на упрощение разработки пакетов инсталляции и на уменьшение избыточности.

Атрибут Feature для элемента Component

У элемента Component теперь есть атрибут Feature; при установке этого атрибута, Component становится частью соответствующего Feature. Таким образом, следующие примеры кода эквивалентны:

<Component Id="FooComp" Feature="BarFeature" ... />

и

<Component Id="FooComp" .../>
...
<FeatureRef Id="BarFeature">
  <ComponentRef Id="FooComp"/>
</FeatureRef>

Component/@Feature позволяет указать только один Feature для Component. Для того, чтобы поместить Component в несколько Feature, нужно использовать элемент Feature или FeatureRef и ComponentRef. Добавление атрибута Feature, это всего лишь способ упростить наиболее общий случай помещения одного Component в один Feature.

Значения по-умолчанию для File/@Id и File/@Name из File/@Source

Обычно, при определении элемента File, указывается несколько атрибутов с одинаковыми значениями. Например, значения атрибутов Id, Name и Source включают имя файла. В WiX v3 предусмотрено определение значений по-умолчанию для некоторых атрибутов элемента File, например, значение атрибута Name по-умолчанию определяется значением атрибута Id.

Теперь значение по-умолчанию для атрибута Id определяется именем файла  (без указания пути), указанным в значении атрибута Source. Затем, как сказано выше, значение по-умолчанию для атрибута Name определяется равным значению атрибута Id. Такие правила позволяют определить элемент File следующим образом:

<File Source="$(env.Bits)\foo\bar\baz.exe" />

Эквивалентным определением будет:

<File Id="baz.exe" Name="baz.exe" Source="$(env.Bits)\foo\bar\baz.exe" />

О чем этот блог

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