Python и не большие данные - бэкап PostgreSQL

Возникла острая необходимость перейти на свободное ПО для работы сервера 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

Комментарии

Дорогие посетители моего сайта, подпишитесь на мой канал в Дзене! Это стимулирует меня писать новые и новые познавательные статьи!