mysqldump

Mysqldump all databases and gzip

So, quick and simple MySQL backup in a CRON.

#!/bin/bash
_hour=`date '+%H'`;
_user="root";
_pass="thepassword";
_dest="/srv/backups/daily/";
mysqldump -u $_user -p$_pass --all-databases --ignore-table=mysql.event | gzip > $_dest_$_hour.sql.gz

I’ve used this in an hourly CRON so that I always have 24 hours of backups.

Note: The ignore of mysql.event is to stop an annoying new feature of a later version of MySQL that seems to report a notice that its skipped this table. I don’t really need it so I am ignoring it.

How to use mysqldump

Using mysqldump to back up a database

If you want to make a super quick backup of a MySQL database, the best tool for the job is the native mysqldump. Its also a command line utility, so you can use it from a telnet or SSH connection, etc…

The basic command structure of mysqldump is:

mysqldump -u {username} -p{password} {database} > {backup-file}

I.e. If you had root access, and you wanted to backup all the tables within the “customers” database you could run this command:

mysqldump -u root -p customers > mybackup.sql

This would dump all the data to the mybackup.sql file. Note I didn’t enter a password. Mysql will ask you for your password in this instance. If you wanted to enter the password (where it could be seen, or saved into a BASH history) then you use the command -pABC123 where ABC123 is the password (note the lack of a space between -p and ABC123 – this is important!)

But if you are security conscious, omit the actual password from the command line, and merely use -p as this will prompt you for the password and therefore BASH or DOS will not store it.

If you wanted to only dump certain tables from the database, specify them after the database. For example, to back up the “address” and “billing” tables:

mysqldump -u root -p customers address billing > mybackup.sql

Restoring a mysqldump file

If you want to restore a mysqldump’ed file into MySQL – you can simply run the following command:

mysql -u {username} -p{password} {database} < {backup-file}

Note the change of direction for the < symbol and the fact we’re calling the mysql command, and not the mysqldump command!!!

So, to squirt my backupfile back into the customers database

mysql -u root -pABC123 customers < mybackup.sql

NB. This will overwrite your current database tables with whatever is in the backupfile!

Using mysqldump to backup ALL databases

If you have lots of databases, then you simply use the –all-databases command to back them all up into one file:

mysqldump -u root -pABC123 --all-databases > mytotalbackup.sql

Using mysqldump to backup multiple databases

By using the –databases switch, we can state which databases we want backed up. Separate each database name with a space.

So to backup “customers”, “orders” and “misc” we use the following syntax:

mysqldump -u root -pABC123 --databases customers orders misc > multiple-databases.sql

Advanced techniques

Compressed backups

More often than not, a database dump will be several hundred MB in size, if not more. MySQL can zip this for you automatically using the gzip command:

mysqldump -u root -pABC123 customers | gzip > compressed-backup.sql.gz

The pipe before the gzip tells mysqldump to send the output to the next command, which is gzip and that, in turn, is asked to create “compressed-backup.sql.gz”

Dumping the data definitions

If you wanted a “skeleton” structure of the entire database, then mysqldump will allow this, by using the –no-data switch:

mysqldump -u root -pABC123 --no-data customers > customers-structure.sql