I am using the Database Backup script by David Walsh(http://davidwalsh.name/backup-mysql-database-php) to backup my MYSQL database as a .sql file to my server.
I cre
Use mysql_error() function to see what is that MySQL complains about.
The script looks very weak IMHO. You should consider using mysqldump it it's available in your system.
The basic command line would be:
mysqldump -hYOURHOSTNAME -uYOURUSER -pYOURPASSWORD infocap > dump.sql
You can test mysqldump in your local computer and, once you're happy with the results, either create a shell script or add it directly as a cron task.
You have to make sure that mysql_query
does not first return a non-stream. Try this:
....
if (false !== ($result = mysql_query('SHOW TALBES')) {
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
} else {
// see Mchl's point about mysql_error
}
This will not work to back up your database as an SQL script, unless your database is just a toy database, the equivalent of a "hello world" script.
That script is appalling. You should not use it to back up a database. That script has been posted before: PHP Database Dump Script - are there any issues?
No error checking after mysql_connect() or mysql_queries(). You probably just gave a wrong password or something, but you'd never know because the script doesn't verify the connect was successful.
It won't produce the right INSERT statement if your database contains any NULLs.
Character sets are not handled.
addslashes() is not suitable for escaping data.
Table names are not delimited.
Does not back up views, procedures, functions, or triggers.
mysql_query() buffers results, so if you have a table with thousands of rows or more, you'll exceed your PHP memory limit. In fact, the script concatenates the series of INSERT statements into a single PHP variable. So before it finishes, you will have your entire database represented in memory.
No one should ever use that script. It's utter garbage, and I do not say that lightly.
Just use shellexec() to run mysqldump.
@Álvaro G. Vicario has a good point, there's no need for you to even use PHP for this task. I was assuming you need to make a backup from a PHP script. Here's how I would create a backup from a cron script:
Create a shell script, it can be called whatever you want, e.g. mymysqldump.sh. Here's how I would write it:
:
: ${BACKUP_HOST:="localhost"}
: ${BACKUP_DATABASE:="mydatabase"}
: ${BACKUP_DIR:="/opt/local/var/db/mysql5/backups"}
: ${BACKUP_FILE:="${DATABASE}-`date +%Y%m%d%H%M%S`"}
mysqldump -h ${BACKUP_HOST} ${BACKUP_DATABASE} > ${BACKUP_DIR}/${BACKUP_FILE}
Of course customize the values of the variables as needed for your environment.
You may notice that the username and password are not in this file. Please don't put passwords into scripts in plain text so everyone can read them. Instead, we'll put them in an options file to make it more secure.
Create a special operating system user who is going to run the backup from cron. Your system may have a special user "mysql" or "_mysql" to run the MySQL Server, but this user may be configured to have no valid home directory. You need a user that has a home directory. Let's call it "mybackup".
Under that user's home directory, create a file .my.cnf
with the following content:
[mysqldump]
user = alupto_backup
password = xyzzy
Where "alupto_backup" and "xyzzy" are the MySQL username and its password (change these for your environment). Set the ownership and mode of this file so that only its owner can read it:
chown mybackup .my.cnf
chmod 600 .my.cnf
Create a bin directory under this user's home and put our shell script into it.
mkdir ~mybackup/bin
mv mymysqldump ~mybackup/bin
Now you can run the shell script to test it:
sh ~mybackup/bin/mymysqldump
Now create a cron file for this user:
crontab -u mybackup
@daily ~mybackup/bin/mymysqldump
That should be it.