Der einfachste Weg, eine Tabelle von einer Datenbank in eine andere zu kopieren?


151

Was ist die beste Methode, um die Daten aus einer Tabelle in einer Datenbank in eine Tabelle in einer anderen Datenbank zu kopieren, wenn sich die Datenbanken unter verschiedenen Benutzern befinden?

Ich weiß, dass ich verwenden kann

INSERT INTO database2.table2 SELECT * from database1.table1

Aber hier ist das Problem, dass beide database1und database2unter verschiedenen MySQL-Benutzern sind. So user1kann Zugriff database1nur und user2zugreifen können database2nur. Irgendeine Idee?


6
Sie können Benutzern Zuschüsse auf Tabellenebene gewähren. siehe: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
Leider funktioniert dies in meinem Fall nicht, da ich einen gemeinsam genutzten Godaddy-Hosting-Server verwende. Sie erlauben nicht, solche Dinge mit der Datenbank zu tun.
Sparky

@mmdemirbas Eine Tabelle in der Datenbank enthält fast 1 Million Zeilen. Der Datenbank-Dump wird riesig sein. Auch beim Versuch zu exportieren werden nur etwa 10000 Zeilen exportiert - wahrscheinlich aufgrund der Größe.
Sparky

Ich weiß, dass Sie RENAME verwenden können, um Tabellen zu verschieben, und es ist super schnell. Gibt es einen äquivalenten Trick zum Kopieren von Tabellen?
Dan

Übrigens: Sie müssen darauf achten, dass die Feldliste in beiden Tabellen in derselben Reihenfolge ist. Andernfalls müssen die Felder nach Namen aus der Tabelle in Datenbank1 ausgewählt werden, damit sie den richtigen Feldern in der Tabelle in Datenbank2 zugeordnet werden. Dieses Problem trat bei mir auf, als ich eine Datenbank gesichert hatte, in der Tabelle1 nach der ersten Erstellung geändert wurde, und die neue Datenbank, in der sie aus einer mysqldump-Datei erstellt wurde.
Steve L

Antworten:


113

Wenn Sie ein Shell - Zugang haben , können Sie verwenden , um mysqldumpden Inhalt von dump database1.table1und Rohr es mysqlzu database2. Das Problem hier ist, dass table1es immer noch ist table1.

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

Vielleicht müssen Sie umbenennen , table1um table2mit einer anderen Abfrage. Auf der anderen Seite können Sie sed verwenden, um table1 in table2 zwischen den to-Pipes zu ändern.

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

Wenn table2 bereits vorhanden ist, können Sie die Parameter zum ersten mysqldump hinzufügen, mit dem die Tabellenerstellungen nicht erstellt werden können.

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

Das Problem dabei ist, wenn es automatisiert ist, müssen Sie das Passwort anzeigen. Wenn es nicht automatisiert ist und vom Benutzer über die Befehlszeile ausgeführt wird, ist es in Ordnung.
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

Dabei ist db1 das Ziel und db2 die Quelle


Funktioniert dies, wenn die beiden Benutzer keine Berechtigung haben, Daten voneinander auszuwählen?
Beryllium

1
Dies funktioniert jedoch nicht auf verschiedenen MySQL-Servern?
PUG

8
Dies kopiert nicht über Indizes
bcoughlan

@Beryllium Nein, hierfür muss der Benutzer über Berechtigungen für beide DBs verfügen. jaminator nein das funktioniert nicht auf verschiedenen Servern, aber ich glaube nicht, dass die Frage danach gestellt wurde. bcoughlan du bist richtig. Dies ist ein großer Fehler bei diesem Ansatz: Die Tabellenstruktur wird nicht ordnungsgemäß beibehalten.
Thomasrutter

4
Für die kopierte Tabelle waren kein Primärschlüssel und kein automatisches Inkrement festgelegt. Sie müssen dies nachALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

Wenn Sie PHPMyAdmin verwenden, kann dies sehr einfach sein. Angenommen, Sie haben folgende Datenbanken:

DB1 & DB2

DB1 hat Tabellenbenutzer, die Sie in DB2 kopieren möchten

Öffnen Sie unter PHPMyAdmin DB1 und wechseln Sie zur Benutzertabelle.

Klicken Sie auf dieser Seite oben rechts auf die Registerkarte "Vorgänge" . Suchen Sie unter Operationen nach dem Abschnitt Tabelle kopieren nach (database.table):

& du bist fertig!


1
Ganz einfach! Dann kann ich feiern, faul zu sein!
Daniel Dut

1
Sie sparen meine Zeit. Ich habe einen naiven Ansatz gewählt. Zuerst exportieren und dann importieren.
Hamza Zafeer

1
Keine der anderen Antworten funktioniert, nur Ihre, die auch den Index kopiert
Bsienn

1
Dies würde nicht funktionieren, wenn der Tisch besonders groß wäre, dh mehr als 4 GB. Zum Beispiel habe ich eine Tabelle mit 22 GB, mit der phpMyAdmin einfach nicht arbeiten kann.
Mark D

1
Perfekte Antwort. Wusste nichts über diese Funktion von phpmyadmin.
Zookastos

23

MySql Workbench : Sehr zu empfehlen

Datenbankmigrationstool von MySql Workbench

Dies wird Migrationsprobleme leicht lösen. Sie können ausgewählte Tabellen ausgewählter Datenbanken zwischen MySql und SqlServer migrieren. Sie sollten es auf jeden Fall versuchen.


Ich werde es versuchen, ich habe es eingerichtet, aber ich frage mich, ob Sie die mysql WorkbenchMigration mit SQLYogder Datenbankkopie verglichen haben . Von meinem kurzen Blick scheint es, dass sie sehr ähnlich sind, aber MySQL Workbench ist eine neuere Funktion
wired00

Nein, ich habe SQLYog nicht ausprobiert.
mmdemirbas

Es ist nicht ersichtlich, wie mithilfe der MySQL-Workbench von MySQL auf SQL Server migriert werden kann. Ich bin in Workbench und finde keine Hinweise von der Hilfe oder der Benutzeroberfläche. Ich weiß, dass SSMA für MySQL für mich funktioniert.
Subsci

2
Interessant, aber das Programm hat die Migration mit einer großen Datenbank erwischt. Die Befehlszeile funktionierte am besten.
Claudionor Oliveira

1
@mmdemirbas, " Sie können ausgewählte Tabellen ausgewählter Datenbanken zwischen MySql und SqlServer migrieren. " Die Frage des OP bezieht sich jedoch nicht auf SQL Server.
Sampablokuper

19

Ich benutze Navicat für MySQL ...

Es macht alle Datenbankmanipulationen einfach!

Sie wählen einfach beide Datenbanken in Navicat aus und verwenden sie dann.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

Ich weiß, dass dies eine alte Frage ist, die nur beantwortet wird, damit jeder, der hier landet, einen besseren Ansatz erhält.

Ab 5.6.10 können Sie tun

CREATE TABLE new_tbl LIKE orig_tbl;

Weitere Informationen finden Sie hier: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
Es werden keine Daten kopiert! Lesen Sie die Dokumentation, auf die Sie verwiesen haben:> ** CREATE TABLE ... LIKE bewahrt keine
DATEN

11

Wenn sich Ihre Tabellen auf demselben MySQL-Server befinden, können Sie Folgendes ausführen

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;

was ist mit den anderen Indizes ?! Die Frage besagt, eine Tabelle nicht nur ihre Daten zu kopieren
Jorj

9

Verwenden Sie die Export- und Importfunktion von MySql Workbench. Schritte:
1. Wählen Sie die gewünschten Werte aus

E.g. select * from table1; 
  1. Klicken Sie auf die Schaltfläche Exportieren und speichern Sie sie als CSV.
  2. Erstellen Sie eine neue Tabelle mit ähnlichen Spalten wie die erste

    E.g. create table table2 like table1; 
  3. Wählen Sie alle aus der neuen Tabelle aus

    E.g. select * from table2;  
  4. Klicken Sie auf Importieren und wählen Sie die CSV-Datei aus, die Sie in Schritt 2 exportiert haben

Beispiel für die Schaltflächen Exportieren und Importieren in MySql Workbench


1
Es funktioniert nur für Tabellen mit weniger als einer Milliarde Zeilen, denke ich.
Diogo Paim

9

Hier ist ein weiterer einfacher Weg:

  1. benutze DB1; show create table TB1;
    • Kopieren Sie die Syntax hier in die Zwischenablage, um TB1 in DB2 zu erstellen
  2. benutze DB2;
    • Fügen Sie hier die Syntax ein, um die Tabelle TB1 zu erstellen

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


Dies hat mir geholfen, das Kopieren einer Datenbank zu automatisieren, ohne ein GUI-Programm verwenden zu müssen, danke.
New2HTML

4

Versuchen Sie mysqldbcopy( Dokumentation )

Oder Sie können eine " Verbundtabelle " auf Ihrem Zielhost erstellen . Mit Verbundtabellen können Sie eine Tabelle von einem anderen Datenbankserver so anzeigen, als wäre es eine lokale. ( Dokumentation )

Nach dem Erstellen der Verbundtabelle können Sie Daten mit den üblichen Daten kopieren insert into TARGET select * from SOURCE


1
Ich habe über Verbundtabellen gelesen, aber Amazon RDS (
Chococroc

4

Mit MySQL Workbench können Sie den Datenexport verwenden, um nur die Tabelle in eine lokale SQL-Datei (nur Daten, nur Struktur oder Struktur und Daten) zu sichern, und dann den Datenimport, um sie in die andere Datenbank zu laden.

Sie können mehrere Verbindungen (verschiedene Hosts, Datenbanken, Benutzer) gleichzeitig öffnen.


3

Eine einfache Möglichkeit, alle benötigten Abfragen abzurufen, besteht darin, die Daten aus information_schema und concat zu verwenden.

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

Sie erhalten dann eine Liste mit Ergebnissen, die folgendermaßen aussieht:

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;
...

Sie können diese Abfragen dann einfach ausführen.

Es funktioniert jedoch nicht mit MySQL Views. Sie können sie vermeiden, indem Sie AND TABLE_TYPE = 'BASE TABLE'an die erste Abfrage anhängen :


1

Müssen Sie das regelmäßig tun oder nur einmal?

Sie können einen Export durchführen (z. B. mit phpMyAdmin oder ähnlichem), der Ihre Tabelle und ihren Inhalt in eine Textdatei schreibt, und diesen dann erneut in die andere Datenbank importieren.


Ich muss es nur einmal tun. Das Problem ist jedoch, dass die Tabelle in der Datenbank fast 1 Million Zeilen enthält. Der Datenbank-Dump wird riesig sein. Auch beim Versuch zu exportieren werden nur etwa 10000 Zeilen exportiert - wahrscheinlich aufgrund der Größe.
Sparky

Ah ja, das ist eine Einschränkung. Dieser WordPress Codex Artikel könnte helfen? Es ist ein WordPress-Artikel, bietet Ihnen jedoch möglicherweise einen Einblick (es gibt einen Abschnitt zum Speichern von Tabellen mithilfe der Befehlszeile, falls die Datenbank für phpMyAdmin zu groß ist).
Uhr

Das Befehlszeilentool mysqldump hat keine Probleme mit 1 Million Zeilen oder mehreren Milliarden Zeilen. Alles, was sich darauf auswirkt, ist, wie viel Zeit es benötigt und wie viel von Ihrer Festplatte das Ergebnis belegt (vorausgesetzt, Sie geben es in eine Datei aus). Meine Erfahrung mit dem Exportbefehl von phpMyAdmin ist, dass er viel eingeschränkter ist als mysqldump.
Thomasrutter

1

Führen Sie die folgenden Schritte aus, um einige Spalten von einer Datenbanktabelle in eine andere Datenbanktabelle zu kopieren und einzufügen.

  1. CREATE TABLE Tabellenname (Spaltenname Datentyp (Größe), Spaltenname Datentyp (Größe));

2.INSERT INTO db2.tabellenname SELECT Spaltenname1, Spaltenname2 FROM db1.tabellenname;


1

Erstellen Sie zuerst den Speicherauszug. --no-create-info --no-create-dbFlags hinzugefügt , falls table2bereits vorhanden:

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

Geben Sie dann das user1Passwort ein. Dann:

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

Geben Sie dann das user2Passwort ein.

Wie @helmors Antwort, aber der Ansatz ist sicherer, da Passwörter nicht in Rohtext für die Konsole verfügbar gemacht werden (Reverse-i-Search, Passwort-Sniffer usw.). Ein anderer Ansatz ist in Ordnung, wenn er aus einer Skriptdatei mit entsprechenden Einschränkungen für die Berechtigungen ausgeführt wird.


0

IN xampp exportieren Sie einfach die erforderliche Tabelle als SQL-Datei und importieren Sie sie dann in die gewünschte


-1

Erstellen Sie die Tabelle destination_customer wie sakila.customer (Database_name.tabellenname). Dadurch wird nur die Struktur der Quelltabelle kopiert. Damit Daten auch mit der Struktur kopiert werden, erstellen Sie die Tabelle destination_customer als select * aus sakila.customer


Dies scheint eine Antwort auf eine völlig andere Frage zu sein. Es gibt keine CREATE TABLE LIKEin der Frage, warum also erwähnen, dass es falsch ist? Und es gibt keine Erklärung dafür, wie diese Antwort das Problem löst, dass keiner der Benutzer Zugriff auf die Tabellen des anderen hat.
Toby Speight
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.