Najłatwiejszy sposób na skopiowanie tabeli z jednej bazy danych do drugiej?

151

Jaka jest najlepsza metoda kopiowania danych z tabeli w jednej bazie danych do tabeli w innej bazie danych, gdy bazy danych należą do różnych użytkowników?

Wiem, że mogę użyć

INSERT INTO database2.table2 SELECT * from database1.table1

Ale tutaj problem polega na tym, że zarówno database1i database2są pod różnymi użytkownikami MySQL. Więc user1ma database1tylko dostęp i user2ma database2tylko dostęp . Dowolny pomysł?

iskrzący
źródło
6
Możesz przyznać użytkownikom uprawnienia na poziomie tabeli. patrz: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh
2
Niestety to nie zadziała w moim przypadku, ponieważ używam współdzielonego serwera hostingowego Godaddy. Nie pozwolą robić takich rzeczy z bazą danych.
Sparky
@mmdemirbas Jedna tabela w bazie danych ma prawie 1 milion wierszy. Zrzut bazy danych będzie ogromny. Również kiedy próbowałem eksportować, tylko około 10000 wierszy jest eksportowanych - prawdopodobnie ze względu na duży rozmiar.
Sparky,
Wiem, że możesz używać RENAME do przenoszenia tabel i jest to bardzo szybkie. Czy istnieje równoważna sztuczka do kopiowania tabel?
Dan,
BTW: Musisz zadbać, aby lista pól była w tej samej kolejności w obu tabelach. W przeciwnym razie konieczne będzie wybranie pól według nazwy z tabeli w bazie danych1, aby odpowiadały one poprawnym polom w tabeli w bazie danych2. Ten problem pojawił się, gdy utworzyłem kopię zapasową bazy danych, w której tabela1 została zmodyfikowana po początkowym utworzeniu, oraz nowej bazy danych, w której została utworzona z pliku mysqldump.
Steve L

Odpowiedzi:

113

Jeśli masz dostęp do powłoki, możesz mysqldumpzrzucić zawartość database1.table1i przesłać ją mysqldo database2. Problem w tym, że table1nadal table1.

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

Może musisz zmienić nazwę table1na za table2pomocą innego zapytania. Z drugiej strony możesz użyć seda do zmiany tabeli1 na tabelę2 między potokami do.

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

Jeśli tabela2 już istnieje, możesz dodać parametry do pierwszego mysqldump, które nie pozwalają na tworzenie tabel-stworzeń.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
hełm
źródło
Problem polega na tym, że gdy jest to zautomatyzowane, musisz pokazać hasło. Jeśli nie jest zautomatyzowany i wykonywany przez użytkownika z wiersza poleceń, jest w porządku.
Nelles
100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

gdzie db1 to miejsce docelowe, a db2 to źródło

danie główne
źródło
Czy to działa, jeśli dwaj użytkownicy nie mają uprawnień do wybierania danych od siebie?
Beryl,
1
to jednak nie zadziała na innym serwerze mysql?
PUG
8
To nie kopiuje indeksów
bcoughlan,
@Beryllium nie wymaga od użytkownika posiadania uprawnień do obu DB. jaminator nie, to nie zadziała na różnych serwerach, ale nie sądzę, żeby o to chodziło. bcoughlan, masz rację. to jest duża wada w tym podejściu: nie zachowuje właściwie struktury tabeli.
thomasrutter
4
Skopiowana tabela nie miała klucza podstawowego i ustawionego automatycznego zwiększania wartości. Musisz to uruchomić późniejALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
60

Jeśli używasz PHPMyAdmin, może to być naprawdę proste. Załóżmy, że masz następujące bazy danych:

DB1 & DB2

DB1 ma tabelę użytkowników, którą chcesz skopiować do DB2

W PHPMyAdmin otwórz DB1, a następnie przejdź do tabeli użytkowników.

Na tej stronie kliknij kartę „Operacje” w prawym górnym rogu. W obszarze Operacje poszukaj sekcji Kopiuj tabelę do (database.table):

i gotowe!

Mekey Salaria
źródło
1
Śmiertelnie proste! To wtedy mogę świętować lenistwo!
Daniel Dut,
1
Oszczędzasz mój czas… robiłem naiwne podejście… najpierw eksportowałem, a potem importowałem.
Hamza Zafeer
1
Żadna z pozostałych odpowiedzi nie działa, tylko twoja, która również kopiuje indeks
Bsienn,
1
To nie zadziałałoby, gdyby stół był szczególnie duży, tj. Przekraczał 4 GB. Na przykład mam tabelę o pojemności 22 GB, z którą phpMyAdmin po prostu nie może pracować.
Mark D
1
Doskonała odpowiedź. Nie wiedziałem o tej funkcji phpmyadmin.
zookastos
23

Środowisko pracy MySql : zdecydowanie zalecane

Narzędzie do migracji bazy danych z MySql Workbench

To z łatwością rozwiąże problemy migracji. Możesz migrować wybrane tabele wybranych baz danych między MySql i SqlServer. Zdecydowanie powinieneś spróbować.

mmdemirbas
źródło
Mam zamiar spróbować, mam to skonfigurowane, ale zastanawiam się, czy porównałeś mysql Workbenchmigrację z SQLYogkopią bazy danych? Z mojego szybkiego spojrzenia wydaje się, że są bardzo podobne, ale
Środowisko pracy
Nie, nie próbowałem SQLYog.
mmdemirbas
Nie jest jasne, jak przeprowadzić migrację do SQL Server z MySQL przy użyciu środowiska roboczego MySql. Pracuję w Workbench i nie znajduję żadnych wskazówek z pomocy ani z interfejsu użytkownika. Wiem, że SSMA dla MySQL działa dla mnie.
subskrybuje
2
Ciekawe, ale program przyłapany na robieniu migracji z dużą bazą danych, linia poleceń działała najlepiej.
Claudionor Oliveira
1
@mmdemirbas, „ Możesz migrować wybrane tabele wybranych baz danych między MySql i SqlServer. ” Pytanie OP nie dotyczy jednak SQL Server.
sampablokuper
19

Używam Navicat dla MySQL ...

To sprawia, że ​​wszystkie operacje na bazie danych są łatwe!

Wystarczy wybrać obie bazy danych w Navicat, a następnie użyć.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1
Nick M.
źródło
13

Wiem, że to stare pytanie, odpowiadam tylko po to, aby każdy, kto tu wyląduje, miał lepsze podejście.

Od 5.6.10 możesz to zrobić

CREATE TABLE new_tbl LIKE orig_tbl;

Zapoznaj się z dokumentacją tutaj: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

Mir Adnan
źródło
1
Nie kopiuje danych! Przeczytaj dokumentację, do której się
odwołałeś
11

Jeśli twoje tabele znajdują się na tym samym serwerze mysql, możesz uruchomić następujące

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
źródło
a co z innymi indeksami ?! Pytanie brzmi, aby skopiować tabelę nie tylko jej dane
Jorj
9

Użyj funkcji eksportu i importu MySql Workbench. Kroki:
1. Wybierz żądane wartości

E.g. select * from table1; 
  1. Kliknij przycisk Eksportuj i zapisz jako plik CSV.
  2. utwórz nową tabelę, używając podobnych kolumn jak pierwsza

    E.g. create table table2 like table1; 
  3. wybierz wszystko z nowej tabeli

    E.g. select * from table2;  
  4. Kliknij Importuj i wybierz plik CSV wyeksportowany w kroku 2

Przykładowe przyciski Eksportuj i Importuj w MySql Workbench

biniam
źródło
1
Myślę, że działa tylko w przypadku tabel zawierających mniej niż miliard wierszy.
Diogo Paim,
9

Oto inny łatwy sposób:

  1. użyj DB1; pokaż stwórz tabelę TB1;
    • skopiuj składnię tutaj do schowka, aby utworzyć TB1 w DB2
  2. używać DB2;
    • wklej tutaj składnię, aby utworzyć tabelę TB1

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

MojganK
źródło
Dzięki temu pomogło mi zautomatyzować kopiowanie bazy danych bez konieczności korzystania z programu z interfejsem użytkownika.
New2HTML
4

Wypróbuj mysqldbcopy( dokumentacja )

Możesz też utworzyć „ tabelę stowarzyszoną ” na hoście docelowym. Tabele stowarzyszone umożliwiają wyświetlanie tabeli z innego serwera bazy danych tak, jakby był to serwer lokalny. ( dokumentacja )

Po utworzeniu tabeli stowarzyszonej można skopiować dane za pomocą zwykłego formatu insert into TARGET select * from SOURCE

Aaron Digulla
źródło
1
Czytałem o tabelach federacyjnych, ale Amazon RDS (w tej chwili) nie obsługuje tego ... XP
Chococroc
4

Dzięki MySQL Workbench możesz użyć eksportu danych, aby zrzucić tylko tabelę do lokalnego pliku SQL (tylko dane, tylko struktura lub struktura i dane), a następnie import danych, aby załadować ją do innej bazy danych.

Możesz mieć jednocześnie otwartych wiele połączeń (różnych hostów, baz danych, użytkowników).

Doug Krugman
źródło
3

Jednym prostym sposobem uzyskania wszystkich potrzebnych zapytań jest użycie danych z information_schema i concat.

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

Otrzymasz wtedy listę wyników, która wygląda następująco:

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

Następnie możesz po prostu uruchomić te zapytania.

Jednak nie będzie działać z widokami MySQL. Możesz ich uniknąć, dołączając AND TABLE_TYPE = 'BASE TABLE'do początkowego zapytania:

John Mellor
źródło
1

Czy to coś, co musisz robić regularnie, czy tylko jednorazowo?

Możesz wykonać eksport (np. Używając phpMyAdmina lub podobnego), który zapisze twoją tabelę i jej zawartość do pliku tekstowego, a następnie możesz ponownie zaimportować to do innej bazy danych.

Sepster
źródło
Muszę to zrobić tylko raz. Problem w tym, że tabela w bazie danych ma prawie 1 milion wierszy. Zrzut bazy danych będzie ogromny. Również kiedy próbowałem wyeksportować, tylko około 10000 wierszy jest eksportowanych - prawdopodobnie ze względu na duży rozmiar.
Sparky
Ach, tak, to jest ograniczenie. Ten artykuł o WordPress Codex może pomóc? Jest to artykuł dotyczący WordPressa, ale może dostarczyć pewnych informacji (jest sekcja o tym, jak zrzucić tabele za pomocą wiersza poleceń, w przypadku, gdy baza danych jest zbyt duża, aby phpMyAdmin mógł go obsłużyć).
Sepster
Narzędzie wiersza poleceń mysqldump nie ma problemów z 1 milionem wierszy lub kilkoma miliardami wierszy - wszystko, co wpłynie na to, ile czasu zajmie i ile zajmie wynik na dysku twardym (zakładając, że wyprowadzasz go do pliku). Moje doświadczenie z poleceniem eksportu phpMyAdmin jest takie, że jest znacznie bardziej ograniczone niż mysqldump.
thomasrutter
1

wykonaj poniższe czynności, aby skopiować i wstawić niektóre kolumny z jednej tabeli bazy danych do innej tabeli bazy danych-

  1. CREATE TABLE nazwa tabeli (typ danych nazwa_kolumny (rozmiar), typ danych nazwa_kolumny (rozmiar));

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

Wisznu Więcej
źródło
1

Najpierw utwórz zrzut. Dodano --no-create-info --no-create-dbflagi, jeśli table2już istnieją:

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

Następnie wprowadź user1hasło. Następnie:

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

Następnie wejdź user2 hasło.

To samo, co odpowiedź @helmors, ale podejście jest bezpieczniejsze, ponieważ hasła nie są ujawniane w postaci surowego tekstu w konsoli (wyszukiwanie odwrotne i, sniffery haseł itp.). Inne podejście jest dobre, jeśli jest wykonywane z pliku skryptu z odpowiednimi ograniczeniami nałożonymi na jego uprawnienia.

wizzfizz94
źródło
0

W xampp po prostu wyeksportuj wymaganą tabelę jako plik .sql, a następnie zaimportuj ją do wymaganego

Sameera Sampath
źródło
-1

utwórz tabelę klient_docelowy, taki jak sakila.customer ( nazwa_bazy_danych.nazwa tabeli ), spowoduje to jedynie skopiowanie struktury tabeli źródłowej, aby dane również zostały skopiowane ze strukturą, utwórz tabelę klient_docelowy jako select * from sakila.customer

rajat prakash
źródło
Wydaje się, że jest to odpowiedź na zupełnie inne pytanie. Nie ma CREATE TABLE LIKEw pytaniu, więc po co wspominać, że jest źle? I nie ma wyjaśnienia, w jaki sposób ta odpowiedź rozwiązuje problem polegający na tym, że żaden użytkownik nie ma dostępu do tabel drugiego.
Toby Speight