Calculating MySQL Database sizes in Linux

Posted on Thursday May 05, 2011 / by Eric Potvin

Checking regularly if you still have space left on your hard drive(s) is a mandatory procedure and can be painful if this procedure is done manually. To create an automated script that sends email (for example) to someone telling how much space the web folder, how big is the database or how much space left on the hard drive can be very useful.

Run this as sudo or any user that has access to all the folder listed

MySQL Disk Usage:

List of Databases disk usage (without the table definition - so data and index data) assuming the path of the MySQL data folder is: /var/lib/mysql

MyDatabase=`ls -l /var/lib/mysql/mydb/ | grep -v '.frm' | awk 'BEGIN { sum = 0 } { sum += $5 } END { print sum }'`
MyDatabase2=`ls -l /var/lib/mysql/mydb2/ | grep -v '.frm' | awk 'BEGIN { sum = 0 } { sum += $5 } END { print sum }'`
# etc...

You can ommit the "grep -v '.frm'" if you want full database sizes (table definition, indexes and data)

Now the total:

let sumDB=$MyDatabase+$MyDatabase2

or (if you include the .frm file)

sumDB=`du -sPb /var/lib/mysql/ | awk '{print $1}'`

WWW Data Disk Usage:

List of the WWw data folder assuming the path of the WWW folder is: /var/www/

sumWWW=`du -sPb /var/www/ | awk '{print $1}'`

Total Disk Usage:

let sum=$TotalMysql+$sumWWW

Space left on the disk:

SpaceLeft=`df | egrep '^/dev/sda1' | awk '{print $4}'`

Build the report

Message="\nDisk usage (in bytes) @ `date`\nMySQL database - MyDatabase : $MyDatabase\nTotal MySQL: $TotalMysql\n\nWWW data: $sumWWW\n\nTota  l: $sum\n\nSpace Left: $SpaceLeft"

Send it

echo -e $Message | mail -s "Disk Usage" "admin@domain.com"

Here's the full script:

#!/bin/bash

MyDatabase=`ls -l /var/lib/mysql/mydb/ | grep -v '.frm' | awk 'BEGIN { sum = 0 } { sum += $5 } END { print sum }'`
MyDatabase2=`ls -l /var/lib/mysql/mydb2/ | grep -v '.frm' | awk 'BEGIN { sum = 0 } { sum += $5 } END { print sum }'`

let sumDB=$MyDatabase+$MyDatabase2
#or
#sumDB=`du -sPb /var/lib/mysql/ | awk '{print $1}'`

sumWWW=`du -sPb /var/www/ | awk '{print $1}'`
let sum=$TotalMysql+$sumWWW

SpaceLeft=`df | egrep '^/dev/sda1' | awk '{print $4}'`

Message="\nDisk usage (in bytes) @ `date`\nMySQL database - MyDatabase : $MyDatabase\nTotal MySQL: $TotalMysql\n\nWWW data: $sumWWW\n\nTota  l: $sum\n\nSpace Left: $SpaceLeft"
echo -e $Message | mail -s "Disk Usage" "admin@domain.com"

Make sure the script is executable and you are done!