Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: PostgreSQL алиас на создание архивированных дампов (pg_dump)  (Прочитано 1251 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн p1ter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
  • антихристарадибÖга
    • Просмотр профиля
Добрый день.
Прошу помощи.
Пришло мне в голову написать алиас в /etc/bash.bashrc (Ubuntu 12.04.5 LTS x86_64. PostgreSQL@Etersoft 9.0.4)
Алиас, который делает архив из дампа одной из баз выглядит следующим образом:
alias pgd='pg_dump -U postgres dev_db8n_zup | gzip > /home/p1ter/Downloads/pg_dump/dev_db8n_zup.pgsql.backup.gz'
Баз, на самом деле 10, и хотелось бы написать алиас, который поочередно делал бы дампы каждой из баз, так же в названии файла была бы дата/время дампа.
Не исключаю, что ход моих мыслей направлен в ложном направлении. Прошу наставлений и помощи.
красная вода, чужая беда

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Что мешает прописать цикл
Код: (text) [Выделить]
alias pgd='for base in список_баз_через_пробел ; do pg_dump -U postgres "$base" | ... /$(date +%Y-%m-%d)${base}.pgsql.backup.gz ; done'А ещё лучше впихнуть это всё в скрипт и поставить в cron для того чтоб выполнялось автоматом по расписанию
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
.ubuntufan,
Тогда не $1 а $@
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
.ubuntufan,
Вот и неправда Ваша. В alias так список переменных не передается, это не скрипт. А то что у Вас работает приведенный пример, то это из-за того что $1 == пусто, таким образом (alias zz="echo $1") == (alias zz="echo") (тем более в двойных кавычках сразу идет замена $1). Можете проверить alias zzВ данной ситуации проще всего написать скрипт (или определить функцию), но тогда и нет смысла в использовании alias'a.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Ок, тут не поспоришь.

cd ~
vim ./<scriptname>

#!/bin/bash

for base in $@ ; ... done

chmod a+x ./<scriptname>
echo "alias pgd='~/<scriptname>'" >> ~/.bashrc

Заодно и в кронтаб повесить можно будет
« Последнее редактирование: 09 Сентября 2014, 16:56:31 от .ubuntufan »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
И кстати сам ~/.bashrc рекомендует хранить alias'ы в отдельном файле ~/.bash_aliases и добавлена процедура считывания такого файла
Цитировать
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
Ну и ИМХО: если уже создавать скриптовый файл то не делать алиас, а проще ссылку на него например в /usr/binsudo ln -s ~/<scriptname> /usr/bin/pgd
« Последнее редактирование: 09 Сентября 2014, 17:14:50 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Цитировать
Ну и ИМХО: если уже создавать скриптовый файл то не делать алиас, а проще ссылку на него например в /usr/bin

Согласен, ну тогда уж переместить а не ссылку создавать из каталога одного из пользователей.

Оффлайн p1ter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
  • антихристарадибÖга
    • Просмотр профиля
Спасибо за живое обсуждение.
Решил вопрос следующим образом.
Написал переделал скрипт /etc/pgsql-backup

(Нажмите, чтобы показать/скрыть)

Это, конечно, не алиас, но засунутый в crontab скрипт отрабатывает. Файлы оказываются на другом сервере.
Но не все так хорошо, как хотелось бы. Неприятной неожиданностью оказалось то, что архивы "повреждены" =-(
Залитые на ftp (FileZilla server 0.9.46 крутиться на W2008R2 Std sp1) архивы не открываются ни одним из архиваторов.
7zip пишет "Ошибка в данных '20140910-dev_db8n_buh.pgsql.gz'. Файл испорчен" и так по любому из 8 архивов.

# gunzip 20140910-prd_db8n_ziup_v.pgsql.gz
gzip: 20140910-prd_db8n_ziup_v.pgsql.gz: invalid compressed data--format violated

gzip -t возвращает так же "invalid compressed data--format violated"

Если распаковывать архивы до их передачи на фтп, все распаковывается красиво.

Пользователь решил продолжить мысль [time]10 Сентябрь 2014, 16:17:40[/time]:
Пробовал лить на другую машину с w2008r2 Std sp1, и на 2003. Результат идентичный.

Пользователь решил продолжить мысль 10 Сентября 2014, 16:51:27:
Если архивы бэкапов лить с помощью mc, то на ftp они в итоге нормально распаковываются.
Нашел упоминание про режим передачи "Раньше главной проблемой было закачка бинарных файлов в txt-mode". Похоже, что это про данную ситуацию.

Подскажите, пожалуйста, как указать скрипту бинарный решим передачи явно?
« Последнее редактирование: 10 Сентября 2014, 16:51:27 от p1ter »
красная вода, чужая беда

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Цитировать
ftp> binary
Changes to "binary" mode for transferring all files that are not text files.

P.S. Думаю вам пригодится: http://www.cyberciti.biz/faq/bash-for-loop/

Оффлайн p1ter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 39
  • антихристарадибÖга
    • Просмотр профиля
Спасибо. Тоже нашел

Пользователь решил продолжить мысль 10 Сентября 2014, 17:16:34:
Итоговый вид скрипта
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 10 Сентября 2014, 17:16:34 от p1ter »
красная вода, чужая беда

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Конечно, копи-пастить можно бесконечно, но зачем когда придуманы циклы, функции и т.д.?
Код: (bash) [Выделить]
# ! /bin/sh
# Зададим переменные

DATE=$(date +%Y%m%d)
FTP="192.168.1.88"
FTPU="HurtMe"
FTPP="HurtMe"
BASE_LIST="dev_db8n_buh dev_db8n_zup prd_db8n_buh_ab prd_db8n_buh_v prd_db8n_buh_v2 prd_db8n_ziup_ab db8n_ziup_v db8n_ziup_v2"
unset FILE_LIST

### Резервное копирование ###
#переходим в директорию, в которую временно попадают бэкапы

if cd $(xdg-user-dir DOWNLOAD)/pg_backups
then
  for base in "$BASE_LIST"
  do
    # архивируем базу
    pg_dump -U postgres $base | gzip > $DATE-${base}.pgsql.gz
    # создаем список файлов
    FILE_LIST="${FILE_LIST:+$FILE_LIST }$DATE-${base}.pgsql.gz"
  done

  # отправляем файлы на сервер
  ftp -n $FTP <<END
  quote USER $FTPU
  quote PASS $FTPP
  bin #бинарный режим передачи
  put "$FILE_LIST"
  quit
  END

  # Желательно бы вставить проверку удачного копирования
  # Проводим очистку

  rm -f "$FILE_LIST"
  cd -
else
  echo "Копирование НЕ ВЫПОЛНЕНО: проверте наличие папки $(xdg-user-dir DOWNLOAD)/pg_backups"
fi
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.068 секунд. Запросов: 25.