Le moyen le plus rapide pour copier une grande table MySQL?
Quel est le meilleur moyen pour copier une grande table MySQL en termes de vitesse et mémoire utiliser?
L'Option 1. À l'aide de PHP, sélectionnez X lignes de vieille table et les insérer dans le nouveau tableau. Passez à la prochaine itération de select/insert jusqu'à ce que toutes les données sont copiées.
L'Option 2. Utiliser MySQL INSERT INTO ... SELECT
sans limites de ligne.
Option 3. Utiliser MySQL INSERT INTO ... SELECT
avec un nombre limité de lignes copiées par run.
EDIT: je ne vais pas l'utiliser mysqldump. Le but de ma question est de trouver la meilleure façon d'écrire un programme de conversion de base de données. Certains tableaux ont changé, d'autres pas. J'ai besoin d'automatiser l'ensemble de la copie de /procédure de conversion sans se soucier manuellement dumping toutes les tables. Donc, il serait utile si vous pouviez répondre laquelle des options ci-dessus est la meilleure.
OriginalL'auteur akanevsky | 2013-05-23
Vous devez vous connecter pour publier un commentaire.
Sur trois options énumérées ci-dessus.
Je voudrais sélectionnez la deuxième option si vous avez une contrainte Unique sur au moins une colonne, donc de ne pas créer de doublons si le script doit être exécuté plusieurs fois pour atteindre sa tâche dans le cas de délais d'attente du serveur.
Sinon votre troisième option serait la voie à suivre, alors manuellement en tenant compte des délais d'attente du serveur pour déterminer votre insert select limites.
J'ai juste édité ma réponse pour le détailler un peu. J'ai dû passer un sql db à une base de données mysql format récemment. Je sortie de chaque ligne dans la table SQL comme une requête d'insertion dans un fichier, puis l'utilisation de php pour faire une boucle dans le fichier et l'insérer dans la table mysql, ce tableau a 1 millions de dollars plus les lignes et nécessaire à plusieurs reprises pour être couru pour toutes les lignes à insérer dans la table de destination. J'ai trouvé que les tables avec les contraintes Unique je pourrais vous suffit d'exécuter le fichier plusieurs fois jusqu'à ce que toutes les lignes ont été ajoutées. Dans le cas de la table n'ont pas une contrainte, chaque fois que le fichier a couru elle serait d'insérer des lignes à partir du début(naturellement).
OriginalL'auteur varubi
Il y a un programme qui a été écrit spécifiquement pour cette tâche appelée mysqldump.
Cela ne fonctionne pas pour moi. Voir l'édition ci-dessus.
aide-moi! Merci!
OriginalL'auteur Gung Foo
Utiliser une procédure stockée
Option deux doit être plus rapide, mais ça va être une très longue opération. Vous devriez chercher à faire une procédure stockée faire la copie. Cette façon, vous pouvez décharger de certaines des données d'analyse/de manipulation de la base de données MySQL moteur.
OriginalL'auteur mogul
Si possible, le moyen le plus rapide sera de prendre la base de données hors ligne et il suffit de copier les fichiers de données sur le disque.
Bien sûr, cela a certaines exigences:
Ah, je vois que vous avez édité votre post, alors je pense que cette DBA-de-l'enfer approche n'est pas une option... mais quand même, c'est rapide!
la copie de fichiers de données n'est pas garantie sans problème, même si la base de données.
Non, il n'est pas sans poser de problèmes, il exige de vous que vous savez ce que vous faites et de dépendances de données. Mais alors.. c'est rapide!
Vous pouvez copier une seule table de base de données, pas tout cela, à l'aide de cette méthode. Et en fait, vous pouvez le faire si mysql est en cours d'exécution. Tout ce que vous avez à faire est de verrouiller la table, le rincer, puis copiez les fichiers (TABLEAU.frm, TABLE.MYI et de la TABLE.MYD) de nouveaux fichiers à l'aide d'un schéma cohérent de nommage (NEW_TABLE.frm, NEW_TABLE.MYI, et NEW_TABLE.MYD).
OriginalL'auteur mogul
La meilleure façon que j'ai trouver pour l'instant est de créer les fichiers comme des fichiers de vidage(.txt), en utilisant la outfile à un texte, puis à l'aide de infile dans mysql pour obtenir les mêmes données pour la base de données
OriginalL'auteur user3422575
MySQL
load data
requête est plus rapide que n'importe quoi d'autre, mais il faut l'exportation de chaque tableau vers un fichier CSV.Une attention particulière pour échapper les caractères et représentant
NULL
/valeurs des données binaires/etc dans un fichier CSV pour éviter la perte de données.OriginalL'auteur Abhi Beckert
mysqldump est un outil formidable en termes de simplicité et de manipulation soigneuse de tous les types de données, mais il n'est pas aussi rapide que load data infile
Si vous copiez sur la même base de données, j'aime cette version de l'Option 2:
a) CRÉER une TABLE foo_new COMME foo;
b) INSÉRER DANS foo_new SELECT * from foo;
J'ai beaucoup de tables avec des centaines de millions de lignes (comme 1/2B) ET InnoDB ET de plusieurs touches ET les contraintes. Ils prennent de nombreuses de nombreuses heures à lire à partir d'un dump MySQL, mais seulement une heure ou deux par load data infile. Il est exact que la copie des fichiers raw avec la DB en mode hors connexion est encore plus rapide. Il est également exact que les caractères non-ASCII, binaire, et les Zéros doivent être traitées avec soin, CSV (ou fichiers délimités par des tabulations), mais heureusement, j'ai assez bien obtenu des numéros et du texte :-). Je pourrais prendre le temps de voir combien de temps les étapes ci-dessus en a) et b) de prendre, mais je pense qu'ils sont plus lentes que les load data infile... ce qui est probablement en raison de transactions.
OriginalL'auteur Tom Transue