Возникла острая необходимость перейти на свободное ПО для работы сервера 1С Предприятие, под Windows бэкапил базы MS SQL с помощью bat-скрипта, однако в настоящее время требуется бэкапить PostgreSQL, в принципе это не трудно, я это делал простым Bash скриптом, удобно если баз не сильно много, использовал пока было их штук 5-7, однако количество баз стремительно растет и каждый раз лезть в Bash скрипт - можно, но не зачем. Я за один день добавил консолью администрирования серверов 1с Предприятия около 10 баз, чтобы их корректно создать, при корректировке скрипта резервного копирования всегда можно ошибиться и либо что-то бэкапнуть дважды либо что-то пропустить.
По этому поручим рутину Python, можно было бы и на родном языке - PHP, но пришлось бы ставить немерено пакетов, для Python3 всего один:
pip3 install psycopg2-binary
Однако на чистом питоне я не нашел как без боли сделать дамп, по этому совместил с Bash, собственно Bash скрипт:
#!/bin/sh -e PGPASSWORD=pwd_postgres export PGPASSWORD pathB=/backup dbUser=postgres database=$1 pg_dump -U $dbUser $database | gzip > $pathB/$database.$(date "+%Y-%m-%d").sql.gz
Ранее этот скрипт содержал десятки строк чтобы копировать каждую базу, сейчас он в переменню database принимает имя БД от Python. Скрипт на питоне:
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import os import string import psycopg2 import smtplib con = psycopg2.connect( database="postgres", user="postgres", password="pwd_postgres", host="127.0.0.1", port="5432" ) print("Database opened successfully") cur = con.cursor() cur.execute("SELECT datname FROM pg_database;") rows = cur.fetchall() for i in range(len(rows)): mydbname=rows[i] dbname=mydbname[0] os.system ("/home/user/backup.sh " + dbname) print (dbname) print("Operation done successfully") con.close() msg=""" From: server1c@server1c.ru Subject: Backup Text: Копия успешно создана """ smtpObj = smtplib.SMTP("127.0.0.1", 25) smtpObj.sendmail("send@mail.ru", "you@mail.ru", msg)
Что делает скрипт - подключает необходимые компоненты, подлючается к серверу PostgreSQL, делает запрос и получает список баз данных, перебирает список с ними и запускает bash скрипт, передавая ему параметр - имя базы данных ну и в конце отчитывается администратору на почту о проделанной работе.
Имена файлов backup.sh и backup.py соответственно, надо заметить - запускать надо файл backup.py, я добавил его в cron через webmin, запускать нужно от пользователя postgres.
Но вот задача изменилась, надо делать бэкап не с одного сервера, а с нескольких, для этого пришлось чуток поправить Bash скрипт и питон. Раз мы подключаемся к конкретному серверу, нам надо изменить возможность изменения сервера. По этому все что было описано выше - я вынес в функцию и вызываю ее, указывая IP адрес как параметр, учитывая, что у меня на всех серверах одинаковые настройки (я настроил готовую систему и образом разлил на все сервера, поменяв лишь их IP и Hostname), и так, исправленные скрипты:
Python:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys import os import string import psycopg2 import smtplib def backup(ip="127.0.0.1"): con = psycopg2.connect( database="postgres", user="postgres", password="********", host=ip, port="5432" ) cur = con.cursor() cur.execute("SELECT datname FROM pg_database;") rows = cur.fetchall() for i in range(len(rows)): mydbname=rows[i] dbname=mydbname[0] print (dbname) os.system ("/home/user/backup.sh " + dbname + " " + ip) print ("Done: " + dbname) print("Operation done successfully") con.close() msg=""" From: server1c@install-nt.ru Subject: Backup Text: Копия успешно создана """ smtpObj = smtplib.SMTP('127.0.0.1', 25) smtpObj.sendmail("server1c@yurecnt.ru", "1@yurecnt.ru", msg) backup() backup(ip="192.168.0.166")
Bash:
PGPASSWORD=******** export PGPASSWORD mkdir /mnt/$(date "+%Y-%m-%d") pathB=/mnt/$(date "+%Y-%m-%d") dbUser=postgres database=$1 pg_dump -U $dbUser $database -h $2 | gzip > $pathB/$database.sql.gz
Рейтинг: 15
Обновлено: 09.10.2024