#!/usr/bin/php
/* MySQL Quota Tool(mysqlquota.php) Write by Gonçalo Silva gngs(at)paradigma.co.pt --------------------------------------------------------------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- This script was based on Sebastian Marsching's idea (Thank´s) It provides you the ability to limit the on-disk size of any MySql Database. It works by checking the size of each database and revoking the INSERT and CREATE priveleges for the databases which exceed the given size limit. Also, an email will be sent to the owner, informing him of the condition. When the size of the database falls below the given limit, the INSERT and CREATE priveleges are granted again. You have to create a quota Database (quotadb) and the user must have full access to all databases. Normally we are talking about root@localhost Create this table: CREATE TABLE Quota ( Db char(64) NOT NULL default '', Max bigint(20) NOT NULL default '0', Exceeded enum('Y','N') NOT NULL default 'N', Mail char(100) default NULL, PRIMARY KEY (Db), UNIQUE KEY Db (Db) ); This script uses de php CLI. chmod 700 mysqlquota.php ./mysqlquota.php */ //Settings $mysql_host = 'localhost'; $mysql_user = 'root'; $mysql_pass = ''; //put your password here $mysql_db = 'quotadb'; //Database's name which has Quota table $mysql_table = 'Quota'; $mail_msg = 'Your Database exceeded the limit quota. Please contact The administration'; //-------- function connect_Bd (){ global $mysql_host, $mysql_user, $mysql_pass, $mysql_db; mysql_connect($mysql_host, $mysql_user, $mysql_pass); mysql_select_db($mysql_db); } function getInput(){ $input = fgets(STDIN, 255); $input = rtrim($input); return $input; } function inserirDb() { global $mysql_table; echo "\nWhat's the DataBase name?: "; $db_name= getInput(); echo "What's the Limit in Mb you want?: "; $db_limitm=(Int)getInput(); $db_limit=$db_limitm*1048576; echo "What's the email to notify the quota?: "; $db_email= getInput(); connect_Bd(); mysql_query ("insert into $mysql_table values ('$db_name','$db_limit','N','$db_email')"); mysql_close(); echo "\nDataBase $db_name added with quota= $db_limitm (Mb)\n\n"; exit(0); } function updateDb() { global $mysql_table; echo "\nWhat's the DataBase name to update quota?: "; $db_name= getInput(); echo "\nWhat's the new quota limit in Mb?: "; $db_limitm=(Int)getInput(); $db_limit=$db_limitm*1048576; connect_Bd(); mysql_query ("update $mysql_table set Max='$db_limit' where Db='$db_name'"); mysql_close(); echo "\nDataBase $db_name with new quota= $db_limitm (Mb)\n"; checkDb(1,$db_name); } function deleteDb() { global $mysql_table; echo "\nWhat's the DataBase name to delete quota?: "; $db_name= getInput(); connect_Bd(); mysql_query("delete from $mysql_table where Db='$db_name'"); mysql_close(); echo "\nQuota for DataBase $db_name deleted\n\n"; exit(1); } function checkDbone(){ echo "\nWhat's the DataBase name to see the quota?: "; $db_name= getInput(); checkDb(1,$db_name); } function checkDb($control,$db_name ) { global $mysql_table, $mail_msg; connect_Bd(); if ($control) $result = mysql_query("select * from $mysql_table where Db='$db_name'"); else $result = mysql_query("select * from $mysql_table"); while ($row = mysql_fetch_array($result)){ $quota_db = $row['Db']; $quota_limit = $row['Max']; $quota_exceeded = ($row['Exceeded']=='Y') ? 1 : 0; $user_mail = $row['Mail']; echo "\nChecking quota for $quota_db DataBase...\n"; $qresult = mysql_query("show table status from $quota_db"); $quota_size = 0; while ($qrow = mysql_fetch_array($qresult)) { $quota_size += $qrow['Data_length'] + $qrow['Index_length']; } $quota_sizem=($quota_size/1048576); $quota_sizem= round($quota_sizem, 2); $quota_limitm=($quota_limit/1048576); echo "Size is $quota_sizem (Mb), limit is $quota_limitm (Mb)\n"; if ($quota_size <= $quota_limit && !$quota_exceeded) echo "DataBase UnLocked\n"; if ($quota_size >= $quota_limit && $quota_exceeded) echo "DataBase Locked\n"; if (($quota_size > $quota_limit) && !$quota_exceeded){ echo "LOCKING DATABASE...\n"; mysql_query("update $mysql_table set exceeded='Y' where db='$quota_db'"); // taken off CREATE and INSERT privelege for database mysql_select_db('mysql'); mysql_query("update db set Insert_priv='N', Create_priv='N' where Db='$quota_db'"); mysql_select_db($mysql_db); //sending mail to notify the user mail($user_mail,"Quota MySQL Exceeded",$mail_msg); } if (($quota_size <= $quota_limit) && $quota_exceeded){ echo "UNLOCKING database...\n"; mysql_query("update $mysql_table set exceeded='N' where db='$quota_db'"); // Grant CREATE and INSERT privelege for database mysql_select_db('mysql'); mysql_query("update db set Insert_priv='Y', Create_priv='Y' WHERE Db='$quota_db'"); mysql_select_db($mysql_db); } } exit(1); }//fim da funcao if ($argc!=2){ echo "\nusage: $argv[0]\n\n"; echo " '1' - Insert quota limit to a new DataBase\n"; echo " '2' - Update new quota limit to a DataBase\n"; echo " '3' - Delete quota limit to a DataBase\n"; echo " '4' - Check one DataBase quota\n"; echo " '5' - Check All DataBases quotas\n\n"; exit(-1); } switch ($argv[1]) { case 1: inserirDb(); break; case 2: updateDb(); break; case 3: deleteDb(); break; case 4: checkDbone(); break; case 5: checkDb(0,null); break; default: echo "What kind of number is that?\n"; } exit(0);