How to monitor MySQL space?

前端 未结 6 1481
死守一世寂寞
死守一世寂寞 2021-01-31 20:48

I downloaded a VM image of a web application that uses MySQL.

How can I monitor its space consumption and know when additional space must be added?

相关标签:
6条回答
  • 2021-01-31 21:33

    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

    0 讨论(0)
  • 2021-01-31 21:35
    du -s /var/lib/mysql/* | sort -nr
    

    Result

    34128   /var/lib/mysql/db_name1
    33720   /var/lib/mysql/db_name2
    29744   /var/lib/mysql/db_name3
    26624   /var/lib/mysql/db_name4
    16516   /var/lib/mysql/db_name5
    

    Thsi will show as descending order in kb

    0 讨论(0)
  • 2021-01-31 21:36

    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.

    0 讨论(0)
  • 2021-01-31 21:36

    Since you have VM and you don't really care how the space is used, I think the simplest way is to check the size of MySQL data dir. By default it is /var/lib/mysql. Also it`ll be nice to cleanup the mysql binary logs (if possible) before checking data dir size.

    0 讨论(0)
  • 2021-01-31 21:39

    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 FROM
    information_schema.tables WHERE table_schema NOT IN
    ('mysql','information_schema','performance_schema') AND
    engine 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.tables
    WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')) AAA
    GROUP 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.tables
    WHERE 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) totsum
    FROM (SELECT table_schema db,data_length dat,index_length ndx
    FROM information_schema.tables WHERE engine IS NOT NULL
    AND table_schema NOT IN ('information_schema','mysql')) AA
    GROUP 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;
    
    0 讨论(0)
  • 2021-01-31 21:50

    For MyISAM tables, I usually check the size of the /var/lib/mysql/mydatabasename/ directory. InnoDB tables use monolithic files, so you have to use SHOW TABLE STATUS.

    0 讨论(0)
提交回复
热议问题