Il modo più semplice per copiare una tabella da un database a un altro?


151

Qual è il metodo migliore per copiare i dati da una tabella in un database a una tabella in un altro database quando i database si trovano sotto utenti diversi?

So che posso usare

INSERT INTO database2.table2 SELECT * from database1.table1

Ma qui il problema è che entrambi database1e database2sono sotto diversi utenti MySQL. Quindi user1può accedere database1solo e user2può accedere database2solo. Qualche idea?


6
Puoi concedere sussidi a livello di tabella agli utenti. vedi: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
Sfortunatamente questo non funzionerà nel mio caso, poiché sto usando un server di hosting condiviso Godaddy. Non consentiranno di fare tali cose con il database.
Sparky

@mmdemirbas Una tabella nel database ha quasi 1 milione di righe. Il dump del database sarà enorme. Inoltre, quando ho provato a esportare, vengono esportate solo circa 10000 righe, probabilmente a causa delle grandi dimensioni.
Sparky

So che puoi usare RENAME per spostare le tabelle ed è super veloce. Esiste un trucco equivalente per copiare le tabelle?
Dan

A proposito: dovrai fare attenzione che l'elenco dei campi sia nello stesso ordine in entrambe le tabelle. Altrimenti sarà necessario selezionare i campi per nome dalla tabella nel database1 in modo che mappino ai campi corretti nella tabella nel database2. Questo problema è emerso per me in cui avevo eseguito il backup di un database in cui table1 è stato modificato dopo la creazione iniziale e il nuovo database in cui è stato creato da un file mysqldump.
Steve L,

Risposte:


113

Se si dispone dell'accesso alla shell, è possibile utilizzare mysqldumpper scaricare il contenuto database1.table1e reindirizzarlo mysqla database2. Il problema qui è che table1è ancora table1.

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

Forse avete bisogno di rinominare table1a table2con un'altra query. D'altra parte è possibile utilizzare sed per modificare table1 in table2 tra le pipe.

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

Se table2 esiste già, è possibile aggiungere i parametri al primo mysqldump che non consente di creare la tabella creata.

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

Il problema è che quando è automatizzato devi mostrare la password. Se non automatizzato e fatto dall'utente dalla riga di comando, va bene.
Nelles,

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

dove db1 è la destinazione e db2 è la fonte


Funziona se i due utenti non dispongono delle autorizzazioni per selezionare i dati tra loro?
Berillio

1
questo non funzionerà su server mysql diversi?
PUG,

8
Questo non copia sugli indici
bcoughlan

@Beryllium no, ciò richiede che l'utente disponga delle autorizzazioni per entrambi i DB. jaminator no, questo non funzionerà su server diversi, ma non credo che la domanda fosse su questo. bcoughlan hai ragione. questo è un grosso difetto in questo approccio: non preserva correttamente la struttura della tabella.
thomasrutter,

4
La tabella copiata non aveva la chiave primaria e l'incremento automatico impostati. Devi eseguire questo dopoALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger il

61

Se stai usando PHPMyAdmin, potrebbe essere davvero semplice. Supponiamo di avere i seguenti database:

DB1 & DB2

DB1 ha utenti di una tabella che desideri copiare su DB2

Sotto PHPMyAdmin, apri DB1, quindi vai alla tabella degli utenti.

In questa pagina, fai clic sulla scheda "Operazioni" in alto a destra. In Operazioni, cerca la sezione Copia tabella in (database.table):

& hai fatto!


1
Morto semplice! Questo è quando posso celebrare di essere pigro!
Daniel Dut,

1
Risparmia tempo ... stavo facendo un approccio ingenuo ... prima esportando e poi importando.
Hamza Zafeer,

1
Nessuna delle altre risposte funziona, solo la tua che copia anche l'indice
Bsienn,

1
Ciò non funzionerebbe se il tavolo fosse particolarmente grande, ovvero superiore a 4 GB. Ad esempio, ho una tabella di 22 GB con cui phpMyAdmin non può funzionare.
Segna D il

1
Risposta perfetta Non conoscevo questa funzione di phpmyadmin.
zookastos,

23

MySql Workbench : fortemente raccomandato

Strumento di migrazione del database da MySql Workbench

Questo gestirà facilmente i problemi di migrazione. È possibile migrare le tabelle selezionate dei database selezionati tra MySql e SqlServer. Dovresti assolutamente provarlo.


Sto per provarlo, ce l'ho installato ma mi chiedo se hai confrontato la mysql Workbenchmigrazione con SQLYogla copia del database? Dal mio rapido sguardo sembra che siano molto simili, ma il banco di lavoro di mysql è una funzionalità più recente
wired00

No, non ho provato SQLYog.
mmdemirbas,

Non è chiaro come migrare a SQL Server da MySQL usando MySql workbench. Sono in Workbench e non trovo indizi dall'aiuto o dall'interfaccia utente. So che SSMA per MySQL funziona per me.
subsci

2
Interessante, ma il programma ha sorpreso a eseguire la migrazione con un database di grandi dimensioni, la riga di comando ha funzionato meglio.
Claudionor Oliveira,

1
@mmdemirbas, " È possibile migrare le tabelle selezionate di database selezionati tra MySql e SqlServer. " La domanda dell'OP non riguarda SQL Server.
sampablokuper

19

Uso Navicat per MySQL ...

Rende facile la manipolazione di tutti i database!

È sufficiente selezionare entrambi i database in Navicat e quindi utilizzarli.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

So che questa è una vecchia domanda, sto solo rispondendo in modo che chiunque arrivi qui abbia un approccio migliore.

A partire da 5.6.10 puoi farlo

CREATE TABLE new_tbl LIKE orig_tbl;

Consultare la documentazione qui: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
Non copia i dati! Leggi la documentazione a cui hai fatto riferimento:> ** CREATE TABLE ... LIKE non conserva alcun DATI **
dgpro

11

Se le tue tabelle si trovano sullo stesso server mysql puoi eseguire quanto segue

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;

che dire degli altri indici ?! La domanda afferma di copiare una tabella non solo i suoi dati
Jorj

9

Utilizza la funzionalità di esportazione e importazione di MySql Workbench. Passaggi:
1. Selezionare i valori desiderati

E.g. select * from table1; 
  1. Fai clic sul pulsante Esporta e salvalo come CSV.
  2. crea una nuova tabella usando colonne simili come la prima

    E.g. create table table2 like table1; 
  3. seleziona tutto dalla nuova tabella

    E.g. select * from table2;  
  4. Fai clic su Importa e seleziona il file CSV che hai esportato nel passaggio 2

Esempio dei pulsanti Esporta e Importa in MySql Workbench


1
Funziona solo con tabelle con meno di un miliardo di righe, credo.
Diogo Paim,

9

Ecco un altro modo semplice:

  1. usa DB1; mostra crea tabella TB1;
    • copia la sintassi qui negli appunti per creare TB1 in DB2
  2. usa DB2;
    • incolla qui la sintassi per creare la tabella TB1

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


Questo mi ha aiutato ad automatizzare la copia di un database, senza dover usare un programma gui, grazie.
New2HTML,

4

Prova mysqldbcopy( documentazione )

Oppure puoi creare una " tabella federata " sul tuo host di destinazione. Le tabelle federate consentono di visualizzare una tabella da un server di database diverso come se fosse locale. ( documentazione )

Dopo aver creato la tabella federata, è possibile copiare i dati con il solito insert into TARGET select * from SOURCE


1
Ho letto delle tabelle federate, ma Amazon RDS (in questo momento) non ha il supporto per esso ... XP
Chococroc,

4

Con MySQL Workbench è possibile utilizzare Data Export per scaricare solo la tabella in un file SQL locale (solo dati, solo struttura o struttura e dati) e quindi importare dati per caricarlo nell'altro DB.

Puoi avere più connessioni (host diversi, database, utenti) aperti contemporaneamente.


3

Un modo semplice per ottenere tutte le domande di cui hai bisogno è usare i dati di information_schema e concat.

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

Verrà quindi visualizzato un elenco di risultati simile al seguente:

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

È quindi possibile eseguire quelle query.

Tuttavia, non funzionerà con MySQL Views. Puoi evitarli aggiungendo AND TABLE_TYPE = 'BASE TABLE'dalla query iniziale:


1

È qualcosa che devi fare regolarmente o solo una volta?

È possibile eseguire un'esportazione (ad esempio utilizzando phpMyAdmin o simile) che eseguirà lo scripting della tabella e dei relativi contenuti in un file di testo, quindi è possibile reimportarli nell'altro database.


Devo farlo solo una volta. Ma il problema è che la tabella nel database ha quasi 1 milione di righe. Il dump del database sarà enorme. Inoltre, quando ho provato a esportare, vengono esportate solo circa 10000 righe, probabilmente a causa delle grandi dimensioni.
Sparky

Ah, sì, questo è un limite. Questo articolo sul Codex di WordPress potrebbe essere d'aiuto? È un articolo wordpress, ma potrebbe fornirti alcune informazioni (c'è una sezione su come scaricare le tabelle usando la riga di comando, nel caso in cui il DB sia troppo grande per essere gestito da phpMyAdmin).
Sepster

Lo strumento da riga di comando mysqldump non ha problemi con 1 milione di righe o diversi miliardi di righe: tutto ciò che influenzerà è il tempo impiegato e la quantità di disco rigido occupata dal risultato (supponendo che lo si abbia in un file). La mia esperienza con il comando export di phpMyAdmin è che è molto più limitata di mysqldump.
thomasrutter,

1

utilizzare i passaggi seguenti per copiare e inserire alcune colonne da una tabella di database a un'altra tabella di database-

  1. CREATE TABLE tablename (tipo di dati nome colonna (dimensione), tipo di dati nome colonna (dimensione));

2.INSERIRE db2.tablename SELEZIONARE nome colonna1, nome colonna2 DA db1.tablename;


1

Per prima cosa crea il dump. Aggiunti i --no-create-info --no-create-dbflag se table2già esistenti:

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

Quindi inserisci la user1password. Poi:

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

Quindi entra user2 password.

Come la risposta di @helmors, ma l'approccio è più sicuro in quanto le password non sono esposte nella console in testo non elaborato (ricerca inversa, sniffer di password, ecc.). Un altro approccio va bene se viene eseguito da un file di script con le restrizioni appropriate poste sulle sue autorizzazioni.


0

IN xampp basta esportare la tabella richiesta come file .sql e quindi importarla nel file richiesto


-1

crea una tabella destination_customer come sakila.customer (Database_name.tablename), questo copierà solo la struttura della tabella di origine, affinché anche i dati vengano copiati con la struttura, crea questa tabella destination_customer come seleziona * da sakila.customer


Questa sembra essere una risposta a una domanda totalmente diversa. Non ci sono CREATE TABLE LIKEdomande, quindi perché menzionare che è sbagliato? E non c'è spiegazione di come questa risposta risolva il problema che nessuno degli utenti ha accesso alle tabelle dell'altro.
Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.