Evgenii Legotckoi
Evgenii Legotckoi9. August 2018 04:29

Bash-Skript zum Erstellen und Herunterladen eines Dumps einer Datenbank und Mediendateien von einem Remote-Server

Bei der Entwicklung einer Seite auf Django musste ich mich mit Bash-Skripten auseinandersetzen, um Routineaufgaben zu automatisieren. Beispielsweise das Erstellen und Herunterladen eines Datenbank-Dumps von einer Website sowie das Sichern von Mediendateien.

Wir gehen davon aus, dass Sie bereits Zugriff auf den Server via ssh haben und Ihr Benutzer auf dem Server, der die Site verwaltet, Zugriffsrechte hat, mit denen er einen Datenbank-Dump erstellen kann .


Verzeichnisstruktur des Skripts

Um eine Sicherung von Mediendateien und einen Datenbank-Dump durchzuführen, müssen Sie mehrere Skripte schreiben:

  • Hauptskript
  • Skript zum Erstellen eines Speicherauszugs, der auf einem entfernten Server ausgeführt wird
  • Skript zum Löschen eines Dumps auf einem Remote-Server, um keinen wertvollen Speicherplatz zu verschwenden

Die Struktur wird wie folgt sein

./remote-scripts/create_dump.sh
./remote-scripts/remove_dump.sh
./backup.sh

create_dump.sh

Wenn sich ein Benutzer am Server anmeldet, befindet er sich in seinem Home-Verzeichnis. Daher schreiben wir Skripte basierend auf der Tatsache, dass wir uns in diesem Home-Verzeichnis befinden.

#!/bin/bash

# Запомним время создания дампа
current_date=$(date +"%Y_%m_%d_%H:%M:%S")

# Создадим директорию, куда сохраним дамп
mkdir db_dumps 
# создадим дамп
pg_dump database_name > ~/db_dumps/db_$current_date
# отключимся от сервера
exit

Ich erstelle ein Verzeichnis für den Dump, weil es für das Skript einfacher ist, rsync aufzurufen, füge einfach den gesamten Dump in ein Verzeichnis zusammen und das war's. In diesem Fall werden andere Dump-Versionen, die wir zuvor heruntergeladen haben, nicht gelöscht, auch wenn sie nicht im Verzeichnis db_dumps vorhanden sind.

remove_dump.sh

Skript zum Löschen eines Dumps von einem Remote-Server

#!/bin/bash

# удалим директорию с дампом базы данных
rm -rf db_dumps
# отключимся от сервера
exit

backup.sh

Und jetzt ist es Zeit für das wichtigste Drehbuch, das alles zusammenbringen wird.

#!/bin/bash

# Пути к скриптам
REMOTE_SCRIPTS_PATH="remote-scripts"
SCRIPT_PATH_CREATE_DUMP="create_dump.sh"
SCRIPT_PATH_REMOVE_DUMP="remove_dump.sh"

# Создадим дампа базы данных
ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"

# Скачаем дамп в каталог backup
rsync -av --progress username@111.222.333.444:~/db_dumps ~/backup

# Скачаем медиа файлы в каталог backup
rsync -av --progress username@111.222.333.444:~/virtual_env/yourproject/media ~/backup

# Удалим дамп с удалённого сервера
ssh username@111.222.333.444  'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_REMOVE_DUMP"

In diesem Fall verbinden wir uns per ssh mit dem Benutzernamen und der IP-Adresse des Servers.

Diese Zeile sendet das create_dump.sh-Skript von Ihrem lokalen PC zur Ausführung auf einem Remote-Server

ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP"
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

A
  • 10. August 2018 02:05

Приветствую! а почему pg_dump, а не Django'вское dumpdata?

Evgenii Legotckoi
  • 10. August 2018 04:09

Добрый день!

Основной причиной я бы назвал то, что даже не обратил внимания на данный функционал в Django, как-то мимо прошло это. А потому, что сразу привык использовать функционал самой базы данных, да и нет необходимости дампить по отдельности приложения. Для бэкапа мне всё равно нужна вся база данных.



A
  • 10. August 2018 04:46

так ./manage.py dumpdata > db.json дампит всю бд. но привычка это да, согласен

A
  • 10. August 2018 04:54

не нашел как редактировать комент...

я на баше не писатель, поэтому у меня так:
#!/bin/bash
echo "Backup started"
date
cd /.
cd /home/user
source env/bin/activate
cd django-project/src
backup_file="production.json"
time_stamp=$(date +%d%m%g%H%M%S)
archive_file="$production_$time_stamp.zip"
python manage.py dumpdata --exclude auth.permission --exclude contenttypes > production.json
zip $archive_file /home/user/django-project/src/production.json
echo
echo "Backup finished"

ну и потом крон.
и да, из такого бэкапа я восстанавливался.
Evgenii Legotckoi
  • 10. August 2018 04:58

да да. я понял, что оно может дампить всю базу, просто если функционал БД позволяет дампить всю базу и нет необходимости в дополнительном функционале, то и искать нет необходимости что-то ещё. Просто dumpdata, следуя документации, может дампить приложения по отдельности.

А если отдельно одно приложение дампить средствами БД, то придётся поразбираться дополнительно, ну или использовать dumpdata.
В использовании dumpdata пожалуй есть один неоспоримый плюс, независимость написания команды для дампа от самой базы данных. Впрочем... у нас много джангистов используют что-то иное, чем PostgreSQL? У меня сложилось впечатление, что для PostgreSQL гораздо больше плюшек под Django.
Evgenii Legotckoi
  • 10. August 2018 05:00

Единственное, в чём недостаток этого dumpdata, по моему мнению в том, что он скорее всего будет медленнее работать, чем средства БД, как никак дополнительная обвязка на питоне. Может быть критично для выконагруженных сервисов.

Вы храните дамп на продакшен сервере? Или тоже скачиваете куда-нибудь?

Evgenii Legotckoi
  • 10. August 2018 05:01

Редактирование комментариев я пока не прикручивал к сожалению, редактирование есть только на форуме. увы.

A
  • 10. August 2018 05:05

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

A
  • 10. August 2018 05:11

один вопрос меня мучает уже давно...это не даже не про бэкап.

если в созданную джангой таблицу базы данных средствами пострес добавить новую запись, что, как и где надо сделать со счечиком объектов джанги, чтобы ей не было больно при добавлении нового объекта? сорри за офтоп, уж давно мучает...



Evgenii Legotckoi
  • 10. August 2018 07:01

Поточнее пожалуйста, не совсем понял про счётчик объектов Джанги.

A
  • 10. August 2018 07:34

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

далее, лично в моем случае , я открываю adminer, и в эту таблицу добавляю еще одну запись. зачем, не помню, эскперимента ради, наверное. потом снова идем в админку, пытаемся добавить еще объект, и получаем ошибку, что объект с таким id уже существует.
т.е. как я понимаю, счетчик объектов у django свой, и если кто по незнанию, или еще  как-то добавил объект мимо нее в таблицу, можно огрести неприятностей?
Evgenii Legotckoi
  • 10. August 2018 07:46

Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто.

Пробовали добавить запись через adminer, перезапустить сайт полностью, и только потом  добавить ещё одну запись через Джанго?
A
  • 10. August 2018 08:06

не, с тех пор боюсь делать такое)

Evgenii Legotckoi
  • 10. August 2018 08:08

Ну я же не предлагаю на боевом сервере )))

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken