Copia da una tabella MySQL a un'altra tabella MySQL dello stesso database


15

Ho circa 40 milioni di righe in una tabella MySQL e voglio copiare questa tabella in un'altra tabella nello stesso database. Qual è il modo più efficace per farlo? Quanto tempo ci vorrà (circa)?


Qual è il motore del tuo tavolo?
Abdul Manaf,

InnoDB Engine ..
Devashish Dixit,

Risposte:


23

Supponiamo di avere mydb.mytbe di voler crearemydb.mytbcopy

Ho cinque (5) approcci per fare questa copia

APPROCCIO # 1

Nel mysqlclient, eseguire quanto segue

USE mydb
CREATE TABLE mytbcopy LIKE mytb;
INSERT INTO mytbcopy SELECT * FROM mytb;

APPROCCIO # 2

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb | mysql ${MYSQL_CONN} -Dtest
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

APPROCCIO # 3

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dtest < ${DUMPFILE}
rm -f ${DUMPFILE}
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

APPROCCIO # 4

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

APPROCCIO # 5

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dmydb < ${DUMPFILE}
rm -f ${DUMPFILE}

ANALISI

  • L'APPROCCIO # 1 è il più semplice in termini di passaggi, ma richiede l'inserimento di 40 milioni di righe in un'unica transazione. Questo sarà il più faticoso sul motore di archiviazione InnoDB.
  • Per gli altri approcci, mysqldump invierà 40 milioni di file in mandrini di migliaia di file
    • APPROACH # 2 e APPROACH # 3 eseguiranno il mysqldump della tabella nel database di test. Dopo aver creato la tabella nel database di test, viene successivamente rinominata e spostata nel database originale
    • APPROACH # 4 e APPROACH # 5 rinominano la tabella usando sed sullo stream proveniente da mysqldump mentre fa eco ai comandi INSERT
    • APPROACH # 2 e APPROACH # 4 usano le pipe invece di un file di output
    • APPROACH # 3 e APPROACH # 5 utilizzano un file outpuit per il successivo ricaricamento

Se si desidera copiare mydb.mytbin una tabella già esistente mydb.mytbcopye le due tabelle hanno strutture identiche:

APPROCCIO # 6

INSERT INTO mytbcopy SELECT * FROM mytb;

Come #APPROACH 1 , #APPROACH 6 avrebbe un'unica transazione di 40 milioni di righe

APPROCCIO # 7

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} -t mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

Questo approccio non elimina la tabella. Genera semplicemente gli INSERTI

EPILOGO

Non posso darti una stima del tempo poiché non conosco la composizione del DB Server, la struttura della tabella, il layout dell'indice e cose come queste.

PROVACI !!!


0

Le tabelle InnoDB, diversamente da MyISAM *, non possono essere "semplicemente copiate", poiché parte del suo dizionario di dati (e potenzialmente altre strutture da cui dipende la tabella, come il buffer di unione) si trovano in memoria (se il server è in esecuzione) e in il tablespace comune / principale, noto anche come file di grandi dimensioni chiamato ibdata1.

Se si utilizza Percona Server> = 5.1 o MySQL> = 5.6, esiste il supporto per tablespace trasportabili, che consente di esportare e importare le tabelle direttamente dal filesystem. Ecco il metodo per MySQL e Percona . In entrambi i casi, è necessario aver creato la tabella con l' innodb_file_per_tableopzione e prevede l'utilizzo di DISCARD TABLESPACE/IMPORT TABLESPACEe / o Percona Xtrabakup (se si desidera che l'esportazione venga eseguita online). Si noti che Percona Server o Xtrabakup non sono disponibili per Windows.

Questo metodo sarà, parlando in generale, veloce come copiare il file usando i comandi del filesystem (cp, rsync).

Sebbene in alcuni casi ciò possa funzionare in MySQL <5.6 (in modo confuso) per i ripristini, non funzionerà per una copia della tabella. In questi casi, un modo per farlo è utilizzare SQL :

CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;

Sarà veloce quanto InnoDB può eseguire Handler_read_rnd_nexte Handler_write, una volta per riga. Se si utilizza questo metodo, assicurarsi di disabilitare, almeno temporaneamente, le opzioni di durabilità e di disporre di un pool buffer e di un registro delle transazioni di grandi dimensioni. In tali circostanze, potrebbe ridurre i tempi di importazione, ma sicuramente non si adatterà completamente alla memoria, quindi aspettati molto tempo. Inoltre, stai tentando di importare 40 milioni di righe in una singola transazione, il che potrebbe causare problemi.

La mia attuale raccomandazione, in questo secondo caso, sarebbe quella di utilizzare qualcosa come l' archiviatore pt , in quanto eseguirà un'operazione simile a quella che ho appena menzionato, ma verrà eseguita in "blocchi", evitando il sovraccarico transazionale (potrebbe non essere più veloce, ma in caso di errore, non tenterà di ripristinare l'intero tavolo, impiegando un'eternità). Per le dimensioni dei dati menzionate, questo è probabilmente il modo migliore per procedere.

Un'ultima opzione sarebbe quella di esportare e importare usando il formato CSV (o TSV) , con una combinazione di SELECT INTO OUTFILE / mysqldump e LOAD DATA / mysqlimport. Questa era un'opzione molto comune se avevi bisogno di concorrenza in alcune vecchie versioni di mysql, poiché l'uso di sql creava blocchi più grandi (non più vero se fatto correttamente). Dato che mysqldump / import funziona solo in modo serializzato, ti consiglierei di cercare opzioni per parallelizzarlo, molto utile per tabelle di grandi dimensioni.

In ogni caso, cerca di evitare più frasi SQL, poiché sarà il tuo collo di bottiglia più importante se esegui molte query diverse (che devono essere eseguite, analizzate e ottimizzate individualmente).


* Le strutture MyISAM non possono essere copiate a caldo, ma è molto facile sincronizzarle temporaneamente con il disco FTWRL.


0

spostare i dati da una tabella all'altra nello schema

create table your_table_name select * from old_schema_table;

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.