web-dev-qa-db-fra.com

Purger d'anciens enregistrements du fichier mysql ibdata1

Est-il possible de purger d'anciens enregistrements d'un fichier ibdata1 sans enlever la base de données attachée?

Les enregistrements qui ont été supprimés de la base de données sont toujours présents lorsque je numérise Ibdata1 pour les chaînes.

Je suis un peu conscient de la manière dont le fichier ibdata1 fonctionne et réalisez que ces parties du fichier seront probablement écrasées dans le temps, mais je dois éteindre ou supprimer d'autrement les anciennes données afin qu'elle ne soit plus stockée sur le serveur sous quelque forme que ce soit.

Est-ce qu'il y a de toute façon pour le faire sans prendre la base de données?

3
Andrew Clinton

Ce que vous demandez n'a jamais été documenté ou tenté.

Cependant, j'ai répondu à deux postes comme celui-ci dans le passé:

J'ai une suggestion supplémentaire pour les données que vous allez supprimer, à l'avenir. Vous devrez mettre un bon effort de développeur dans celui-ci:

Avant de laisser tomber une table, vous devriez

  • aller à chaque valeur int et flotter et faites-les 0
  • allez dans chaque champ de charcuterie et de texte [.____]
    • obtenez la longueur du champ
    • mettez à jour la colonne avec le même nombre d'octets avec tous les XS ou tous les 0s

Vous devrez examiner l'entrée en informations_schema.Columns pour chaque colonne pour déterminer laquelle est numérique et qui est le caractère. Une fois que vous avez écrasé manuellement toutes les données dans l'ancienne table, vous êtes libre de le laisser tomber, sachant que vous avez masqué les données à l'avance.

CAVEAT

Si toutes vos tables InnoDB n'ont aucune contrainte/touches étrangères , voici quelque chose que vous pouvez faire pendant un certain temps.

  • Convertir toutes les tables InnoDb à Myisam
  • Arrêter mysql
  • supprimer ibdata1
  • Startup mysql
  • Convertir ces tables myisam en arrière à innodub

Je ne peux pas prendre de crédit pour cette idée. Shlomi Noach le suggère le 19 septembre 201 .

Si la DB n'est pas trop grande, voici comment vous pouvez le scripter.

MYSQL_USER=root
MYSQL_PASS=password
MYSL_CONN="-u${MYSQL_CONN} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_MyISAM.sql
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_InnoDB.sql
mysql ${MYSQL_CONN} -ANe"SET GLOBAL innodb_fast_shutdown = 0"

À ce stade, regardez les deux scripts de vi ou less.

Si vous êtes satisfait du code, vous pouvez le faire:

mysql ${MYSQL_CONN} < Convert_To_MyISAM.sql
service mysql stop
rm -f /var/lib/mysql/ibdata1
service mysql start
mysql ${MYSQL_CONN} < Convert_To_InnoDB.sql

Essaie !!!

2
RolandoMySQLDBA

Votre meilleur pari est de créer une réplique avec un sous-système InnoDB frais sans données héritées dans le fichier ibdata1. Ceci est trivial et doit être fait avec un outil de sauvegarde logique tel que MyDumper ou MySqldump. Xtrabackup apportera une copie binaire du fichier ibdata1 et de telles chaînes de fantôme existeront également dans ce fichier. Une fois que votre réplique est construite, restaurée et à jour, vous pouvez repoints votre application pour utiliser la nouvelle instance. Avec l'ancien, dans le nouveau temps d'arrêt minimal.

0
eroomydna

Vous pouvez essayer cette méthode:

1) Prenez une vidage de toutes les tables InnoDB à l'aide de MySqldump ou de tout autre outil de sauvegarde

2) Maintenant éditer my.cnf et préciser

innodb_file_per_table = 1

3) Redémarrez le serveur MySQL

4) Importer maintenant la décharge qui a des tables innodubes

5) Supprimer maintenant l'ancien fichier ibdata1

* Innodb_file_per_table * est pris en charge uniquement pour MySQL Server V5.6.6 ou supérieur

Historiquement, toutes les tables et indices innodub ont été stockés dans l'espace de table du système. Cette approche monolithique a été ciblée dans des machines entièrement dédiées au traitement de la base de données, avec une croissance de données soigneusement planifiée, où tout stockage de disque alloué à MySQL ne serait jamais nécessaire à d'autres fins. Le mode File-Per-Table d'InnoDB est une alternative plus flexible, où vous stockez chaque table InnoDB et ses index dans un fichier séparé.

Avantages de l'utilisation d'innoDB_FILE_PER_TABLE

  1. Vous pouvez récupérer l'espace disque de système d'exploitation lors de la tronquage ou de la chute d'une table.

  2. L'opération TRONCATE TABLE est plus rapide lorsque vous exécutez des fichiers individuels .ibd.

  3. Vous pouvez stocker des tables spécifiques sur des périphériques de stockage distincts, pour l'optimisation des E/S, la gestion de l'espace ou la sauvegarde. Dans les versions précédentes, vous deviez déplacer des répertoires entiers de base de données vers d'autres lecteurs et créer des liens symboliques dans le répertoire de données MySQL.

  4. Vous pouvez déplacer des tables individuelles InnoDB plutôt que des bases de données entières.

  5. Utilisation d'Innodb_File_Per_Table peut améliorer les chances d'une récupération réussie et de gagner du temps si une corruption se produit, un serveur ne peut pas être redémarré, ni sauvegarde et des journaux binaires ne sont pas disponibles.

Référence: http://dev.mysql.com/doc/refman/5.6/fr/innodb-multiples-tablespaces.html

0
Mahesh Patil