How to monitor MySQL space? How to monitor MySQL space? mysql mysql

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