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 🙂
Pingback: LFTP stuck making Data Connection - Networklessons.com
Pingback: സൈബര് വാര്ത്തകള് » WordPress Backups
I just took it and copied the entire folder. Is that bad?
You should also have a dump of your db along side it.
Pingback: Incremental WordPress Backups using Duply (Duplicity) by Guy Rutenberg
Pingback: 解决lftp的`ls’ at 0 [Making data connection...]卡住问题 | 景博的blog
Pingback: WordPress Backups | Kenneth's Blog
Pingback: WordPress Backups | TJ Baek's Blog
Pingback: WordPress backup 101 | Server Logix Blog
What a super site, keep up the good work
James xx
Pingback: Backing up WordPress | j187: Intro to Interactive Media
Pingback: 10 Plug-ins For getting Started with SEO on WordPress - Iterate Marketing
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
Pingback: Sauvegarder WordPress ! | ducatillon.net
Pingback: How to Backup Your WordPress Site without any plugin - EzzyBlog
Pingback: The Foolproof Guide to Backing Up WordPress without a Plugin | Computer Guy On Call
Pingback: The 9 Steps You Must Take to Update and Protect Your WordPress Site - WPUP - WordPress Managed Support Services
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