Резервные копии базыРазработка и доработка

Скрипт на Bash или Python, который делает резервные копии базы MySQL или PostgreSQL и хранит только нужные

Обычно готово за 15 минутДоработки включеныКонтроль качества
Пакеты
Защита оплатыПодробнее
  • Доработки в рамках пакета бесплатны.
  • Если вы не ответите в течение 3 дней после сдачи, работа будет принята автоматически.

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

Скрипт на Bash или Python, который делает резервные копии базы MySQL или PostgreSQL и хранит только нужные

Пример результата

Пример по пакету «Стандарт»

Сводный отчёт в Excel из ежемесячных продаж 9 магазинов

Как его запускают

python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO  Папка: sales/2026-10, найдено файлов: 9
2026-11-02 09:14:03 INFO  shop-01.csv: 1284 строки
2026-11-02 09:14:04 INFO  shop-02.xlsx: 967 строк
2026-11-02 09:14:04 WARN  shop-07.csv: пропущены 3 строки без цены (строки 88, 412, 913)
2026-11-02 09:14:05 INFO  Готово: 10 412 строк -> report-2026-10.xlsx (листы «Продажи» и «Итоги»)

Настройки, а не код

Названия столбцов каждого магазина лежат в settings.ini. Новый магазин или переименованный столбец — это одна строка там:

[columns]
date = Дата, Дата продажи, День
product = Товар, Наименование, Название
quantity = Кол-во, Количество, Шт
price = Цена, Цена за шт

Фрагмент кода

def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
    """Читает файл одного магазина и даёт столбцам названия из отчёта."""
    table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
    renamed = {}
    for name, variants in columns.items():
        found = next((c for c in table.columns if c.strip() in variants), None)
        if found is None:
            raise ReportError(f"{path.name}: нет столбца «{name}» (искали: {', '.join(variants)})")
        renamed[found] = name
    table = table.rename(columns=renamed)[list(columns)]
    table["shop"] = path.stem
    return table

Файлы: ZIP-архив с merge_sales.py (310 строк), settings.ini, requirements.txt и README: как установить Python, как запустить скрипт и что значит каждое сообщение в журнале. Клиент запускает скрипт на своём компьютере.

Клиент: небольшая сеть из 9 магазинов канцтоваров. Каждый магазин присылает продажи за месяц в CSV или Excel, и названия столбцов у всех немного разные. Задача: скрипт, который читает все файлы из папки, приводит столбцы к одному виду и сохраняет один отчёт в Excel: все продажи и отдельный лист с итогами по магазинам.

Клиент и все данные вымышлены.

Об услуге

База без регулярных копий в одном неудачном обновлении или переполненном диске от потери заказов, записей или данных клиентов. Этот скрипт, на Bash или Python, как удобнее для вашего сервера, делает полную выгрузку базы MySQL, MariaDB или PostgreSQL штатными средствами (mysqldump или pg_dump), сжимает её, называет по дате и хранит только те копии, которые велят ваши правила, например 7 ежедневных, 4 еженедельных и 6 ежемесячных; старые удаляются только по этим правилам. Пароль базы вписывается в стандартный файл параметров, который вы заполняете на сервере (.my.cnf или .pgpass), а не в код. Ставите и запускаете скрипт вы на своём сервере, мы на него не заходим. Сначала попробуйте его на тестовой копии и восстановите одну копию в пробную базу, чтобы убедиться, что всё работает.

Что входит

  • Что вы получитеАрхив ZIP со скриптом, README с пошаговой инструкцией и, начиная со «Стандарта», файл настроек с базами, папками и числом хранимых копий; код также виден на странице заказа.
  • Штатные средстваmysqldump или pg_dump, ничего экзотического ставить не нужно
  • Ротация по вашим правиламСтарые копии удаляются только так, как вы задали
  • Пароль не в кодеВ .my.cnf или .pgpass на вашем сервере
  • Сбои заметныНачиная со «Стандарта», неудачная или пустая выгрузка попадает в журнал и не считается копией
  • Понятный кодС комментариями, базу легко добавить потом

Порядок работы

  1. 1
    ЗадачаВы описываете сервер, базы и сколько копий хранить
  2. 2
    КодМы пишем скрипт и инструкцию по установке
  3. 3
    ПроверкаВы запускаете его на тестовой копии и восстанавливаете одну копию в пробную базу
  4. 4
    ПравкиВы просите правки в рамках пакета и присылаете текст ошибки, если она есть

Что нужно от вас

База (MySQL, MariaDB или PostgreSQL) и её версия, система сервера (например, Ubuntu 22.04) и можно ли там ставить пакеты, какого размера база, где хранить копии и сколько там места. Ваши правила ротации: сколько ежедневных, еженедельных и ежемесячных копий хранить. Для «Премиума» второе место для копий и адрес для писем о сбоях. Никогда не присылайте пароли и доступы к серверу.

В брифе мы спросим:

  • Какая база и какого размера?
  • На каком сервере?
  • Сколько копий хранить?
  • Куда класть копии?
  • Bash или Python?

Сравнение пакетов

ПакетыЭкономОдна база16 $СтандартКопии с настройками33 $БизнесПрограмма для копий67 $
Срок1 день2 дня3 дня
Доработки123
Коддо 150 строкдо 400 строкдо 1000 строк
Файлов кода1до 3до 8
Файл настроекНетДаДа
Понятные ошибки и журнал работыНетДаДа
Параметры запуска и инструкция для запуска по расписаниюНетНетДа
Инструкция по установке и запуску (README)ДаДаДа
ЯзыкBash или PythonBash или PythonBash или Python
Заказать ЭкономЗаказать СтандартЗаказать Бизнес

Защита оплаты

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

  • Фиксированная ценаЦена пакета не меняется после оплаты.
  • Деньги резервируютсяПри оплате сумма только резервируется. Сервису она переходит, когда вы примете работу.
  • Проверка перед сдачейКаждый результат проходит проверку качества, прежде чем попасть к вам, и вы видите его на странице заказа до приёмки.
  • Бесплатные доработкиПросите изменения в рамках брифа столько раз, сколько предусмотрено пакетом.
  • Приёмка через 3 дняЕсли в течение 3 дней после сдачи вы не примете работу и не попросите изменений, она будет принята автоматически. Если после сдачи вы напишете в чат заказа, заказ подождёт; ответив, мы можем начать отсчёт 3 дней заново и сообщим об этом в чате.
  • Переделка или полный возвратЕсли результат не соответствует брифу и доработки не помогли или срок превышен больше чем вдвое, напишите в чат заказа: мы переделаем работу или полностью вернём деньги.
Как это работает →

Вопросы и ответы

Он будет удалять старые копии?

Только по вашим правилам, например хранить 7 ежедневных и 4 еженедельные копии, и только в папке, куда сам пишет. Пока правил нет, он хранит всё.

Можно хранить копии не на сервере?

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

Сайт блокируется на время копии?

Для таблиц InnoDB в MySQL и для PostgreSQL выгрузка идёт без остановки сайта. Очень большие базы всё же могут его притормозить, поэтому запускайте копию в спокойные часы.

Вы установите его на мой сервер?

Нет. На ваш сервер мы не заходим. В README показан каждый шаг, от копирования скрипта до добавления в cron («Премиум»).

Не нашли ответ?

Пакеты