How to monitor MySQL space?
I have some great big queries to share:
Run this to get the Total MySQL Data and Index Usage By Storage Engine
SELECT IFNULL(B.engine,'Total') "Storage Engine",CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,SUM(data_length+index_length) TSize FROMinformation_schema.tables WHERE table_schema NOT IN('mysql','information_schema','performance_schema') ANDengine IS NOT NULL GROUP BY engine WITH ROLLUP) B,(SELECT 3 pw) A ORDER BY TSize;
Run this to get the Total MySQL Data and Index Usage By Database
SELECT DBName,CONCAT(LPAD(FORMAT(SDSize/POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Data Size",CONCAT(LPAD(FORMAT(SXSize/POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Index Size",CONCAT(LPAD(FORMAT(STSize/POWER(1024,pw),3),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') "Total Size" FROM(SELECT IFNULL(DB,'All Databases') DBName,SUM(DSize) SDSize,SUM(XSize) SXSize,SUM(TSize) STSize FROM (SELECT table_schema DB,data_length DSize,index_length XSize,data_length+index_length TSize FROM information_schema.tablesWHERE table_schema NOT IN ('mysql','information_schema','performance_schema')) AAAGROUP BY DB WITH ROLLUP) AA,(SELECT 3 pw) BB ORDER BY (SDSize+SXSize);
Run this to get the Total MySQL Data and Index Usage By Database and Storage Engine
SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size"FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score,IF(ISNULL(engine)=1,10,0) engine_score,IF(ISNULL(table_schema)=1,'ZZZZZZZZZZZZZZZZ',table_schema) schemaname,IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases",IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,CONCAT("Storage for ",B.table_schema),CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') DataSize,CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') IndexSize,CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',SUBSTR(' KMGTP',pw+1,1),'B') TableSize FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize,SUM(data_length+index_length) TSize FROM information_schema.tablesWHERE table_schema NOT IN ('mysql','information_schema','performance_schema')AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B,(SELECT 3 pw) A) AA ORDER BY schemaname,schema_score,engine_score;
CAVEAT
In each query, you will see (SELECT 3 pw)
. The pw stands for the Power Of 1024 to display the results.
(SELECT 0 pw)
will Display the Report in Bytes(SELECT 1 pw)
will Display the Report in KiloBytes(SELECT 2 pw)
will Display the Report in MegaBytes(SELECT 3 pw)
will Display the Report in GigaBytes(SELECT 4 pw)
will Display the Report in TeraBytes(SELECT 5 pw)
will Display the Report in PetaBytes (please contact me if you run this one)
Here is a report query with a little less formatting:
SELECT IFNULL(db,'Total') "Database",datsum / power(1024,pw) "Data Size",ndxsum / power(1024,pw) "Index Size",totsum / power(1024,pw) "Total"FROM (SELECT db,SUM(dat) datsum,SUM(ndx) ndxsum,SUM(dat+ndx) totsumFROM (SELECT table_schema db,data_length dat,index_length ndxFROM information_schema.tables WHERE engine IS NOT NULLAND table_schema NOT IN ('information_schema','mysql')) AAGROUP BY db WITH ROLLUP) A,(SELECT 1 pw) B;
Trust me, I made these queries over 4 years ago and still use them today.
UPDATE 2013-06-24 15:53 EDT
I have something new. I have changed the queries so that you do not have to set the pw
parameter for different unit displays. Each unit display is calculated for you.
Report By Storage Engine
SELECT IFNULL(ENGINE,'Total') "Storage Engine", LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"FROM( SELECT ENGINE,DAT,NDX,TBL, IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 FROM (SELECT *, FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz FROM (SELECT ENGINE, SUM(data_length) DAT, SUM(index_length) NDX, SUM(data_length+index_length) TBL FROM ( SELECT engine,data_length,index_length FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') AND ENGINE IS NOT NULL ) AAA GROUP BY ENGINE WITH ROLLUP) AAA ) AA) A,(SELECT ' BKBMBGBTB' units) B;
Report By Database
SELECT IFNULL(DB,'Total') "Database", LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"FROM( SELECT DB,DAT,NDX,TBL, IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 FROM (SELECT *, FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz FROM (SELECT DB, SUM(data_length) DAT, SUM(index_length) NDX, SUM(data_length+index_length) TBL FROM ( SELECT table_schema DB,data_length,index_length FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') AND ENGINE IS NOT NULL ) AAA GROUP BY DB WITH ROLLUP) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B;
Report By Database / Storage Engine
SELECT IF(ISNULL(DB)+ISNULL(ENGINE)=2,'Database Total', CONCAT(DB,' ',IFNULL(ENGINE,'Total'))) "Reported Statistic", LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ', SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size", LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ', SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size", LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ', SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"FROM( SELECT DB,ENGINE,DAT,NDX,TBL, IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3 FROM (SELECT *, FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px, FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py, FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz FROM (SELECT DB,ENGINE, SUM(data_length) DAT, SUM(index_length) NDX, SUM(data_length+index_length) TBL FROM ( SELECT table_schema DB,ENGINE,data_length,index_length FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') AND ENGINE IS NOT NULL ) AAA GROUP BY DB,ENGINE WITH ROLLUP) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B;
If only MySQL is available, use the SHOW TABLE STATUS command, and look at the Data_length column for each table, which is in bytes.
If you have other languages available on the machine, a script in any of them that runs regularly (cron), checks disk free space or size of database directory, and updates you over e-mail or otherwise. There are far too many options to suggest a particular solution -- it depends on your situation.
You can refer MONyog which has Disk Info feature which lets you find out Disk space analysis at server level, Database level and at Table level