During the development of the site on Django had to start to understand the Bash scripts to automate routine tasks. For example, creating and downloading a database dump from a site, as well as reserving media files.
We assume that you already have access to the server via ssh , and your user on the server that manages the site has access rights, with which he can dump the database.
Directory structure with scripts
To perform backup of media files and a database dump, you will need to write several scripts:
- The main script
- A script to create a dump that will be executed on a remote server
- Script to delete the dump on a remote server, so as not to waste valuable disk space
Структура будет следующей
./remote-scripts/create_dump.sh ./remote-scripts/remove_dump.sh ./backup.sh
create_dump.sh
When a user enters the server, it appears in its home directory. Therefore, we will write scripts based on the fact that we are in the given home directory.
#!/bin/bash # Let's remember the time of creating a dump current_date=$(date +"%Y_%m_%d_%H:%M:%S") # Create a directory where we will save the dump mkdir db_dumps # create a dump pg_dump database_name > ~/db_dumps/db_$current_date # disconnect from the server exit
I create a directory for the dump, because it's easier to have a script to call rsync, just merge the entire dump into some directory and everything. However, other versions of the dump that we downloaded earlier will not be deleted, even if they do not exist in the db_dumps directory.
remove_dump.sh
Script to remove the dump from a remote server
#!/bin/bash # delete the directory with the database dump rm -rf db_dumps # disconnect from the server exit
backup.sh
And now the time for the most important script, which will collect everything together
#!/bin/bash # Пути к скриптам REMOTE_SCRIPTS_PATH="remote-scripts" SCRIPT_PATH_CREATE_DUMP="create_dump.sh" SCRIPT_PATH_REMOVE_DUMP="remove_dump.sh" # Let's create a database dump ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_CREATE_DUMP" # Download the dump to the backup directory rsync -av --progress username@111.222.333.444:~/db_dumps ~/backup # Download media files to the backup directory rsync -av --progress username@111.222.333.444:~/virtual_env/yourproject/media ~/backup # Delete the dump from the remote server ssh username@111.222.333.444 'bash -s' < "$REMOTE_SCRIPTS_PATH/$SCRIPT_PATH_REMOVE_DUMP"
In this case, we make a connection using ssh with the username and IP address of the server.
This line sends to the remote server the script create_dump.sh from your local PC
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, по моему мнению в том, что он скорее всего будет медленнее работать, чем средства БД, как никак дополнительная обвязка на питоне. Может быть критично для выконагруженных сервисов.
Редактирование комментариев я пока не прикручивал к сожалению, редактирование есть только на форуме. увы.
медленно, особенно на больших объемах - совсем печаль. я храню, но только на локальных проектах.
один вопрос меня мучает уже давно...это не даже не про бэкап.
Поточнее пожалуйста, не совсем понял про счётчик объектов Джанги.
допустим у нас есть любая таблица, созданная джангой. через админку добавляем пару записей. все ок.
Вон оно что. Не сталкивался с таким, надо будет глянуть исходники дефолтного менеджера объектов. Возможно там кеширование просто.
не, с тех пор боюсь делать такое)
Ну я же не предлагаю на боевом сервере )))