2008-10-08 14 views

Respuesta

26

Tengo grandes grandes consultas para compartir:

Ejecutar esto para conseguir el uso total de datos MySQL y el Índice Por Motor de almacenamiento

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; 

Ejecutar esto para conseguir el uso total de datos MySQL y el Índice Por Base de datos

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); 

Ejecutar esto para conseguir el uso total de datos MySQL y el índice por la base de datos y motor de almacenamiento

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; 

Claves clínicas

En cada consulta, verá (SELECT 3 pw). El pw significa Power Of 1024 para mostrar los resultados.

  • (SELECT 0 pw) mostrará el informe en Bytes
  • (SELECT 1 pw) mostrará el informe en kilobytes
  • (SELECT 2 pw) mostrará el informe en megabytes
  • (SELECT 3 pw) mostrará el informe en gigabytes
  • (SELECT 4 pw) mostrará el informe en terabytes
  • (SELECT 5 pw) mostrará el informe en PetaBytes (por favor ponerse en contacto conmigo si ejecuta éste)

Aquí es una consulta de informe con un poco menos de formato:

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; 

Confía en mí, hice estas consultas hace más de 4 años y todavía los utilizan hoy en día.

ACTUALIZACIÓN 24/06/2013 15:53 ​​EDT

tengo algo nuevo. He cambiado las consultas de modo que usted no tiene que establecer el parámetro para diferentes pw unidad muestra. La pantalla de cada unidad se calcula para usted.

Informe Por Motor de almacenamiento

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; 

Informe de base de datos Por

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; 

Informe Por Base de Datos/motor de almacenamiento

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

Probablemente debería editar su pregunta y poner 4 espacios delante de cada línea que debería aparecer como código. –

+0

¿hay alguna razón particular para LPAD a 17? – Bee

+2

@Bhathiya Utilizo 17 debido a la salida de la función 'FORMAT'. El billón número uno tiene 13 dígitos. Al ejecutar 'FORMAT (1000000000000,0)' aparece '1,000,000,000,000'. Observe que se agregan 4 comas. Por lo tanto, utilizo 17 para acomodar columnas de visualización pequeñas al lado de columnas de visualización más grandes, dando al informe un aspecto uniforme. Puede experimentar con valores de ancho distintos de 17 ya que no afecta el cálculo del espacio en disco. – RolandoMySQLDBA

4

Si solamente MySQL está disponible, utilice el comando SHOW TABLE STATUS, y un vistazo a la columna de la Data_length para cada mesa, que es en bytes.

Si tiene otros idiomas disponibles en la máquina, un script en cualquiera de ellos que se ejecuta regularmente (cron), verifica el espacio libre o el tamaño del directorio de la base de datos, y lo actualiza por correo electrónico o de otra manera. Hay demasiadas opciones para sugerir una solución en particular, depende de su situación.

0

Para tablas MyISAM, por lo general comprobar el tamaño de la var/lib/mysql/MyDatabaseName/directorio /. Las tablas InnoDB usan archivos monolíticos, por lo que debe usar SHOW TABLE STATUS.

0

Puesto que usted tiene VM y no me importa cómo se usa el espacio, Creo que la forma más simple es verificar el tamaño de los datos de MySQL d ir Por defecto es /var/lib/mysql. También sería bueno limpiar los registros binarios de mysql (si es posible) antes de verificar el tamaño del directorio de datos.

0

Se puede hacer referencia MONyog que tiene función en Información del disco que le permite encontrar a cabo análisis de espacio en disco a nivel de servidor, el nivel de base de datos y al nivel de la tabla

+1

Hola, como esta es su primera respuesta, primero compruebe si su respuesta ya existe, como [lo hace] (http://stackoverflow.com/a/23289446/2844473). En ese caso, es mejor __uprimir__ esa respuesta en lugar de decir exactamente lo mismo. – MarijnS95

0
du -s /var/lib/mysql/* | sort -nr 

Resultado

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 se mostrará como orden descendente en kb

Cuestiones relacionadas