2

I want to give a client the ability to manually download a backup of his database. I am coding the site using PHP and MySQL. So after the admin user has logged in there would be a link in the menu to download a .sql file to the local computer. How can I accomplish this with PHP?

Devin Crossman
  • 7,454
  • 11
  • 64
  • 102
  • http://stackoverflow.com/questions/3595976/backup-mysql-database-with-php is similar – Michael Low Apr 12 '11 at 21:08
  • Exact duplicate of [Backup a mysql database and download as a file](http://stackoverflow.com/questions/3751069/backup-a-mysql-database-and-download-as-a-file), and half the questions in the Related list on the right. – Charles Apr 12 '11 at 21:08

1 Answers1

3

This can get messy trying to back up a database from PHP, you would be better of letting MySql handle this, and the best way to tell mysql to do this is with a shell script:

#!/bin/bash
# Shell script to backup MySql database
# To backup Nysql databases file to /backup dir and later pick up by your
# script. You can skip few databases from backup too.
# For more info please see (Installation info):
# http://www.cyberciti.biz/nixcraft/vivek/blogger/2005/01/mysql-backup-script.html
# Last updated: Aug - 2005
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2004, 2005 nixCraft project
# Feedback/comment/suggestions : http://cyberciti.biz/fb/
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------

MyUSER="SET-MYSQL-USER-NAME"     # USERNAME
MyPASS="SET-PASSWORD"       # PASSWORD
MyHOST="localhost"          # Hostname

# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

# Backup Dest directory, change this if you have someother location
DEST="/backup"

# Main directory where backup will be stored
MBD="$DEST/mysql"

# Get hostname
HOST="$(hostname)"

# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"

# File to store current backup file
FILE=""
# Store list of databases
DBS=""

# DO NOT BACKUP these databases
IGGY="test"

[ ! -d $MBD ] && mkdir -p $MBD || :

# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

# Get all database list first
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"

for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
    for i in $IGGY
    do
        [ "$db" == "$i" ] && skipdb=1 || :
    done
    fi

    if [ "$skipdb" == "-1" ] ; then
    FILE="$MBD/$db.$HOST.$NOW.gz"
    # do all inone job in pipe,
    # connect to mysql using mysqldump for select mysql database
    # and pipe it out to gz file in backup dir :)
        $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
    fi
done

and then you tell php to tell the operating system to execute this script and wait for it to be done, this is usually done with exec or system such as:

exec('/path/to/backup/script.sh');

Then you can simply send the file created by the script to the browser for that user.

RobertPitt
  • 56,863
  • 21
  • 114
  • 161
  • +1 letting MySQL do it is the way to go. The important thing to take away from the script above is the use of `mysqldump`. See http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html for more reference. – mfonda Apr 12 '11 at 21:13
  • the shell script seem's the best solution as you have more control over errors etc, if you just used `mysqldump` with `exec` then you would more than likely going to run into some error's along the way. – RobertPitt Apr 12 '11 at 21:16
  • Thanks this set me on the right track but i made my own shell script to execute the mysqldump command – Devin Crossman Apr 12 '11 at 22:21
  • That's perfectly fine, and hope i have shared some good knowledge with you :) – RobertPitt Apr 12 '11 at 22:23
  • 2
    This is plagiarism. every single word is copied from http://bash.cyberciti.biz/backup/backup-mysql-database-server-2/ and not a single credit to the original author. what a shame. – Fr0zenFyr Mar 12 '13 at 07:35