Cansado de tener que averiguar manualmente cuanto espacio ocupan mis bases de datos, acabo de crear un procedimiento almacenado para tener una vista global de las bases de datos que tenemos en nuestro servidor MySQL.
En MySQL no hay disponible un comando que nos permita tener una resumen global de las bases de datos, algo que se parezca a SHOW TABLE STATUS pero para todas las bases de datos. El comando SHOW DATABASES sólo lista las bases actuales pero no nos dice cuanto espacio ocupan o cuantas tablas hay, etc.
El procedimiento que escribí esta basado en la base de datos INFORMATION_SCHEMA, que contiene mucha información de todas las bases de datos existentes.
Ya antes en un post anterior mencioné que podemos tener todas estas «herramientas» en una base de datos llamada tools, es por eso que recomiendo que éste procedimiento este en la misma base de datos tools (pero de todos modos puedes elegir otro lugar)
Al llamar al procedimiento si tenemos una vista global con información que nos será de utilidad para tas tareas de mantenimiento.
mysql> call tools.sp_overview();
+------------------------------+---------+--------+----------+---------+
| Database | Charset | Tables | Routines | Size Mb |
+------------------------------+---------+--------+----------+---------+
| database1 | utf8 | 43 | 28 | 7.0 |
| database2 | latin1 | 43 | 28 | 205.0 |
| database3 | utf8 | 116 | 0 | 126.2 |
| database4 | utf8 | 99 | 0 | 0.3 |
| database5 | utf8 | 165 | 0 | 77.4 |
| database6 | utf8 | 121 | 2 | 719.4 |
| database7 | utf8 | 122 | 0 | 91.3 |
| database8 | utf8 | 116 | 0 | 89.7 |
| database9 | utf8 | 124 | 0 | 4.5 |
| database10 | utf8 | 113 | 0 | 147.7 |
| database11 | latin1 | 119 | 3 | 436.4 |
| database12 | latin1 | 122 | 0 | 439.1 |
| database13 | latin1 | 122 | 4 | 452.7 |
| database14 | utf8 | 115 | 0 | 273.0 |
| database15 | utf8 | 122 | 0 | 265.5 |
| database16 | utf8 | 0 | 0 | NULL |
| database17 | latin1 | 26 | 0 | 0.9 |
| database18 | latin1 | 9 | 0 | 0.0 |
| database19 | latin1 | 22 | 0 | 0.3 |
+------------------------------+---------+--------+----------+---------+
19 rows in set (3.01 sec)
Advierto que la primera vez el procedimiento es muy lento, y puede demorar varios segundos.
Aquí tienen El código fuente del procedimiento:
DELIMITER $$
DROP PROCEDURE IF EXISTS tools.sp_overview$$
CREATE PROCEDURE tools.sp_overview()
BEGIN
SELECT s.SCHEMA_NAME as `Database`, s.DEFAULT_CHARACTER_SET_NAME as `Charset`,
count(t.TABLE_NAME) as `Tables`,
(SELECT count(*) from information_schema.ROUTINES as r
WHERE r.routine_schema = s.SCHEMA_NAME) as `Routines`,
round(sum(t.DATA_LENGTH + t.INDEX_LENGTH) / 1048576 ,1) as `Size Mb`
FROM information_schema.SCHEMATA AS s
LEFT JOIN information_schema.TABLES t on s.schema_name = t.table_schema
WHERE s.SCHEMA_NAME not in ('information_schema', 'performance_schema')
GROUP BY s.SCHEMA_NAME;
END$$
DELIMITER ;