J'ai une base de données, dites abc
, dans le serveur MySQL. Il n'a qu'une seule table nommée test
. test
utilise un moteur Innodb et j'ai défini innodb_file_per_table
à vrai.
Après avoir exécuté la requête delete from abc.test
, Je veux calculer la taille de la base de données de abc
. Voici la requête que j'utilise:
SELECT
table_schema "name",
sum( IF(engine = "MyISAM", data_length + index_length - data_free,
data_length + index_length)) "size"
FROM information_schema.TABLES
where table_schema like "abc";
La chose étrange est que je trouve que la taille de la base de données ne diminue pas du tout, mais les données de "test" ont disparu.
J'ai fait ce type de test plusieurs fois, cet étrange comportement se produit parfois.
J'utilise percona mysql server 5.5.29-rel29.4.
Quelqu'un peut-il me dire ce qui ne va pas?
Mise à jour :
En fait, j'utilise un autre fil pour vérifier périodiquement la taille de la base de données.
Vous devez reconstruire la table afin de réduire le fichier IBD. Cette commande le fera:
optimize table abc.test;
Pour l'addition, lorsque vous supprimez des lignes dans le tableau. La table sera fragmentée. Retirez le fragment fera votre table. Optimiser la table comme Ike Walker a dit aidera.
La table d'optimisation fait des temps d'arrêt pour mysqld.
Je peux vous dire pourquoi /var/lib/mysql/abc/test1.ibd
n'a pas diminué.
La requête delete from abc.testl;
est une transaction DML
. Vous avez simplement supprimé toutes les données de la ligne. Si vous voulez récupérer l'espace physique de la .ibd
Fichier, vous devez utiliser DDL
au lieu de DML
. J'ai répondu à une question de cette nature sur Jan 17, 2012
: Problème avec les tailles de fichiers innodb "par table" .
Essayez ce qui suit DDL
Déclaration:
TRUNCATE TABLE abc.testl;
Si la table n'a pas de clés étrangères, vous pouvez le faire:
CREATE TABLE abc.test2 LIKE abc.test1;
DROP TABLE abc.test1;
ALTER TABLE abc.test2 RENAME abc.test1;
Voici ce que vous pouvez faire juste après une suppression complète de toutes les lignes:
DELETE FROM abc.testl;
ALTER TABLE abc.test1 ENGINE=InnoDB;
En ce qui concerne la vérification de l'espace, veuillez consulter mes messages avec des requêtes pouvant vous donner des tailles regroupées par des moteurs de stockage et enroulées en résumé:
Sep 13, 2011
: Détermination de la taille de la base de données Max et de la taille de la table pris en charge et la taille actuelleDec 01, 2011
: Tailles de base de données MySQL WorkbenchJan 11, 2013
: Traduire la taille de la sauvegarde sur la taille de la base de donnéesEssaie !!!