I have googled for bash script to backup Magento sites/db but none of them worked for me the way I want.
So I decided to create a custom bash script which is simple and does the job perfectly.
I have developed the script for my own need. But I thought it would be helpful for you guys as well.
Here goes the overall backup script:
#!/bin/bash #@author MagePsycho <magepsycho@gmail.com> #@website http://www.magepsycho.com #@version 0.1.0 #/************************ EDIT VARIABLES ************************/ projectName=magepsycho backupDir=/home/magepsycho/_backups #/************************ //EDIT VARIABLES **********************/ dbXmlPath="app/etc/local.xml" { host="$(echo "cat /config/global/resources/default_setup/connection/host/text()" | xmllint --nocdata --shell $dbXmlPath | sed '1d;$d')" username="$(echo "cat /config/global/resources/default_setup/connection/username/text()" | xmllint --nocdata --shell $dbXmlPath | sed '1d;$d')" password="$(echo "cat /config/global/resources/default_setup/connection/password/text()" | xmllint --nocdata --shell $dbXmlPath | sed '1d;$d')" dbName="$(echo "cat /config/global/resources/default_setup/connection/dbname/text()" | xmllint --nocdata --shell $dbXmlPath | sed '1d;$d')" } fileName=$projectName-$(date +"%Y-%m-%d") printf "What kind of backup you would like?\n[ d ] DB backup only\n[ f ] Files backup only\n[ b ] Files backup with DB\n" read backupType if [[ $backupType = @(d|b) ]]; then echo "----------------------------------------------------" echo "Dumping MySQL..." mysqldump -h $host -u $username -p$password $dbName > $fileName.sql echo "Done!" fi if [[ $backupType = @(f|b) ]]; then echo "----------------------------------------------------" echo "Archiving Files..." printf "Skip /media folder?\ny: Yes\nn: No\n" read skipMedia if [ $skipMedia == y ]; then tar -zcf $fileName.tar.gz --exclude=var --exclude=includes --exclude=media * .htaccess else tar -zcf $fileName.tar.gz --exclude=var --exclude=includes * .htaccess fi echo "Done!" echo "----------------------------------------------------" echo "Cleaning..." rm -f $fileName.sql echo "Done!" fi if [[ $backupType = @(d|f|b) ]]; then echo "----------------------------------------------------" mkdir -p $backupDir; echo "Moving file to backup dir..." if [ $backupType == d ]; then mv $fileName.sql $backupDir fi if [[ $backupType = @(f|b) ]]; then mv $fileName.tar.gz $backupDir fi echo "Done!" else echo "Invalid selection!" fi
Or you can download it from [here]
Notes: If you get the following error:
syntax error in conditional expression: unexpected token `(‘
line 24: syntax error near `@(d’
line 24: `if [[ $backupType = @(d|b) ]]; then’
then this means you are using older version of bash (< 4.0). And you need to patch the script by adding the following line after bash script declaration:
shopt -s extglob
What does this script do?
1. Gives options for backup type which are:
- DB backup only
- Files backup only
- Files backup with DB
2. Dumps the database by taking db info from xml configuration.
3. Makes a copy of project files and compresses it in .tar.gz format.
While copying it also gives options whether to exclude media folder or not.
Note that by default 'var' & 'includes' folder are excluded by the script.
4. Deletes the dumped SQL file as it's already copied in compressed file.
5. Creates backup dir if not exists
6. Copies the compressed project file to the backup dir.
Besides, you can also setup cron job to run this backup script at regular intervals.
How to run backup script?
1. Edit _magebackup.sh to configure variables 'projectName' & 'backupDir'
2. Upload the edited _magebackup.sh to the root of your Magento installation
3. Run following series of commands in terminal:
cd /path/to/magento/root chmod +x _magebackup.sh ex -sc $'%s/\r$//e|x' _magebackup.sh sh _magebackup.sh
4. You will get the compressed backup file at backup dir
Snapshots for different backup types
Let's comment if there's any room for improvement in this script.
Thanks for reading & sharing.
The post Backup Magento project files / db using bash script appeared first on MagePsycho's Magento Blog & more.