Le moyen le plus simple de copier une table d'une base de données à une autre?

151

Quelle est la meilleure méthode pour copier les données d'une table d'une base de données vers une table d'une autre base de données lorsque les bases de données sont sous des utilisateurs différents?

Je sais que je peux utiliser

INSERT INTO database2.table2 SELECT * from database1.table1

Mais ici, le problème est que les deux database1et database2sont sous différents utilisateurs MySQL. Donc user1peut accéder database1uniquement et user2peut database2uniquement accéder . Une idée?

Sparky
la source
6
Vous pouvez accorder des attributions de niveau table aux utilisateurs. voir: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh
2
Malheureusement, cela ne fonctionnera pas dans mon cas, car j'utilise un serveur d'hébergement partagé Godaddy. Ils ne permettront pas de faire de telles choses avec la base de données.
Sparky
@mmdemirbas Une table de la base de données contient près d'un million de lignes. Le vidage de la base de données sera énorme. De plus, lorsque j'ai essayé d'exporter, seulement environ 10000 lignes sont exportées - probablement en raison de la grande taille.
Sparky
Je sais que vous pouvez utiliser RENAME pour déplacer des tables, et c'est super rapide. Existe-t-il une astuce équivalente pour copier des tables?
Dan
BTW: Vous devrez vous assurer que la liste des champs est dans le même ordre dans les deux tables. Sinon, il sera nécessaire de sélectionner les champs par leur nom dans la table de database1 afin qu'ils correspondent aux champs corrects de la table de database2. Ce problème est venu pour moi où j'avais sauvegardé une base de données où table1 a été modifiée après la création initiale, et la nouvelle base de données où elle a été créée à partir d'un fichier mysqldump.
Steve L

Réponses:

113

Si vous avez un accès shell, vous pouvez utiliser mysqldumppour vider le contenu de database1.table1et le diriger mysqlvers database2. Le problème ici est que table1c'est toujours table1.

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

Vous devez peut-être renommer table1en table2avec une autre requête. D'un autre côté, vous pouvez utiliser sed pour changer table1 en table2 entre les tubes en.

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Si table2 existe déjà, vous pouvez ajouter les paramètres au premier mysqldump qui ne permettent pas de créer la table crée.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
Helmor
la source
Le problème avec ceci est quand il est automatisé, vous devez montrer le mot de passe. Si ce n'est pas automatisé et effectué par l'utilisateur à partir de la ligne de commande, c'est ok.
Nelles le
100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

où db1 est la destination et db2 est la source

viande principale
la source
Cela fonctionne-t-il si les deux utilisateurs ne sont pas autorisés à sélectionner des données l'un de l'autre?
Beryllium
1
cela ne fonctionnera pas sur différents serveurs mysql?
PUG
8
Cela ne copie pas les index
bcoughlan
@Beryllium non cela nécessite que l'utilisateur dispose des autorisations pour les deux bases de données. jaminator non cela ne fonctionnera pas sur différents serveurs, mais je ne pense pas que la question se posait à ce sujet. bcoughlan vous avez raison. c'est un gros défaut dans cette approche: elle ne préserve pas correctement la structure de la table.
thomasrutter
4
La table copiée n'avait pas de clé primaire et d'incrémentation automatique. Vous devez exécuter ceci aprèsALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
61

Si vous utilisez PHPMyAdmin, cela pourrait être très simple. Supposons que vous disposiez des bases de données suivantes:

DB1 & DB2

DB1 a une table des utilisateurs que vous souhaitez copier dans DB2

Sous PHPMyAdmin, ouvrez DB1, puis accédez à la table des utilisateurs.

Sur cette page, cliquez sur l' onglet "Opérations" en haut à droite. Sous Opérations, recherchez la section Copier la table vers (database.table):

& vous avez terminé!

Mekey Salaria
la source
1
Mort simple! C'est à ce moment que je peux célébrer ma paresse!
Daniel Dut
1
Vous économisez mon temps .. je faisais une approche naïve .. d'abord exporter puis importer.
Hamza Zafeer
1
Aucune des autres réponses ne fonctionne, seulement la vôtre qui copie également l'index
Bsienn
1
Cela ne fonctionnerait pas si la table était particulièrement volumineuse, c'est-à-dire supérieure à 4 Go. Par exemple, j'ai une table de 22 Go avec laquelle phpMyAdmin ne peut tout simplement pas fonctionner.
Mark D
1
Réponse parfaite. Je ne connaissais pas cette fonctionnalité de phpmyadmin.
zookastos
23

MySql Workbench : fortement recommandé

Outil de migration de base de données depuis MySql Workbench

Cela permettra de gérer facilement les problèmes de migration. Vous pouvez migrer les tables sélectionnées des bases de données sélectionnées entre MySql et SqlServer. Vous devriez absolument essayer.

mmdemirbas
la source
Je suis sur le point de tenter le coup, je l'ai configuré mais je me demande si vous avez comparé la mysql Workbenchmigration à SQLYogla copie de la base de données de? D'après mon aperçu rapide, il semble qu'ils sont très similaires, mais mysql workbench est une fonctionnalité plus récente
wired00
Non, je n'ai pas essayé SQLYog.
mmdemirbas
Il n'est pas évident de migrer vers SQL Server à partir de MySQL à l'aide de MySql workbench. Je suis dans Workbench et je ne trouve aucun indice de l'aide ou de l'interface utilisateur. Je sais que le SSMA pour MySQL fonctionne pour moi.
subsci
2
Intéressant, mais le programme a attrapé la migration avec une grande base de données, la ligne de commande fonctionnait mieux.
Claudionor Oliveira
1
@mmdemirbas, " Vous pouvez migrer des tables sélectionnées de bases de données sélectionnées entre MySql et SqlServer. " La question de l'OP ne concerne cependant pas SQL Server.
sampablokuper
19

J'utilise Navicat pour MySQL ...

Cela facilite toutes les manipulations de bases de données!

Sélectionnez simplement les deux bases de données dans Navicat, puis utilisez.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1
Nick M
la source
13

Je sais que c'est une vieille question, il suffit de répondre pour que quiconque débarque ici ait une meilleure approche.

Depuis la version 5.6.10, vous pouvez faire

CREATE TABLE new_tbl LIKE orig_tbl;

Reportez-vous à la documentation ici: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

Mir Adnan
la source
1
Il ne copiera pas les données! Lisez la documentation que vous avez référencée:> ** CREATE TABLE ... LIKE ne conserve aucune
donnée
11

Si vos tables sont sur le même serveur mysql, vous pouvez exécuter ce qui suit

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
la source
qu'en est-il des autres index?! La question indique de copier un tableau non seulement ses données
Jorj
9

Utilisez la fonctionnalité d'exportation et d'importation de MySql Workbench. Étapes:
1. Sélectionnez les valeurs souhaitées

E.g. select * from table1; 
  1. Cliquez sur le bouton Exporter et enregistrez-le au format CSV.
  2. créer une nouvelle table en utilisant des colonnes similaires à la première

    E.g. create table table2 like table1; 
  3. tout sélectionner dans le nouveau tableau

    E.g. select * from table2;  
  4. Cliquez sur Importer et sélectionnez le fichier CSV que vous avez exporté à l'étape 2

Exemple de boutons Exporter et Importer dans MySql Workbench

biniam
la source
1
Cela ne fonctionne que pour les tables avec moins d'un milliard de lignes, je pense.
Diogo Paim du
9

Voici un autre moyen simple:

  1. utilisez DB1; show create table TB1;
    • copiez la syntaxe ici dans le presse-papiers pour créer TB1 dans DB2
  2. utilisez DB2;
    • collez la syntaxe ici pour créer la table TB1

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;

MojganK
la source
Cela m'a aidé à automatiser la copie d'une base de données, sans avoir à utiliser un programme d'interface graphique, merci.
New2HTML
4

Essayer mysqldbcopy( documentation )

Ou vous pouvez créer une " table fédérée " sur votre hôte cible. Les tables fédérées vous permettent de voir une table à partir d'un autre serveur de base de données comme s'il s'agissait d'un serveur local. ( documentation )

Après avoir créé la table fédérée, vous pouvez copier les données avec les insert into TARGET select * from SOURCE

Aaron Digulla
la source
1
J'ai lu sur les tables fédérées, mais Amazon RDS (pour le moment) n'a pas de support pour cela ... XP
Chococroc
4

Avec MySQL Workbench, vous pouvez utiliser l'exportation de données pour vider uniquement la table dans un fichier SQL local (données uniquement, structure uniquement ou structure et données), puis l'importation de données pour la charger dans l'autre base de données.

Vous pouvez ouvrir plusieurs connexions (différents hôtes, bases de données, utilisateurs) en même temps.

Doug Krugman
la source
3

Un moyen simple d'obtenir toutes les requêtes dont vous avez besoin est d'utiliser les données de information_schema et concat.

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

Vous obtiendrez alors une liste de résultats qui ressemble à ceci:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

Vous pouvez ensuite simplement exécuter ces requêtes.

Cependant, cela ne fonctionnera pas avec les vues MySQL. Vous pouvez les éviter en ajoutant à AND TABLE_TYPE = 'BASE TABLE'partir de la requête initiale:

John Mellor
la source
1

Est-ce quelque chose que vous devez faire régulièrement ou juste une seule fois?

Vous pouvez faire une exportation (par exemple en utilisant phpMyAdmin ou similaire) qui scriptera votre table et son contenu dans un fichier texte, puis vous pourrez le réimporter dans l'autre base de données.

Sepster
la source
Je n'ai besoin de le faire qu'une seule fois. Mais le problème est que la table de la base de données contient près d'un million de lignes. Le vidage de la base de données sera énorme. De plus, lorsque j'ai essayé d'exporter, seulement environ 10000 lignes sont exportées - probablement en raison de la grande taille.
Sparky
Ah, oui c'est une limitation. Cet article du Codex WordPress pourrait vous aider? C'est un article wordpress, mais qui pourrait vous fournir un aperçu (il y a une section sur la façon de vider des tables en utilisant la ligne de commande, dans le cas où la base de données est trop grande pour que phpMyAdmin puisse la gérer).
Sepster
L'outil de ligne de commande mysqldump n'a aucun problème avec 1 million de lignes, ou plusieurs milliards de lignes - tout ce qui affectera est le temps qu'il faut et la quantité de votre disque dur occupée par le résultat (en supposant que vous le sortiez dans un fichier). Mon expérience avec la commande d'exportation de phpMyAdmin est qu'elle est beaucoup plus limitée que mysqldump.
thomasrutter
1

utilisez les étapes ci-dessous pour copier et insérer des colonnes d'une table de base de données vers une autre table de base de données -

  1. CREATE TABLE nom_table (type de données nom_colonne (taille), type de données nom_colonne (taille));

2.INSERT INTO db2.tablename SELECT columnname1, columnname2 FROM db1.tablename;

Vishnu Plus
la source
1

Créez d'abord la décharge. Ajout des --no-create-info --no-create-dbindicateurs s'il table2existe déjà:

mysqldump -u user1 -p database1 table1 > dump.sql

Entrez ensuite le user1mot de passe. Ensuite:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

Entrez ensuite le user2mot de passe.

Identique à la réponse @helmors mais l'approche est plus sécurisée car les mots de passe ne sont pas exposés en texte brut à la console (recherche inversée, renifleurs de mots de passe, etc.). Une autre approche convient si elle est exécutée à partir d'un fichier de script avec des restrictions appropriées placées sur ses autorisations.

wizzfizz94
la source
0

IN xampp exportez simplement la table requise sous forme de fichier .sql, puis importez-la dans le fichier requis

Sameera Sampath
la source
-1

créer une table destination_customer comme sakila.customer (Database_name.tablename), cela ne copiera que la structure de la table source, pour que les données soient également copiées avec la structure, créez la table destination_customer comme select * from sakila.customer

rajat prakash
la source
Cela semble être une réponse à une question totalement différente. Il n'y a pas CREATE TABLE LIKEdans la question, alors pourquoi mentionner que c'est faux? Et il n'y a aucune explication sur la façon dont cette réponse résout le problème qu'aucun utilisateur n'a accès aux tables de l'autre.
Toby Speight