Python резервное копирование postgresql

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 скрипт, передавая ему параметр — имя базы данных ну и в конце отчитывается администратору на почту о проделанной работе.

Читайте также:  Find version of python library

Имена файлов backup.sh и backup.py соответственно, надо заметить — запускать надо файл backup.py, я добавил его в cron через webmin, запускать нужно от пользователя postgres.

Но вот задача изменилась, надо делать бэкап не с одного сервера, а с нескольких, для этого пришлось чуток поправить Bash скрипт и питон. Раз мы подключаемся к конкретному серверу, нам надо изменить возможность изменения сервера. По этому все что было описано выше — я вынес в функцию и вызываю ее, указывая IP адрес как параметр, учитывая, что у меня на всех серверах одинаковые настройки (я настроил готовую систему и образом разлил на все сервера, поменяв лишь их IP и Hostname), и так, исправленные скрипты:

#!/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")
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

Источник

Backup Postgres Database

This simple Python package allows you to create easily the database backup of Postgres databases. You can upload them to cloud storage buckets by creating a cron job.

  You should have as environment variable DATABASE_URL , which is the URI of the Postgres database. This URI has the following structure: db:engine:[//[user[:password]@][host][:port]/][dbname] .

Can also specify a list of the tables for which you want to create the backup:

This package has proved experience of working well for databases of small-mid size.

Doing this, you make sure you can store your database backups without relying in only one cloud provider or region.

Bucket Storage

Have provided the ability to store those backups in cloud buckets.

Google Cloud Storage

For using this functionality, you need to install the dependencies needed of the package:

 pip3 install This basically will install also the google package.

And then after we have the backup created, we would keep following with:

 Where the google_cloud_certification is a dictionary, with the key-values of the client api keys:
Recommended to provide each key as an environmental variable:
  • GOOGLE_CLOUD_TYPE -> type
  • GOOGLE_CLOUD_PROJECT_ID -> project_id
  • GOOGLE_CLOUD_PRIVATE_KEY_ID -> private_key_id
  • GOOGLE_CLOUD_PRIVATE_KEY -> private_key
  • GOOGLE_CLOUD_CLIENT_EMAIL -> client_email
  • GOOGLE_CLOUD_CLIENT_ID -> client_id
  • GOOGLE_CLOUD_AUTH_URI -> auth_uri
  • GOOGLE_CLOUD_TOKEN_URI -> token_uri
  • GOOGLE_CLOUD_AUTH_PROVIDER_X509_CERT_URL -> auth_provider_x509_cert_url
  • GOOGLE_CLOUD_CLIENT_X509_CERT_URL -> client_x509_cert_url

Moreover PROJECT_NAME and BUCKET_NAME of the google bucket, and finally DATABASE_URL of Postgres database.

In the case that we do not have a bucket already created for storing the backups, we could add additional parameters to create it:

For uploading into AWS after having created the backup, you need first to install the optional dependencies:

 pip3 install After that, you can use the method of upload of the Backup as:
 It requires you to have as environmental variables AWS_SERVER_PUBLIC_KEY , AWS_SERVER_PRIVATE_KEY and REGION_NAME .

Источник

hzbd / postgres_backup

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

#!/usr/bin/env python
import os
import time
username = ‘root’
defaultdb = ‘postgres’
port = ‘5433’
backupdir = ‘/www/backup/’
date = time . strftime ( ‘%Y-%m-%d’ )
#GET DB NAMES
get_db_names = «psql -U%s -d%s -p%s —tuples-only -c ‘\l’ | awk -F\| ‘< print $1 >‘ | grep -E -v ‘(template0|template1|^$)'» % ( username , defaultdb , port )
#MAKE BACKUP OF SYSTEMGRANTS
os . popen ( «pg_dumpall -p%s -g|gzip -9 -c > %s/system.%s.gz» % ( port , backupdir , date ))
#MAKING DB BACKUP
for base in os . popen ( get_db_names ). readlines ():
base = base . strip ()
fulldir = backupdir + base
if not os . path . exists ( fulldir ):
os . mkdir ( fulldir )
filename = «%s/%s-%s.sql» % ( fulldir , base , date )
os . popen ( «nice -n 19 pg_dump -C -F c -U%s -p%s %s > %s» % ( username , port , base , filename ))

Источник

Оцените статью