Бэкапалка таблиц mysql 8 через брокер сообщений nats

Overview

nats-mysql-tables-backup

Бэкап таблиц mysql 8 через брокер сообщений nats (проверено и работает в ubuntu 20.04, при наличии python 3.8)

ПРИМЕРЫ: Ниже приводятся примеры, которые приводятся на примере использования набора утилит nats-examples (https://github.com/nats-io/go-nats-examples/releases/download/0.0.50/go-nats-examples-v0.0.50-linux-amd64.zip)


Получение списка ранее созданных файлов архивов резервных копий:

    ./nats-req backup.listbackups "listfiles"

Результат выполнения:

    Published [backup.listbackups] : 'listfiles'
    Received  [_INBOX.NCUWVOrx7SHW05sSy4xVWo.K60eWp7p] : '{"0": "somebackup.7z"}'

В случае невозможности получения списка:

    ./nats-req backup.listbackups "listfiles"

Результат выполнения:

    Published [backup.listbackups] : 'listfiles'
    Received  [_INBOX.Boy8V1VInXgyEl1dkjmpcy.Jisakt3I] : '{}'

^ пустой список


Создание бэкапа:

Создать архив с резервными копиями таблиц можно двумя способами:

  1. При запросе необходимо передать параметр headers={json}, где формат json объекта должен представлять из себя {'tables':'table1,table2...'}.В json объекте передаются имена таблиц, которые необходимо поместить в архив резервной копии. Соответствующий запрос на языке python выглядеть будет так:
nc.request("backup.makebackup", 'makebackup'.encode(), headers={'tables':'table1,table2,table3'})

Формирование подобного запроса на других языках необходимо уточнять.

  1. Список файлов можно передать в сообщении через знак =. К примеру запрос, выполняемый через nats-req:
./nats-req backup.makebackup "makebackup=table1,table2,table3"

Результат выполнения:

Published [backup.makebackup] : 'makebackup=table1,table2,table3'
Received  [_INBOX.GFb3Zj69O4ieT3CTo6NIrs.Nzz5ApkM] : '{"status": "ok", "futurefilename": "/opt/backups/2021-11-28_17-59-19-backup.7z"}'

В случае достижения успешного результата в ответе будет получен json в виде {"status": "ok", "futurefilename": "/opt/backups/2021-11-28_17-59-19-backup.7z"}, где status - ok (процесс был запущен; futurefilename - /opt/backups/2021-11-28_17-59-19-backup.7z (обещаемое имя файла после успешного завершения процесса резервного копирования)).

В случае краха процесса будет возвращён json в виде {'status':'bad','futurefilename':''}, где status - bad (ой всё плохо); futurefilename - '' (пустая строка с обещанным файлом). Процесс создания архива производится в отдельном потоке, дабы быстрее отдать статус запрашиваемому, не удерживая соединения (дабы не отвалилось по таймауту).


Получение содержимого архива резервной копии:

Получить можно двумя способами:

  1. Разместить имя запрашиваемого архива в заголовке headers в теле запроса. Пример на языке python ниже, для остальных языков необходимо уточнение:
nc.request("backup.archive", 'archive'.encode(), headers={'archivename':'2021-11-28_20-30-39-backup.7z'})
  1. Разместить имя архива в теле сообщения через знак =. Пример с клиентом nats-req:
./nats-req backup.archive "archivename=wrong.7z"

В случае успешного получения информации будет возвращён список файлов, содержащихся в архиве. Пример:

./nats-req backup.archive "archivename=2021-11-28_20-30-39-backup.7z"
Published [backup.archive] : 'archivename=2021-11-28_20-30-39-backup.7z'
Received  [_INBOX.RJtuKZcqC65JAEWy8gMV6A.RQ5cYzMA] : '{"2021-11-28_20-30-39-backup.7z": "table1.sql,table2.sql,table3.sql"}'

В случае если архив невозможно прочитать (его не существует, он повреждён или он не является 7z архивом) будет возвращено:

./nats-req backup.archive "archivename=2021-11-28_20-30-39-backupf.7z"
Published [backup.archive] : 'archivename=2021-11-28_20-30-39-backupf.7z'
Received  [_INBOX.CnPNfscvrTQjoMlakfzVJe.15UZxvuk] : '{"2021-11-28_20-30-39-backupf.7z": "bad"}'

Восстановление таблиц в БД из резервных копий

Восстановить таблицы возможно двумя способами:

  1. Разместить имя запрашиваемого архива и перечень таблиц, необходимых для восстановления в заголовке headers. Пример на языке python, для остальных языков необходимо уточнять:
nc.request("backup.restore", 'archive'.encode(), headers={'archivename':'2021-11-28_23-49-44-backup.7z','tables':'table1.sql,table2.sql,table3.sql'})
  1. Разместить имя архива и имена таблиц в теле сообщения. В качестве разделителя между именем файла и перечнем таблиц служит - ; , а для указания имени архива и имён таблиц - = . Пример с клиентом nats-req:
./nats-req backup.restore "archive=2021-11-28_23-49-44-backup.7z;tables=table1.sql,table2.sql,table3.sql"

Восстановление производится в отдельном потоке, т.к. процесс может занять приличное время, поэтому ответ производится как можно раньше. В случае успешного запуска процесса восстановления будет получено (пример):

">
Received  [_INBOX.tNRLxow09f16DSeyRXYf6A.tNRLxow09f16DSeyRXYfAG]: '{"status": "ok"}'

   

   
./nats-req backup.restore "archive=2021-11-28_23-49-44-backup.7z;tables=table1.sql,table2.sql,table3.sql"
Published [backup.restore] : 'archive=2021-11-28_23-49-44-backup.7z;tables=table1.sql,table2.sql,table3.sql'
Received  [_INBOX.Y3K4HT267jQS6xDsI26F3z.6oVGfVpL] : '{"status": "ok"}'

В случае невозможности восстановления в выводе будет фигурировать {'status':'bad'}. Пример:

./nats-req backup.restore "archive=2021-11-28_23-49-44-backup.7z;tables=table1.sql,table2.sql,table3.sqld"
Published [backup.restore] : 'archive=2021-11-28_23-49-44-backup.7z;tables=table1.sql,table2.sql,table3.sqld'
Received  [_INBOX.DzRdPAG7u1Ew3ueQ8M6b0C.lOgyRqBl] : '{"status": "bad"}'

При использовании, в коде где будет использоваться данное решение лучше прописать исключение, что может быть получено что то неожиданное в плане вывода.

You might also like...
Django-MySQL extends Django's built-in MySQL and MariaDB support their specific features not available on other databases.
Django-MySQL extends Django's built-in MySQL and MariaDB support their specific features not available on other databases.

Django-MySQL The dolphin-pony - proof that cute + cute = double cute. Django-MySQL extends Django's built-in MySQL and MariaDB support their specific

Created covid data pipeline using PySpark and MySQL that collected data stream from API and do some processing and store it into MYSQL database.
Created covid data pipeline using PySpark and MySQL that collected data stream from API and do some processing and store it into MYSQL database.

Created covid data pipeline using PySpark and MySQL that collected data stream from API and do some processing and store it into MYSQL database.

A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.
A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.

mycli A command line client for MySQL that can do auto-completion and syntax highlighting. HomePage: http://mycli.net Documentation: http://mycli.net/

Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).
Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

AWS Data Wrangler Pandas on AWS Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretMana

MySQL database connector for Python (with Python 3 support)

mysqlclient This project is a fork of MySQLdb1. This project adds Python 3 support and fixed many bugs. PyPI: https://pypi.org/project/mysqlclient/ Gi

Pure Python MySQL Client

PyMySQL Table of Contents Requirements Installation Documentation Example Resources License This package contains a pure-Python MySQL client library,

a small, expressive orm -- supports postgresql, mysql and sqlite
a small, expressive orm -- supports postgresql, mysql and sqlite

peewee Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use. a small, expressive ORM p

aiomysql is a library for accessing a MySQL database from the asyncio

aiomysql aiomysql is a "driver" for accessing a MySQL database from the asyncio (PEP-3156/tulip) framework. It depends on and reuses most parts of PyM

Flask + Docker + Nginx + Gunicorn + MySQL + Factory Method Pattern

This Flask project is reusable and also an example of how to merge Flask, Docker, Nginx, Gunicorn, MySQL, new: Flask-RESTX, Factory Method design pattern, and other optional dependencies such as Dynaconf, Marshmallow, SQLAlchemy, Faker, PyMySQL, Pytest, etc... which are installed inside the virtual environment "env_flask".

a small, expressive orm -- supports postgresql, mysql and sqlite
a small, expressive orm -- supports postgresql, mysql and sqlite

peewee Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use. a small, expressive ORM p

MySQL database connector for Python (with Python 3 support)

mysqlclient This project is a fork of MySQLdb1. This project adds Python 3 support and fixed many bugs. PyPI: https://pypi.org/project/mysqlclient/ Gi

Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).
Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

AWS Data Wrangler Pandas on AWS Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretMana

🍯 16 honeypots in a single pypi package (DNS, HTTP Proxy, HTTP, HTTPS, SSH, POP3, IMAP, STMP, VNC, SMB, SOCKS5, Redis, TELNET, Postgres & MySQL)
🍯 16 honeypots in a single pypi package (DNS, HTTP Proxy, HTTP, HTTPS, SSH, POP3, IMAP, STMP, VNC, SMB, SOCKS5, Redis, TELNET, Postgres & MySQL)

Easy to setup customizable honeypots for monitoring network traffic, bots activities and username\password credentials. The current available honeypot

python fastapi example  connection to mysql
python fastapi example connection to mysql

Quickstart Then run the following commands to bootstrap your environment with poetry: git clone https://github.com/xiaozl/fastapi-realworld-example-ap

A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.
A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.

mycli A command line client for MySQL that can do auto-completion and syntax highlighting. HomePage: http://mycli.net Documentation: http://mycli.net/

The ormar package is an async mini ORM for Python, with support for Postgres, MySQL, and SQLite.

python async mini orm with fastapi in mind and pydantic validation

MySQL Operator for Kubernetes

MySQL Operator for Kubernetes The MYSQL Operator for Kubernetes is an Operator for Kubernetes managing MySQL InnoDB Cluster setups inside a Kubernetes

Add a Web Server based on Rogue Mysql Server to allow remote user get
Add a Web Server based on Rogue Mysql Server to allow remote user get

介绍 对于需要使用 Rogue Mysql Server 的漏洞来说,若想批量检测这种漏洞的话需要自备一个服务器。并且我常用的Rogue Mysql Server 脚本 不支持动态更改读取文件名、不支持远程用户访问读取结果、不支持批量化检测网站。于是乎萌生了这个小脚本的想法 Rogue-MySql-

Class to connect to XAMPP MySQL Database

MySQL-DB-Connection-Class Class to connect to XAMPP MySQL Database Basta fazer o download o mysql_connect.py e modificar os parâmetros que quiser. E d

Owner
Constantine
Constantine
Library management using python & MySQL

Library management using python & MySQL Dev/Editor: Pavan Ananth Sharma & MK Akash Introduction: This is an intermediate project which is a user-frie

Pavan Ananth Sharma 2 Jul 5, 2022
An example of Connecting a MySQL Database with Python Code

An example of Connecting a MySQL Database with Python Code And How to install Table of contents General info Technologies Setup General info In this p

Mohammad Hosseinzadeh 1 Nov 23, 2021
An example of Connecting a MySQL Database with Python Code

An example of Connecting And Query Data a MySQL Database with Python Code And How to install Table of contents General info Technologies Setup General

Mohammad Hosseinzadeh 1 Nov 23, 2021
This is a menu driven Railway Reservation Project which is mainly based on the python-mysql connectivity.

Online-Railway-Reservation-System This is a menu driven Railway Reservation Project which is mainly based on the python-mysql connectivity. The projec

Ananya Gupta 1 Jan 9, 2022
Registro Online (100% Python-Mysql)

Registro elettronico scritto in python, utilizzando database Mysql e Collegando Registro elettronico scritto in PHP

Sergiy Grimoldi 1 Dec 20, 2021
A basic DIY-project made using Python and MySQL

Banking-Using-Python-MySQL This is a basic DIY-project made using Python and MySQL. Pre-Requisite needed:-->> MySQL command Line:- creating a database

ABHISHEK 0 Jul 3, 2022
Simple Crud Python vs MySQL

Simple Crud Python vs MySQL The idea came when I was studying MySQ... A desire to create a python program that can give access to a "localhost" databa

Lucas 1 Jan 21, 2022
MySQL Connectivity based project. Contains various functions of a Store-Management-System

An Intermediate Level Python - MySQL Connectivity based project. Contains various functions of a Store-Management-System.

Yash Wadhvani 2 Nov 21, 2022
Password manager using MySQL and Python 3.10.2

Password Manager Password manager using MySQL and Python 3.10.2 Installation Install my-project with github git clone https://github.com/AyaanSiddiq

null 1 Feb 18, 2022
An alternative to OpenFaaS nats-queue-worker for long-running functions

OpenFaas Job Worker OpenFaas Job Worker is a fork of project : OSCAR Worker - https://github.com/grycap/oscar-worker Thanks to Sebástian Risco @srisco

Sebastien Aucouturier 1 Jan 7, 2022