Como encontro o tamanho de um banco de dados MySQL?

4

Disseram-me que show table status é útil para encontrar o tamanho de uma base de dados, mas recebo uma confusão ilegível. Existe alguma maneira de alterar este comando para obter menos informações, ou existe outra maneira de encontrar o tamanho de um banco de dados ou tabela?

    
por Eric Wilson 07.09.2009 / 16:27

5 respostas

3

Os dois campos que você quer são.

  • Data_length

    Este é o tamanho dos dados dentro da tabela em bytes.

  • Index_length

    Este é o tamanho do índice da tabela em bytes.

Você pode limitar a saída a uma tabela com um banco de dados.

SHOW TABLE STATUS LIKE 'tablename';

Você não pode remover as outras colunas da saída. Você pode achar a saída mais fácil de ler a partir de um console, imprimindo as linhas de saída verticalmente. Basta substituir o " ; " por " \G ".

    
por 07.09.2009 / 16:35
5

Eu tenho um conjunto bastante maluco de consultas que abordariam isso bem. Eu escrevi estes cerca de 2 anos atrás e eles funcionam muito bem. Eu ainda os uso para reportar aos clientes.

Consulta para fornecer o tamanho do banco de dados agrupado por mecanismo de armazenamento em MB

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 2 pw) A 
ORDER BY TSize;

Consulta para fornecer o tamanho do banco de dados agrupado por banco de dados em MB

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 2 pw) BB 
ORDER BY (SDSize+SXSize);

Consulta para fornecer o tamanho do banco de dados agrupado por banco de dados e mecanismo de armazenamento em MB

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 2 pw) A) AA 
ORDER BY schemaname, schema_score,engine_score;

Todas as três consultas têm uma coisa em comum: uma consulta SELECT simples (SELECT 2 pw).

O pw representa o poder, o expoente usado contra o número 1024. Você pode ajustar a consulta para fornecer Tamanhos do banco de dados com unidades diferentes:

(SELECT 0 pw) --reports the Database Size in Bytes
(SELECT 1 pw) --reports the Database Size in Kilobytes
(SELECT 2 pw) --reports the Database Size in Megabytes
(SELECT 3 pw) --reports the Database Size in Gigabytes
(SELECT 4 pw) --reports the Database Size in Terabytes
(SELECT 5 pw) --reports the Database Size in Petabytes (email me if you reach this size)

Dê uma chance a eles !!!

    
por 03.04.2011 / 04:44
1

O script encontrado deve fazer o que você quer -

link

<?

mysql_connect("db.modwest.com", "username", "password");
mysql_select_db("yourdb");

$result = mysql_query("show table status");

$size = 0;
$out = "";
while($row = mysql_fetch_array($result)) {
    $size += $row["Data_length"];
    $out .= $row["Name"] .": ". 
               round(($row["Data_length"]/1024)/1024, 2) ."<br>\n";
}

$size = round(($size/1024)/1024, 1);

echo $out ."<br>\n";
echo "Total MySQL db size: $size";
?>
    
por 07.09.2009 / 16:41
1

Se você está procurando o tamanho real que o banco de dados ocupa no disco, encontre o tamanho do diretório data / dbname.

    
por 07.09.2009 / 17:15
0

Experimente este script:

SELECT 
    table_schema AS DataBase_Name
    ,ROUND(sum( data_length + index_length ) / 1024 /1024,1) AS OccupiedSize_inMB
    ,ROUND(sum( data_free )/ 1024 / 1024,1) AS FreeSpace_inMB 
FROM information_schema.TABLES 
GROUP BY table_schema ;
    
por 08.09.2015 / 11:20