2010-01-17 7 views
3

Je rencontre des problèmes lors de la réimportation d'un vidage de base de données effectué par mysqldump. J'ai couru mysqldump avec l'option order-by-primary, et je l'ai fait fonctionner sur une table avec une clé unique (et pas de clé primaire explicite, donc triée par cette clé unique). Mon objectif dans ce cas était de recréer la table, en faisant la clé unique dans la clé primaire.Lignes entre deux entrées d'index?

Cette décharge a pris beaucoup de temps (environ 10 jours) et ce serait une grande douleur dans le cul de la faire fonctionner à nouveau. J'ai essayé de réimporter le vidage (avec les changements de schéma appropriés), mais mysql s'est étouffé à mi-chemin. J'ai regardé dans le fichier de vidage, à l'endroit où il s'est étouffé - et il semble que quelqu'un a inséré un email de spam directement dans le texte du fichier dump. Heureusement, il semble que les dégâts ont été isolés, je suis capable de voir la clé juste avant la poubelle, et juste après.

tl; dr: si je viens épissé les ordures, je ne sais pas combien de clés seront manquantes entre un avant et un après - la décharge est trié par cette clé unique, il rend la vie plus facile à cet égard. Est-ce que mysql a un moyen de récupérer toutes les lignes entre deux entrées dans un index?

La clé est une chaîne hexadécimale de 32 caractères, stockée dans une colonne de type CHAR (32). Je suis sûr que je ne peux pas utiliser les opérateurs < ou> sur les chaînes ... donc des suggestions?

+0

Bienvenue sur SO! 1ère question très sophistiquée. J'espère qu'il trouvera une bonne réponse. –

Répondre

2

Le tri de mysqldump sur la clé primaire (ou clé unique) est ce qui a fait que ça dure si longtemps. Dix jours est assez incroyable, cependant.

Ce type de tri n'est utile que si vous souhaitez sauvegarder une table MyISAM et la restaurer dans une table InnoDB. Est-ce ce que tu fais? MySQL a certainement un moyen de vider les sous-ensembles d'une table. Découvrez l'option --where de mysqldump. Cela devrait vous permettre de sauvegarder les lignes corrompues.

Et oui, vous pouvez utiliser < et > sur les chaînes dans SQL. Vous pouvez également utiliser le prédicat BETWEEN.

+0

Je suis en train de dumping d'innodb à insérer dans une table innodb. J'avais lu ailleurs qu'un ordre par le primaire est la chose à faire lors de l'insertion dans innodb. C'est une table de 43 Go, donc je m'attendais un peu au retard, je ne m'attendais pas à devoir le faire deux fois! – frank

1

Ma première question serait, comment un courrier indésirable pourrait-il le faire dans votre sauvegarde de base de données et le détruire?

Je suppose que cela provient d'une de vos colonnes de données, n'est-ce pas? Pouvez-vous montrer comment cet E-Mail et comment il a réussi à perturber la structure de votre décharge? Peut-être que c'était une sorte d'injection d'en-tête qui provoquait l'insertion de sauts de ligne là où ça ne devrait pas avoir, je ne sais pas. Quoi qu'il en soit, éclaircir cela serait la première priorité à mon avis.

+0

C'est la chose la plus étrange. J'ai fait la requête BETWEEN comme recommandé par Bill, et aucune des lignes ne semble avoir les données qui ont corrompu mon vidage. – frank

+0

Il est possible que le fichier de vidage soit corrompu, mais pas la base de données. –

Questions connexes