web-dev-qa-db-fra.com

Supprimer la table MySQL avec des transactions en attente

Existe-t-il un moyen de supprimer une table ou une base de données InnoDB avec des transactions en attente dans MySQL (de préférence au niveau du système de fichiers)?

Qu'est-il arrivé:

J'utilise MySQL 5.5.28 et Ran LOAD DATA INFILE… Pour importer un ensemble de données énormes (lignes de 300 m) dans une table InnoDB. Je n'ai pas utilisé set autocommit = 0; avant. Malheureusement, mysqld a été arrêté au milieu de l'importation.

Lorsque je redémarre mysql _, il essaie de faire rouler la transaction remplissant le journal du système avec des messages comme celui-ci:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: En attente de 1 transactions actives pour terminer

Le problème est que le back-back est en cours d'exécution pour plus que 25 heures actuellement au cours de laquelle mysqld n'accepte pas de connexions de socket.

Je ne peux pas simplement supprimer /var/lib/mysql/* Et commencez à partir de zéro car il existe également d'autres bases de données innoDb sur cette machine. Cependant, la table problématique est la seule table dans une base de données distincte. La suppression de la table entière ou de l'ensemble de la base de données n'est pas un problème car je peux réimporter toutes les données par la suite.

10
dasup

Il n'y a rien que vous puissiez vraiment faire parce qu'un retour est en cours de rétablissement via (( l'épise d'annulation à l'intérieur Ibdata1 , qui devrait être devenu immensément .

Si vous tuez le processus MySQLD et redémarrez MySQL, il suffira de ramasser l'endroit où il s'est arrêté dans le cadre du cycle de récupération des crash.

Disclaimer: Non responsable de la perte de données

Ce que vous pourriez faire peut entraîner une perte de données pour d'autres tables, mais vous pouvez faire quelque chose pour contourner le cycle de récupération normale de l'interruption d'InnoDB.

Il y a une option de démarrage appelée innodb_force_recovery , ce qui vous permet de contourner divers stades de la récupération des crashs Innodb.

Selon - (( documentation MySQL sur la récupération InnoDB , voici les paramètres et ses effets:

1 (SRV_FORCE_IGNORE_CORRUPT)

Laissez le serveur exécuter même s'il détecte une page corrompue. Essayez de sélectionner * à partir de Tbl_Name Sauter sur des enregistrements d'index corrompus et des pages, ce qui aide à les tables de dumping.

2 (SRV_FORCE_NO_BACKGROUND)

Empêcher le fil principal de courir. Si un accident se produirait pendant l'opération de purge, cette valeur de récupération l'empêche.

3 (SRV_FORCE_NO_TRX_UNDO)

N'exagorez pas les annulations de transaction après la récupération de l'accident.

4 (SRV_FORCE_NO_IBUF_MERGE)

Prévenir les opérations d'insertion de la mémoire tampon. S'ils causeraient un crash, ne les faites pas. Ne calculez pas les statistiques sur le tableau.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Ne regardez pas les journaux annulaires lors du démarrage de la base de données: Innodb traite même des transactions incomplètes comme engagées.

6 (SRV_FORCE_NO_LOG_REDO)

Ne faites pas le jeu de journal de Redo en direct dans le cadre de la récupération.

Avec des changements transactionnels enterrés dans les journaux annulaires et redo, vous exécutez le risque de

  • perdre des données destinées à être écrites
  • garder les données destinées à être supprimées

Si vous attendez des effets secondaires mauvais, sauvegardez l'ensemble/var/lib/mysql et le mettre quelque part au cas où vous souhaitez copier ibdata1, ib_logfile0 et ib_logfile1 et réessayez la récupération normale.

Si MySQL est complètement en place dans l'un des modes

  • mysqldump toutes les données sauf la table incriminée
  • arrêter mysql
  • supprimer tout dans/var/lib/mysql sauf/var/lib/mysql/mysql
  • commencer mysql
  • recharger le mysqldump

CAVEAT: Assurez-vous de sauvegarder tout !!!

J'espère que ça aide !!!

8
RolandoMySQLDBA

J'ai eu une situation similaire cette semaine.

Et après quatre itérations de restauration d'une sauvegarde complète sur un serveur de test et de tenter de déposer, de supprimer ou de tuer les tables avec les transactions en attente géantes, nous sommes arrivés à vendredi après-midi et ont décidé de le laisser courir. Plus de trois jours, la transaction est terminée avec une charge de serveur négligeable et la base de données était bien. Ce qui était beaucoup mieux que l'une des opérations manuelles sur les fichiers .frm et les tables MySQL qui avaient essayé et ont échoué.

Ma solution: Ne le supprimez pas. Permettez aux transactions en attente de terminer, même si vous devez reporter d'autres opérations pendant quelques jours ou trouver un espace disque quelque part ou laisser votre serveur esclave prendre la charge.

1
andrew lorien