web-dev-qa-db-fra.com

Mysql informations_schema ne met pas à jour

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.

5
Eagle

Vous devez reconstruire la table afin de réduire le fichier IBD. Cette commande le fera:

optimize table abc.test;
2
Ike Walker

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.

1
Luke Nguyen

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é:

Essaie !!!

0
RolandoMySQLDBA