le dump de la table sans dumping de la clé primaire
J'ai une table qui s'étend sur deux serveurs exécutant MySql 4. J'ai besoin de fusionner en un seul serveur pour notre environnement de test.
Ces tables a littéralement des millions de documents chaque, et la raison pour laquelle ils sont sur deux serveurs est à cause de l'énorme comment ils sont. Toute modification et de la pagination de l'tableaux nous donnent trop énorme de performances.
Parce qu'ils sont dans un environnement de production, il est impossible pour moi de les modifier en aucune manière sur leurs serveurs existants.
La question est la clé primaire est unique auto-incrémentation de champ, il y a donc des intersections.
J'ai été à essayer de comprendre comment utiliser la commande mysqldump à ignorer certains domaines, mais l'option --disable-clés simplement modifie la table, au lieu de se débarrasser des touches complètement.
À ce point, il est à la recherche comme je vais avoir besoin de modifier la structure de base de données à utiliser une somme de contrôle ou de hachage de la clé primaire de la combinaison des deux champs uniques qui devraient effectivement être unique... je n'ai vraiment pas envie de le faire.
Aider!
Vous devez vous connecter pour publier un commentaire.
si vous ne vous souciez pas de ce que la valeur de la colonne auto_increment sera, ensuite, il suffit de charger le premier fichier, renommez la table, puis recréer la table et de les charger dans le second fichier. enfin, l'utilisation
Pour résoudre ce problème, j'ai regardé cette question, trouvé @pumpkinthehead réponse, et réalisé que tout ce que nous devons faire est de trouver+remplacer la clé primaire de chaque ligne avec la valeur NULL pour que mysql va utiliser la valeur par défaut de type auto_increment de la valeur à la place.
(your complete mysqldump command) | sed -e "s/([0-9]*,/(NULL,/gi" > my_dump_with_no_primary_keys.sql
Sortie d'origine:
Transformée De Sortie:
Remarque: C'est toujours un hack; Par exemple, il ne sera pas si votre auto-incrémentée n'est pas la première colonne, mais résout mon problème de 99% du temps.
Vous pouvez créer une vue de la table sans la colonne de clé primaire, puis exécutez la commande mysqldump sur ce point de vue.
Donc, si votre table "utilisateurs" a l'colonnes: id, nom, e-mail
Edit: ah je vois, je ne suis pas sûr si il y a d'autres façon-là.
C'est une douleur totale. Je contourner ce problème en exécutant quelque chose comme
sur la décharge à se débarrasser des clés primaires et puis
pour toutes les colonnes à l'exception de la clé primaire. Bien sûr, vous devez être attentif à ce que
([0-9]*,
ne remplace pas tout ce que vous voulez vraiment.Espère que ça aide quelqu'un.
i
drapeau de l'expression régulière, mais sinon, cela a fonctionné comme un charme! Merci!mysqldump --complete-insert ...
.Pour l'ajout fanciness, vous pouvez définir un avant d'insérer déclencheur sur réception de votre table qui définit la nouvelle clé primaire pour atteindre la ligne avant l'insertion se produit, en utilisant régulièrement des décharges et continuent de nettoyer votre pk. Pas testé, mais sentir assez confiant sur ce sujet.
Utiliser un mannequin temporaire de clé primaire:
Utilisation
mysqldump
normalement--opts -c
. Par exemple, votre clé primaire est "id".Modifier les fichiers de sortie et d'ajouter une ligne "dummy_id" à la structure de votre table avec le même type de " id " (mais pas de clé primaire bien sûr). Puis modifier la
INSERT
déclaration et remplacer 'id' par 'dummy_id'. Une fois importés, la baisse de la colonne 'dummy_id'.jimyi était sur la bonne voie.
C'est une des raisons pour lesquelles autoincrement touches sont un pain PITA. Une solution est de ne pas supprimer des données, mais d'ajouter à elle.
(où $x est un chiffre unique qui identifie de manière unique la base de données d'origine), soit la création de la vue sur la base de données source (qui vous astuce peut ne pas être possible) ou l'utilisation d'un extrait de routine comme celle décrite par l'Autocratie ou charger les données dans les tables intermédiaires sur la zone test.
Alternativement, ne pas créer la table sur le système de test au lieu de mettre dans des tableaux séparés pour les données du src, puis créer une vue qui récupère des deux:
C.
La solution que j'ai utilisé est de faire juste un SQL standard d'exportation de données, je suis d'exportation, puis retirer la clé primaire de l'insert à l'aide d'une RegEx trouver&remplacement de l'éditeur. Personnellement, j'utilise Sublime Text, mais je suis sûr que TextMate, Notepad++ etc. pouvez faire la même chose.
Je viens d'exécuter la requête dans laquelle jamais de la base de données les données doivent être insérés par copier-coller la requête en HeidiSQL de la fenêtre de requête ou de PHPMyAdmin. Si il y a un BEAUCOUP de données que j'ai enregistrer la requête d'insertion d'un fichier SQL et l'utilisation d'importation de fichier à la place. Copie & coller avec d'énormes quantités de texte fait souvent de Chrome gel.
Cela peut sembler beaucoup de travail, mais j'utilise rarement plus de quelques minutes entre l'exportation et l'importation. Probablement beaucoup moins que je voudrais utiliser sur la solution retenue. J'ai utilisé cette méthode de solution sur plusieurs centaines de milliers de lignes sans problème, mais je pense que cela deviendrait problématique lorsque vous atteignez les millions.
J'aime la table temporaire itinéraire.
Comme les autres, ce n'est pas un one-size-fits-all solution (surtout étant donné OP millions de lignes), mais même à 10^6 lignes, il faut plusieurs secondes à s'exécuter, mais fonctionne.