2010-07-14 15 views
21

Voglio farlo utilizzando un codice e non utilizzando uno strumento come "MySQL Migration Toolkit". Il modo più semplice che conosco è di aprire una connessione (usando i connettori MySQL) a DB1 e leggere i suoi dati. Aprire la connessione a DB2 e scrivere i dati su di esso. C'è un modo migliore/più semplice?Come posso trasferire i dati tra 2 database MySQL?

+1

due database sullo stesso server o due database su server diversi? –

+0

@Itay: non sono ancora sicuro che siano sullo stesso server o no? So che questo fa la differenza ma non mi è venuto in mente di chiedere loro.Lo farò domani – Morano88

risposta

20

Per prima cosa ho intenzione di assumere che non sono in grado di basta copiare la directory data /, perché se si sta utilizzando lo snapshot/backup/ripristino esistente sarà probabilmente sufficiente (e testare le procedure di backup/ripristino nell'affare).

In tal caso, se i due tavoli hanno la stessa struttura generalmente il più veloce, e ironicamente l'approccio più semplice sarà usare SELECT ... INTO OUTFILE ... su un'estremità e LOAD DATA INFILE ... on l'altro.

Vedere http://dev.mysql.com/doc/refman/5.1/en/load-data.html e .../select.html per i dettagli definitivi.

Per le tabelle banali quanto segue funziona:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

Abbiamo usato anche FIFO di grande efficacia per evitare il sovraccarico di realtà la scrittura su disco, o se abbiamo bisogno di scrivere su disco per qualche ragione, per collegarlo tramite gzip.

ie.

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

In sostanza, quello che dirigere i dati della tabella ad un FIFO si può comprimere, munge, o tunnel che attraverso una rete ai vostri cuori contenuto.

+0

Grazie, anche se è nel manuale dev.mysql ma non funziona proberamente. Mi sta dando questo errore: Si ha un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a '\ n' 'alla riga 1) Non accetta' \ n '.. perché? – Morano88

+0

Stack Overflow ha corrotto la query di esempio. Nell'origine, la barra nella clausola ESCAPED BY è stata sfuggita, ma l'escape è stato perso quando convertito in html. Mi dispiace, non avevo notato la corruzione - l'ho risolto sopra. – Recurse

+0

Questo è esattamente ciò di cui ho bisogno per accelerare il backup di un database abbastanza grande, ma non riesco a far funzionare il tuo esempio. Posso creare il FIFO, e se scarico alla pipe usando mysqldump funziona perfettamente. Tuttavia, se provo a scaricare il pipe usando SELECT ... INTO OUTFILE, ricevo un errore che "myfifo esiste già". –

11

Il motore di archiviazione FEDERATED? Non è il più veloce del gruppo, ma per una volta, accidentalmente, o piccole quantità di dati che farà. Questo presuppone che tu stia parlando di 2 server. Con 2 database su uno stesso server, sarà semplicemente:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

Grazie mille, non sono ancora sicuro Se i 2 database si trovano sullo stesso server o no. – Morano88

+0

Questo è stato fantastico per la mia situazione. Saluti :) – Nick

+0

Ha funzionato bene con Amazon RDS in cui non si ha accesso alla macchina sottostante che esegue l'istanza MySQL, escludendo le soluzioni che coinvolgono INFILE/OUTFILE. – Andz

1

È possibile utilizzare mysqldump e mysql (il client a riga di comando). Questi sono strumenti da riga di comando e nella domanda che scrivi non vuoi usarli, ma utilizzarli comunque (anche eseguendoli dal tuo codice) è il modo più semplice; mysqldump risolve un sacco di problemi.

È possibile effettuare select da un database e insert all'altro, che è piuttosto facile. Ma se hai bisogno anche di trasferire lo schema del database (create table s ecc.), Diventa un po 'più complicato, motivo per cui raccomando mysqldump. Ma anche molti strumenti di amministrazione PHP-MySQL lo fanno, quindi puoi usarli o guardare il loro codice.

O forse è possibile utilizzare la replica MySQL.

+0

Questo (seleziona, inserisce) funzionerà se i due database sono su 2 server diversi? No Voglio solo migrare dati, non creazioni di tabelle, ecc. – Morano88

+0

Sì, avrai le connessioni tvo - per ogni server una - in una connessione esegui SELECT, quindi nell'altra INSERT con i dati che sono ritornati da quella SELECT . – Messa

0

Se abilitato la registrazione binaria sul server corrente (e hanno tutti i registri bin) è possibile replica di installazione per il secondo server

Problemi correlati