YurecNT

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

бэкап баз postgresql на python

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

Информация об авторе

Евдокимов Юрий Владимирович

Я начал свою карьеру программистом в возрасте около 17 лет.

Изначально я хотел стать электриком, но что-то пошло не так - мне подарили первый компьютер... не рабочий... Сказали починишь - п ....

Администратор сайта


Все статьи автора

Благодарности: 1

Рейтинг: 2

Поддержать автора


СБП (Сбер) 9221301778

Самое читаемое:
Все о загрузочных флешках, дисках и ссд
Все о загрузочных флешках, дисках и ссд
Загрузимся хоть с загрузочного ....
14.09.2024
Публикация базы данных 1С
Публикация базы данных 1С
Не большой мануал по настройке ....
09.09.2023
Бесплатные программы для работы с разделами жесткого диска
Бесплатные программы для работы с разделами жесткого диска
краткий обзор бесплатных прогр ....
17.05.2024
Windows XP SP 2 слетел драйвер дисковода CD/DVD (2015 г.)
Windows XP SP 2 слетел драйвер дисковода CD/DVD (2015 г.)
И такое бывало.... мало ли, пу ....
16.05.2024
Windows 3.11 - полный дистрибутив!
Windows 3.11 - полный дистрибутив!
старые окна ....
03.09.2023
Не Play Market-ом единым
Не Play Market-ом единым
Свободное ПО для Android ....
04.11.2023
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формат ....
16.05.2024
Как сбросить пароль Windows 7-10
Как сбросить пароль Windows 7-10
Входим в нее...... ....
17.08.2024
Установка OwnCloud на Linux Debian 11 или 12
Установка OwnCloud на Linux Debian 11 или 12
Отличное облачное решение для ....
17.05.2024
Frontol XPOS Настройка копии чека
Frontol XPOS Настройка копии чека
FrontolXPOS - настраиваем печа ....
16.05.2024
Простое лимитирование дискового пространства Linux
Простое лимитирование дискового пространства Linux
Разделяй и влавствуй над диско ....
09.10.2024
Убираем из адресной строки www
Убираем из адресной строки www
убираем зеркала сайтов исключа ....
13.08.2023
Многофункциональный обработчик кнопок JQuery
Многофункциональный обработчик кнопок JQuery
Многофункциональный обработчик ....
13.08.2023
В браузерах лезет реклама
В браузерах лезет реклама
Убираем рекламные вирусы ....
01.01.1970
Обновляем Debian с 11 на 12!
Обновляем Debian с 11 на 12!
Обновляем операционку почти бе ....
16.05.2024
Как разблокировать системный реестр Windows
Как разблокировать системный реестр Windows
Если нельзя, но очень хочется ....
16.05.2024
Windows PE
Windows PE
Спасение утопающих в руках уто ....
28.09.2024
QBasic 4.5
QBasic 4.5
Древние языки ....
13.09.2024
Брут http-авторизации на PHP
Брут http-авторизации на PHP
Взлом HTTP-авторизации ....
09.10.2024
Программы восстановления удаленных файлов
Программы восстановления удаленных файлов
Реанимируем почти убитое ....
16.05.2024
LanScope 2.9.1
LanScope 2.9.1
Простая программа для сканиров ....
11.08.2023
Опыт заработка на сайте
Опыт заработка на сайте
Можно ли нормально заработать ....
25.01.2023
Установка Debian и Ubuntu по сети через PXE
Установка Debian и Ubuntu по сети через PXE
бездисковая установка линукс! ....
16.05.2024
Как установить mod_rewrite
Как установить mod_rewrite
Всякие редиректы и ЧПУ ....
16.05.2024
Настройка spamassassin для работы с MySQL
Настройка spamassassin для работы с MySQL
Боремся со спамом ....
01.01.1970
Бесплатный SSL-сертификат и настройка Nginx
Бесплатный SSL-сертификат и настройка Nginx
Бесплатные ssl сертификаты ....
16.05.2024
Ускорение работы сайта
Ускорение работы сайта
Ускоряем сайт с помощью настро ....
26.05.2024
Python - самообучающийся чат-бот для Телеграмм
Python - самообучающийся чат-бот для Телеграмм
скачать бесплатно бота для тел ....
16.05.2024
PHP-скрипт антибот
PHP-скрипт антибот
Не даем шерстить сайт вредным ....
16.05.2024