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


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

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

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

Оффлайн Azure

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

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6012
  • 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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6012
  • 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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6012
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Конечно, копи-пастить можно бесконечно, но зачем когда придуманы циклы, функции и т.д.?
Код: Bash
  1. # ! /bin/sh
  2. # Зададим переменные
  3.  
  4. DATE=$(date +%Y%m%d)
  5. FTP="192.168.1.88"
  6. FTPU="HurtMe"
  7. FTPP="HurtMe"
  8. 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"
  9. unset FILE_LIST
  10.  
  11. ### Резервное копирование ###
  12. #переходим в директорию, в которую временно попадают бэкапы
  13.  
  14. if cd $(xdg-user-dir DOWNLOAD)/pg_backups
  15. then
  16.   for base in "$BASE_LIST"
  17.   do
  18.     # архивируем базу
  19.     pg_dump -U postgres $base | gzip > $DATE-${base}.pgsql.gz
  20.     # создаем список файлов
  21.     FILE_LIST="${FILE_LIST:+$FILE_LIST }$DATE-${base}.pgsql.gz"
  22.   done
  23.  
  24.   # отправляем файлы на сервер
  25.   ftp -n $FTP <<END
  26.   quote USER $FTPU
  27.   quote PASS $FTPP
  28.   bin #бинарный режим передачи
  29.   put "$FILE_LIST"
  30.   quit
  31.   END
  32.  
  33.   # Желательно бы вставить проверку удачного копирования
  34.   # Проводим очистку
  35.  
  36.   rm -f "$FILE_LIST"
  37.   cd -
  38. else
  39.   echo "Копирование НЕ ВЫПОЛНЕНО: проверте наличие папки $(xdg-user-dir DOWNLOAD)/pg_backups"
  40. fi
  41.  
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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