This script backups both the database and files of a WordPress blog into a remote FTP server (while keeping a local copy). It’s an update of my WordPress Backup to FTP script. The main changes are auto-detecting database settings and better support for caching plugins (specifically WP-Cache). The new version makes it easier to backup multiple WordPress blogs to the same FTP server.
Usage is pretty simple after a short initial configuration. First, save the the script and make it executable:
chmod +x wp-backup
(assuming you saved it under the name wp-backup
). After saving it edit the file with your favorite editor and set the 5 configuration variable to whatever is appropriate for you. BACKUP_DIR
is the folder to save the local backups to. FTP_HOST
, FTP_USER
, FTP_PASS
control the FTP host, username and password, respectively, for the remote backup server. FTP_BACKUP_DIR
sets the folder on the FTP server to save the remote backup to.
Now that the initial configuration is done, all you need to do is execute the script and give the path to the blog as an argument. For example:
./wp-backup /home/someuser/myblog
And that it, the script will backup your files (excluding cache) and database to both a local and remote locations. This allows using the same script to backup multiple WordPress blogs, unlike the previous script which had to be modified for each blog.
And now the script itself:
#!/bin/bash
# Copyright 2008, 2010 Guy Rutenberg <http://www.guyrutenberg.com/contact-me>
# WordPress FTP backup 2.0
#
# Easily backup wordpress instances via ftp.
#
# Change Log:
# ===========
# 2.0:
# - Auto-detect database settings.
# - Exclude cache data from backups.
BACKUP_DIR=
FTP_HOST=
FTP_USER=
FTP_PASS=
FTP_BACKUP_DIR=
# end of configuration - you probably don't need to touch anything below
PROG=`basename "$0"`
print_usage () {
echo "USAGE: ${PROG} [options] BLOG_ROOT"
echo "Backup a WordPress blog"
}
print_help () {
print_usage
cat << EOF
Options:
-h, --help show this help message and exit
EOF
}
TEMP=`getopt -o h --long help -n "$PROG" -- "$@"`
if (($?)); then
print_usage
exit 1
fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-h|--help) print_help; exit ;;
--) shift; break;;
esac
done
if [ -z "$1" ]
then
print_usage > /dev/stderr
exit 1
fi
BLOG_DIR=$1
DB_NAME=`echo "<?php require_once(\"${BLOG_DIR}/wp-config.php\"); echo DB_NAME;" | php`
DB_USER=`echo "<?php require_once(\"${BLOG_DIR}/wp-config.php\"); echo DB_USER;" | php`
DB_PASS=`echo "<?php require_once(\"${BLOG_DIR}/wp-config.php\"); echo DB_PASSWORD;" | php`
DB_HOST=`echo "<?php require_once(\"${BLOG_DIR}/wp-config.php\"); echo DB_HOST;" | php`
BLOG_DIR=`dirname "$BLOG_DIR"`/`basename "$BLOG_DIR"`
BACKUP_DIR=`dirname "$BACKUP_DIR"`/`basename "$BACKUP_DIR"`
echo -n "dumping database... "
DUMP_NAME=${DB_NAME}-$(date +%Y%m%d).sql.bz2
mysqldump --user=${DB_USER} --password=${DB_PASS} --host=${DB_HOST} \
--databases ${DB_NAME} \
| bzip2 -c > ${BACKUP_DIR}/${DUMP_NAME}
if [ "$?" -ne "0" ]; then
echo "failed!"
exit 1
fi
echo "done"
echo -n "Creating tarball... "
TAR_NAME=${BLOG_DIR##*/}-$(date +%Y%m%d).tar.bz2
tar -cjf ${BACKUP_DIR}/${BLOG_DIR##*/}-$(date +%Y%m%d).tar.bz2 --exclude cache ${BLOG_DIR}
if [ "$?" -ne "0" ]; then
echo "failed!"
exit 2
fi
echo "done"
echo -n "Uploading SQL dump and tarball to FTP... "
lftp -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} <<EOF
cd "${FTP_BACKUP_DIR}"
put "${BACKUP_DIR}/${DUMP_NAME}"
put "${BACKUP_DIR}/${TAR_NAME}"
EOF
if [ "$?" -ne "0" ]; then
echo "failed!"
exit 3
fi
echo "done"
Awesome script, i hosted my website on a free webhost, when i tried to make a back up using their backup tool, i got an error message, and after that i was looking for another option to back up my site, and this script is most useful. thank you for such a wonderful script š
I just took it and copied the entire folder. Is that bad?
You should also have a dump of your db along side it.
What a super site, keep up the good work
James xx
I keep getting many “command not found”, I’m using CENTOS 7.2 with NGINX, is there any reason for it?
Please help, I checked all over google for good scripts and this one looks like the best one I’ve found
After I wrote the Script directly from SSH it worked but still couldnt do the backup, got the following error:
line 65: //backups/databasename-20161 013.sql.bz2: No such file or directory
mysqldump: Got errno 32 on write
failed!
What have I done wrong?
Solved sorry my mistake, hat to change the permissions of the directory to 755 and to the user! PERFECT !!
Hi i cant take back up from my website .please undrestand to me
That was helpful
Thank you
this a good web and lovely web work
What kind of a script is this ? It certainly looks like a PHP script, so how come I do not see any ;
at the end of each line ?
It’s a bash script
Well I have issue, because getopt command is not supported.
./backup.sh: line 38: getopt: command not found
USAGE: backup.sh [options] BLOG_ROOT
Backup a WordPress blog
How can i do this with sftp?
Hi and thanks for a great site.
Is it possible to set up regular backups/copies to another server That run at fixed intervals automatically, for example every 24 hours or every week? That is, take a snapshot of my site and duplicate it on another server so that I always have a recent Mira image of my site available every 24 hours without my manual intervention?
Is it possible to set up regular backups/copies to another server That run at fixed intervals automatically, for example every 24 hours or every week? That is, take a snapshot of my site and duplicate it on another server so that I always have a recent Mira image of my site available every 24 hours without my manual intervention?
Very useful article for me And I really need to try this one. But can we use this method with sftp?