Most of the professional work I do is with Microsoft SQL Server and .Net platform. For my own pet projects, I prefer using MySql as a db engine. WordPress (and most PHP projects use it primarily). It’s cheap and efficient to host.
One of the features I always found SQL Server to lack is the ability to generate insert scripts. Sure, it’s easy to script out tables, views, and stored procs– but you still have to get tricky with transferring data from one database to another. I know people say “you can just back up the database and restore it to a new server”, but they obviously have never worked in a tight change-controlled enterprise environment where you need everyone under the sun to approve this a dedicated dba overlooking everything. This method is overkill if you just want to replace the a record that a user has “accidentally deleted”.
MySql has a very handy feature that use frequently called mysqldump. This will create an sql file of all db objects and store them in an sql file — data structures and data too. Mysqldump will create one script with table create statments (and drop statements) along with insert statements for all of your data.
I use mysqldump to store local backups of my remote databases. For example, this blog is backed up every morning– just in case my server goes down and is unrecoverable. I occasionally back up web code with an FTP routine, but the database needs to be done more often– since it is frequently updated by me or readers of this blog with comments.
Here’s how it’s done using my WordPress database and local XP account:
1. Make sure you can connect to your remote database from your local pc
To do this, you need to have MySql client tools installed on you local pc. Just try to log into our remote site using MySQL Administrator.
If you can connect from you local pc, you can use mysqldump from the command line.
2. Write a batch script to create a folder for each day
I have a folder called “backups” with a date-stamped folder for each day of backup (ie. 2009-06-08). Here is my code for that batch file (with my db details removed):
rem backup blog
rem create new folder name
rem make the new folder
rem go to folder
rem create the data dump
mysqldump -h 188.8.131.52 -u username -ppassword wpDBName > blogdump.sql
For the mysqldump line, use the ip address (or host name) of the remote server and user name and password. In the example above, I am connecting to my db called “wpDBName” on host 184.108.40.206 with the user name “username” and password “password”. It is writing out to a file on my local pc called “blogdump.sql” in a folder with a date stamp.
NOTE: the -p switch does not have a space between it and the password. This is bizarre, but that’s how it works.
Save to the above code to a file with a .bat extension. I called mine “backup.bat”.
3. Create a scheduled task to run this job.
Use Windows Scheduled Tasks to automatically run your batch job. This can be found in Control Panel and is easy to use (Wizard Generated). I run my job at 4:10 am. To save the environment, I shut down my pc at night, but a bios task wakes it back up at 4. At 10 minutes past 4, my databases are backed up (just before I sit at the keyboard with my coffee to catch the final innings of a Padres game). Once a week, I have a similar job that will back up all web code via ftp.
That’s it, the majority of my disaster recovery problems taken care of. I have the data stored on my local pc and on the server. It would be easy to run the same script from another pc if I need to, also.
As you can imagine, this daily backup can take a good deal of disk space. Each sql dump is about 3mb for this site. I usually clear things down every few weeks and delete backups that are over a week old. I don’t replace my backup file every day because it could be a few days before I realise anything has gone wrong. I may script this at some point in the future.
I’m blogging about this because a few days ago I was playing around with my Plesk settings on my Ubuntu VPS and everything stopped working. I had to restore to my last VPS backup– which was a few weeks old. That would have meant losing all my WordPress blog posts and (more importantly) the comments I’ve received from them. Luckily, I have this backup method in place so I didn’t lose anything.
If you are not backing up your databases (even if they are hosted with a web host), you should really consider it. It is a trivial task to set this up and could save you in the future.
I hope someone out there finds this useful. Drop me a line (or post a comment) if you found this to be of any help.