Category Archive: Скрипты

Бэкапирование базы данных PostgreSQL

Все мы знаем, что нужно периодически делать резервные копии баз данных.

И почему-то делаем это только для боевых баз данных, но не для тестовых.

Хотя потеря тестовых данных тоже критична, т.к. на восстановление данных может уйти достаточное количество времени.

База данных может повредиться по многим причинам.

Например, операции update или delete с некорректным условием и вообще без условия, каскадные удаления и т.д.

Ниже будет приведен скрипт, который делает следующие операции:

  1. Создает копию указанной базы данных
  2. Упаковывает копию в zip-архив
  3. Удаляет копию для экономии места
Создайте скрипт backup.sh со следующим содержимым
if [ -z "$1" ]; then
	echo "Error! Please select database."
	echo "Example:"
	echo "         $0 <YOUR_DATABASE>"
	exit 1
fi
DB_NAME=$1
BACKUP_DIR="/root/scripts/"
DUMP_NAME="$BACKUP_DIR$DB_NAME.dump"
ZIP_NAME="$BACKUP_DIR$DB_NAME.zip"
echo "DB_NAME   : $DB_NAME"
echo "BACKUP_DIR: $BACKUP_DIR"
echo "DUMP_NAME : $DUMP_NAME"
echo "ZIP_NAME  : $ZIP_NAME"
 
sudo -u postgres pg_dump $DB_NAME > $DUMP_NAME \
        && zip $ZIP_NAME $DUMP_NAME \
        && rm $DUMP_NAME

BACKUP_DIR - путь к директории, где планируется хранить резерные копии баз данных.

Не забудьте дать скрипту право на исполнение (executable):

chmod +x backup.sh

Скрипту передается название базы данных следующим образом:

./backup.sh <your_database>

Скрипт можно доработать под ваши нужны.

Добавить дополнительное копирование на другой сервер.

Изменить способ сжатия копий. Например, для сжатия больших файлов использовать 7-Zip.

Теперь сделаем запуск скрипта ежедневно в 4 утра.

Выполните команду:

sudo crontab -e

Обратите внимание, что скрипт запускается через sudo. Это сделано чтобы скрипт запускался от имени администратора, иначе вы настроите запуск от текущего пользователя. Добавьте следующую запись:

0 4 * * * /your_path/backup.sh 
Скрипт восстановления из бэкапа:
psql your_database < your_database.dump

p.s. Поменьше вам восстанавливаться из бэкапов =)

Удаление временно ненужных файлов

В очередной раз у разработчика закончилось место на жестком диске и начинается головоломка: "Что почистить?"

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

Внимание все операции нужно делать с осторожностью, чтобы не удалить ничего лишнего!

Рассмотрим очистку места на примере удаления директорий build и node_modules.

Для начала просканируем директории на наличие build и node_modules:

find . -name build -type d -maxdepth 2
find . -name node_modules -type d -maxdepth 2

maxdepth - максимальная глубина сканирования

Следующим шагом вычисляем размеры найденных директорий и анализируем:

find . -name build -type d -maxdepth 2 -exec du -sh {} \;
find . -name node_modules -type d -maxdepth 2 -exec du -sh {} \;

Далее генерируем скрипты удаления директорий (это еще не удаление, а echo):

find . -name build -type d -maxdepth 2 -exec echo rm -rf {} \;
find . -name node_modules -type d -maxdepth 2 -exec echo rm -rf {} \;

Внимание все операции нужно делать с осторожностью, чтобы не удалить ничего лишнего!

Теперь можно взять сгенерированные скрипты и выполнить их все или точечно.

Место свободно!

Бэкапирование

В прежние времена я часто занимался автоматизацией бэкапирования, т.е. создания резервной копии баз данных, файлов и т.д.. Сейчас таких задач у меня не возникает, но все же решил написать о том, как писать такие скрипты. Перечислим базовые шаги алгоритма скрипта:
  1. Выбрать директорию, где храняться резервные копии
  2. Снять резервную копию базы данных
  3. Сжать файлы с помощью архиватора и присвоить удобное наименование архиву
  4. Добавить скрипт в планировщик и установить время и периодичность запуска
Рассмотрим версии скрипта для Windows и для Linux.

Генерация Java-классов Web-сервиса по WSDL

Допустим, у вас есть WSDL и вы хотите написать либо сам веб-сервис, либо клиента для сервиса. Для этого по WSDL нужно сгенерировать Java-классы с помощью утилиты wsimport, входящую в состав JDK. Стоит отметить, что сгенерированный код может использовать и на сервере, и на клиенте. Создайте новую папку и положите в нее вашу WSDL и всё, что к ней относится (это может быть другие WSDL или XSD). Увидеть все, что импортирует ваша основная WSDL можно в теге import. Например:
<xsd:import namespace="http://www.kesh.kz/blog/v1" 
schemaLocation="http://123.45.678.90:8080/kesh/example.xsd"/>
В данном примере следует заменить интернет адрес XSD на локальный:
<xsd:import namespace="http://www.kesh.kz/blog/v1" 
schemaLocation="example.xsd"/>
Разумеется, файл example.xsd должен лежать c WSDL в одной директории. Теперь напишем скрипт для генерирования классов. Рассмотрим сперва Windows-версию скрипта, а потом Linux-версию. Скрипт для Windows Создайте файл w-gen.bat в любом текстовом редакторе и скопируйте в него следующий код:
cls
set GEN_DIR=kz
rmdir %GEN_DIR% /s/q
"%JAVA_HOME%/bin/wsimport" -keep -Xnocompile -p kz.kesh.blog.v1 myBlog.wsdl
pause
cls - очистка консоли GEN_DIR - директория пакета верхнего уровня rmdir - полное удаление директории wsimport - утилита для генерации Java-классов из WSDL keep - сохраняет сгенерированные файлы Xnocompile - не компилирует сгенерированные Java-файлы kz.kesh.blog.v1 - имя пакета, в котором будет сгенерированые классы myBlog.wsdl - наша WSDL pause - пауза, чтобы консольное окно сразу не закрылось Данный скрипт генерирует *.java файлы, но вы можете немного переработать скрипт и генерировать скопилированные файлы *.class. Так же вы можете доработать упаковку файлов и WSDL в jar. Например:
"%JAVA_HOME%/bin/jar" cf keskBlog.jar kz
jar - стандартная утилита из JDK для создания jar-файлов cf - создает новый архив с указанным именем keskBlog.jar - имя вашего jar-файла kz - директория, которая упаковывается в jar, она соответствует названию верхнего пакета Скрипт для Linux Создайте файл w-gen.sh:
#!/bin/bash
GEN_DIR="kz"
rm -r $GEN_DIR
wsimport -keep -Xnocompile -p kz.kesh.blog.v1 myBlog.wsdl
Не забудьте дать скрипту права на выполенение:
chmod +x w-gen.sh
#!/bin/bash - обязательная строчка для bash-скриптов GEN_DIR - директория пакета верхнего уровня rm - рекурсивное удаление директории wsimport - утилита для генерации Java-классов из WSDL keep - сохраняет сгенерированные файлы Xnocompile - не компилирует сгенерированные Java-файлы kz.kesh.blog.v1 - имя пакета, в котором будет сгенерированы классы myBlog.wsdl - наша WSDL

Создание резервной копии директорий (WinRAR)

Иногда возникает необходимость в создании полной резервной копии какой-нибудь директории. Можно, конечно, каждый раз вручную архивировать папку, присваивая название архиву и проставляя номер или дату резервной копии. Но это быстро надоедает. Предлагаю написать скрипт(bat), который будет автоматизировать эту работу. Допустим, есть директория D:\Projects\ProjectX, для которой нужно сделать резервную копию, заархивировав WinRAR'ом. Название архива будет содержать, кроме названия, еще и дату создания. Для этого нужно выполнить следующие шаги:
  1. Создадим любым текстовым редактором файл с названием projectx.bat. Желательно создать специальную директорию для хранения подобных скриптов (Например, D:\Scripts\backups)
  2. Вставьте следующий код в файл
    cls
    set rar="C:\Program Files\WinRAR\Rar.exe"
    set source_dir="D:\Projects\ProjectX"
    set backup_dir="D:\Backup\ProjectX\projectx_"
    %rar% a -r -ep1 -agYYYY-MM-DD[HHMM] %backup_dir% %source_dir%
    cls - необязательная команда, которая очищает консоль
  3. Переменная rar хранит полный путь к утилите rar.exe Переменная source_dir хранит полный путь к директории, для которой создается резервная копия Переменная backup_dir содержит путь до директории, где хранятся резерный копии(D:\Backup\), поддиректории (ProjectX) и префикса названия файла архива (projectx_) Теперь рассмотрим параметры архивирования, которые мы передаем утилите rar.exe: a - команда, указывающая на добавление файлов в архив -ep1 - опция, которая позволяет исключить базовый путь из имен файлов, но сохраняет внутреннюю иерархию директории -agYYYY-MM-DD[HHMM] - генерирует название файла на основе текущей даты и времени Последние два параметра передаваемые утилите - это путь до архива (backup_dir) и архивируемая директория (source_dir).
Теперь рассмотрим все в картинках: Директория для архивирования: pic1 Запускаемый скрипт: pic2 Директория с резервными копиями: pic3 Содержимое архива: pic4 Содержимое директории: pic5 Почему лучше использовать абсолютные пути в скрипте? Во-первых, это позволит хранить скрипты в одном месте, а резервные копии в другом. Во-вторых, можно запускать скрипты из любого места, не заботясь о текущей директории. Созданный нами скрипт можно запускать по мере необходимости или запускать планировщиком по расписанию. Если всё же решили использовать в скрипте относительные пути, то при создании задания в планировщике не забудьте указать рабочую директорию скрипта.