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"
Приветствую! а почему pg_dump, а не Django'вское dumpdata?
Добрый день!
так ./manage.py dumpdata > db.json дампит всю бд. но привычка это да, согласен
не нашел как редактировать комент...
да да. я понял, что оно может дампить всю базу, просто если функционал БД позволяет дампить всю базу и нет необходимости в дополнительном функционале, то и искать нет необходимости что-то ещё. Просто dumpdata, следуя документации, может дампить приложения по отдельности.
Единственное, в чём недостаток этого dumpdata, по моему мнению в том, что он скорее всего будет медленнее работать, чем средства БД, как никак дополнительная обвязка на питоне. Может быть критично для выконагруженных сервисов.
Редактирование комментариев я пока не прикручивал к сожалению, редактирование есть только на форуме. увы.
медленно, особенно на больших объемах - совсем печаль. я храню, но только на локальных проектах.
один вопрос меня мучает уже давно...это не даже не про бэкап.
Поточнее пожалуйста, не совсем понял про счётчик объектов Джанги.
допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок.
Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто.
не, с тех пор боюсь делать такое)
Ну я же не предлагаю на боевом сервере )))