Check and Optimize MySQL Database Automatically with Crontab/Cron
MySQL is a very popular free yet powerful database system. But even in great databases, the tables may get fragmented with overhead due to continuous update, or delete and insert operation on data stored in database. Beside, it’s also possibility that the databases may get corrupted. Thus, performing health check on database and optimize MySQL server regularly is an important task.
It’s a bit troublesome if the database administrators have to login to the server or launching the phpMyAdmin to optimize the databases one by one or table by table manually. Sometimes DB admin may simply forgets to do the job or set the frequency of optimization to lesser times. It’s recommended that every tables in MySQL databases are checked at least once a day on a busy server.
It’s possible to automate the optimization of MySQL process by using crontab function in Linux/Unix/CentOS/FreeBSD. The cron job to check and optimize MySQL databases can be created by using mysqlcheck client utility comes MySQL installation. mysqlcheck client can checks, repairs, optimizes, and analyzes tables in MySQL database.
To create a new cron job, login to the server as root or any other user, and then edit the crontab file (in most operating system, crontab -e will open crontab file in default text editor) to add in the following line of text. For users using cPanel, click on “Cron job” where you can set up crontab at daily, hourly and other interval. Experience webmasters can also set up a crontab file in rc.hourly or rc.daily or other cron directory. Note that if you login as a MySQL or normal user with no access privileges to all database, it’s not possible to optimize all databases, unless user ID and password for root is specified as in example below.
0 1 * * * mysqlcheck -Aao –auto-repair -u root -p[password] > /dev/null
The above statement has the syntax similar to “mysqlcheck [options] –all-databases”, where –all-databases parameter is the default action is no databases is specified thus can be omitted. The command will run mysqlcheck client to automatically analyze and optimize all databases at 1 am everyday. Note that there is not space between -p and your password for root. You can change the running time to your preference, and also change the options for mysqlcheck command. If you just want to check and optimize certain databases or certain tables without the database, use the following syntax:
mysqlcheck [options] db_name [tables]
mysqlcheck [options] –databases DB1 [DB2 DB3...]
You may want to remove –auto-repair switch from the above command, as a table repair operation might cause data loss under some circumstances the operation due to causes include but are not limited to filesystem errors. For those who has changed the character set and collation of MySQL databases may also need to use –default-character-set option. More information on all available switches and options available can be found here.
Share and contribute or get technical support and help at My Digital Life Forums.
Related Articles
- MySQL Database Performance Tuning Best Practices Video Tutorial
- Install Web Server in Windows XP with Apache2, PHP5 and MySQL4 - Part 4
- Change and Reset MySQL root Password
- How to Find and Replace Text in MySQL Database using SQL
- WordPress MySQL SQL Query Error in WPDB Class
- Change or Set MySQL Long Query Time Value for log-slow-queries
- Using PHP-MySQL Persistent Connections to Run WordPress Blog
- Enable Logging of Slow Queries (Slow Query Log) in MySQL Database
- How to Delete Existing WordPress Post Revisions Stored/Saved
- Remove or Trim First or Last Few Characters in MySQL Database with SQL

































January 16th, 2008 06:40
Note that -–auto-repair should have two dashes
Also, you might want to leave “> /dev/null” out for the first few runs, to see the results of the command (if you put MAILTO=me@mydomain.com at the top of the crontab, the results will get sent there).
May 6th, 2008 19:15
I did not know that it was nesessary to perform a regular check for mysql.