Je voudrais écrire un script qui copie ma base sitedb1
de données actuelle sitedb2
sur la même instance de base de données mysql. Je sais que je peux vider le sitedb1 dans un script SQL:
mysqldump -u root -p sitedb1 >~/db_name.sql
puis importez-le dans sitedb2
. Existe-t-il un moyen plus simple, sans vider la première base de données dans un fichier SQL?
Réponses:
Comme le manuel le dit dans Copie de bases de données, vous pouvez diriger le vidage directement dans le client mysql:
Si vous utilisez MyISAM, vous pouvez copier les fichiers, mais je ne le recommanderais pas. C'est un peu douteux.
Intégré à partir de diverses bonnes autres réponses
Les deux commandes
mysqldump
etmysql
acceptent des options pour définir les détails de connexion (et bien plus encore), comme:De plus, si la nouvelle base de données n'existe pas encore, vous devez la créer au préalable (par exemple avec
echo "create database new_db_name" | mysql -u <dbuser> -p
).la source
mysqldump -uroot -p database1 | mysql -uroot -p database2
. Je suis invité pour les deux pws mais je ne peux en mettre qu'un. Les regards rapides comme ceci:Enter password: Enter password:
. Après avoir donné le premier pw, le processus attend indéfiniment.Utilisation des utilitaires MySQL
Les utilitaires MySQL contiennent le bel outil
mysqldbcopy
qui copie par défaut une base de données comprenant tous les objets associés («tables, vues, déclencheurs, événements, procédures, fonctions et attributions au niveau de la base de données») et les données d'un serveur de base de données vers le même ou vers un autre Serveur de base de données. Il existe de nombreuses options disponibles pour personnaliser ce qui est réellement copié.Donc, pour répondre à la question du PO:
la source
mysqldump
solution basée échouait.sudo apt-get install mysql-utilities
, mais c'est très soigné. Puis-je omettre le mot de passe et être invité à le saisir?mysqldbcopy
vous demander le mot de passe; au moins, je n'ai rien trouvé de tel dans la documentation. Vous pouvez cependant créer cette fonctionnalité vous-même. Dans Bash, cela pourrait ressembler un peu à ceci:mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
--force
à lamysqldbcopy
commande car j'avais déjà créé la base de données de destination. Merci!la source
Vous devez exécuter la commande depuis le terminal / l'invite de commande.
par exemple:
mysqldump -u root test_db1 | mysql -u root test_db2
Ceci copie test_db1 dans test_db2 et accorde l'accès à 'root' @ 'localhost'
la source
Le meilleur et le plus simple consiste à entrer ces commandes dans votre terminal et à définir les autorisations de l'utilisateur root. Travaille pour moi..!
la source
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
peut être problématique avec de grandes bases de données.Vous pouvez utiliser (en pseudocode):
La raison pour laquelle je n'utilise pas la syntaxe CREATE TABLE ... SELECT ... est de préserver les index. Bien sûr, cela ne copie que les tableaux. Les vues et les procédures ne sont pas copiées, bien que cela puisse être fait de la même manière.
Voir CRÉER UNE TABLE .
la source
Créez d'abord la base de données dupliquée:
Assurez-vous que les autorisations, etc. sont toutes en place et:
la source
Vous pouvez faire quelque chose comme ceci:
la source
Cette déclaration a été ajoutée dans MySQL 5.1.7 mais s'est avérée dangereuse et a été supprimée dans MySQL 5.1.23. Il était prévu de permettre la mise à niveau des bases de données antérieures à la version 5.1 afin d'utiliser le codage implémenté dans la version 5.1 pour mapper les noms de base de données aux noms de répertoire de base de données. Cependant, l'utilisation de cette instruction peut entraîner la perte du contenu de la base de données, raison pour laquelle elle a été supprimée. N'utilisez pas RENAME DATABASE dans les versions antérieures dans lesquelles il est présent.
Pour effectuer la tâche de mise à niveau des noms de base de données avec le nouveau codage, utilisez plutôt ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
la source
Un moyen simple de le faire si vous avez installé phpmyadmin :
Allez dans votre base de données, sélectionnez l'onglet "opération", et vous pouvez voir le bloc "copier la base de données vers". Utilisez-le et vous pouvez copier la base de données.
la source
Comme mentionné dans la réponse de Greg ,
mysqldump db_name | mysql new_db_name
c'est le moyen gratuit, sûr et facile de transférer des données entre des bases de données. Cependant, c'est aussi très lent .Si vous cherchez à sauvegarder des données, que vous ne pouvez pas vous permettre de perdre des données (dans cette base de données ou dans d'autres), ou si vous utilisez des tables autres que
innodb
, vous devriez utilisermysqldump
.Si vous cherchez quelque chose à développer, que toutes vos bases de données sont sauvegardées ailleurs et que vous êtes à l'aise pour purger et réinstaller
mysql
(éventuellement manuellement) lorsque tout va mal, alors j'ai peut-être la solution pour vous.Je n'ai pas pu trouver une bonne alternative, alors j'ai construit un script pour le faire moi-même. J'ai passé beaucoup de temps à faire fonctionner cela la première fois et honnêtement, cela me terrifie un peu d'y apporter des modifications maintenant. Les bases de données Innodb n'étaient pas destinées à être copiées et collées de cette manière. De petits changements provoquent un échec magnifique. Je n'ai pas eu de problème depuis que j'ai finalisé le code, mais cela ne veut pas dire que vous ne le ferez pas.
Systèmes testés sur (mais peuvent toujours échouer):
Ce qu'il fait
sudo
privilège et vérifie que vous disposez de suffisamment d'espace de stockage pour cloner la base de donnéesComment ça se compare avec
mysqldump
Sur une base de données de 3 Go, l'utilisation de
mysqldump
etmysql
prendrait 40 à 50 minutes sur ma machine. En utilisant cette méthode, le même processus ne prendrait que 8 minutes environ.Comment nous l'utilisons
Nous avons nos modifications SQL enregistrées avec notre code et le processus de mise à niveau est automatisé à la fois en production et en développement, chaque ensemble de modifications effectuant une sauvegarde de la base de données à restaurer en cas d'erreurs. Un problème que nous avons rencontré était lorsque nous travaillions sur un projet à long terme avec des changements de base de données, et que nous devions changer de branche au milieu pour corriger un bogue ou trois.
Dans le passé, nous utilisions une seule base de données pour toutes les branches et devions reconstruire la base de données chaque fois que nous passions à une branche qui n'était pas compatible avec les nouvelles modifications de la base de données. Et lorsque nous reviendrions, nous devions exécuter à nouveau les mises à niveau.
Nous avons essayé
mysqldump
de dupliquer la base de données pour différentes succursales, mais le temps d'attente était trop long (40 à 50 minutes), et nous ne pouvions rien faire d'autre entre-temps.Cette solution a réduit le temps de clonage de la base de données à 1/5 du temps (pensez à une pause café et salle de bain au lieu d'un long déjeuner).
Tâches courantes et leur temps
Le basculement entre les branches avec des modifications de base de données incompatibles prend plus de 50 minutes sur une seule base de données, mais pas du tout après l'heure de configuration initiale avec
mysqldump
ou ce code. Ce code se trouve être ~ 5 fois plus rapide quemysqldump
.Voici quelques tâches courantes et le temps approximatif qu'elles prendraient avec chaque méthode:
Créez une branche de fonctionnalités avec les modifications de la base de données et fusionnez immédiatement:
mysqldump
: 50-60 minutesCréez une branche de fonctionnalités avec les modifications de la base de données, passez à
master
une correction de bogue, apportez une modification sur la branche de fonctionnalités et fusionnez:mysqldump
: 50-60 minutesCréez une branche de fonctionnalité avec les modifications de la base de données, passez à
master
5 fois pour une correction de bogue tout en apportant des modifications sur la branche de fonctionnalité entre les deux, et fusionnez:mysqldump
: 50-60 minutesLe code
N'utilisez pas ceci sans avoir lu et compris tout ce qui précède.
Si tout se passe bien, vous devriez voir quelque chose comme:
la source
En plus de la réponse de Greg , c'est le moyen le plus simple et le plus rapide si le
new_db_name
n'existe pas encore:la source
Si vous avez des déclencheurs dans votre base de données d'origine, vous pouvez éviter l'erreur «Le déclencheur existe déjà» en envoyant un tuyau de remplacement avant l'importation:
la source
Je ne pense pas qu'il existe une méthode pour faire cela. Lorsque PHPMyAdmin fait cela, il vide la base de données puis la réinsère sous le nouveau nom.
la source