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ł?


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

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


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!


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


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


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;

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


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;


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


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


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:


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.


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;


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.


0

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


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.