it-swarm.it

Come posso spostare un database da un server a un altro?

Come posso spostare le tabelle MySQL da un server fisico a un altro?

Come questo esatto scenario: Ho un server MySQL che utilizza una tabella innodb e ha una dimensione di circa 20 GB.

Voglio spostarlo su un nuovo server, qual è il modo più efficiente per farlo?

142
John

Il mio modo preferito è reindirizzare un comando sqldump a un comando sql. È possibile eseguire tutti i database o uno specifico. Quindi, per esempio,

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

Puoi fare tutti i database con

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

L'unico problema è quando il database è troppo grande e il tubo collassa. In tal caso, puoi eseguire una tabella per tabella o uno qualsiasi degli altri metodi indicati di seguito.

84
David Hall

Di recente ho spostato un database da 30 GB con la seguente stragegy:

Vecchio server

  • Arresta il server mysql
  • Copia il contenuto di datadir in un'altra posizione sul disco (~/mysqldata/*)
  • Avvia nuovamente il server mysql (il tempo di inattività è stato di 10-15 minuti)
  • comprimere i dati (tar -czvf mysqldata.tar.gz ~/mysqldata)
  • copia il file compresso sul nuovo server

Nuovo server

  • installa mysql (non iniziare)
  • decomprimere il file compresso (tar -xzvf mysqldata.tar.gz)
  • sposta i contenuti di mysqldata in datadir
  • Assicurati che il tuo innodb_log_file_size sia lo stesso sul nuovo server o, in caso contrario, non copiare i vecchi file di registro ( mysql genererà questi )
  • Inizia mysql
67
Derek Downey

Secondo MySQL 5.0 Guida allo studio di certificazione , Capitolo 32 Sezione 32.3.4, Pagine 456.457 descrivono le Condizioni per la portabilità binaria che mettere in evidenza quanto segue:

La portabilità binaria è importante se si desidera eseguire un backup binario creato su un computer e utilizzarlo su un altro computer con un'architettura diversa. Ad esempio, l'utilizzo di un backup binario è un modo per copiare database da un server MySQL a un altro.

Per MyISAM, la portabilità binaria significa che è possibile copiare direttamente i file per una tabella MyISAM da un server MySQL a un altro su un altro computer e il secondo server sarà in grado di accedere alla tabella.

Per InnoDB, la portabilità binaria significa che è possibile copiare direttamente i file del tablespace da un server MySQL su un computer su un altro server su un altro computer e il secondo server sarà in grado di accedere al tablespace. Per impostazione predefinita, tutte le tabelle InnoDB gestite da un server sono memorizzate insieme nel tablespace, pertanto la portabilità del tablespace dipende dal fatto che tutte le singole tabelle InnoDB siano portatili. Se anche una tabella non è portatile, non lo è nemmeno il tablespace.

Le tabelle MyISAM e i tablespace InnoDB sono portatili binari da un host all'altro se sono soddisfatte due condizioni:

  • Entrambe le macchine devono usare l'aritmetica di interi a complemento a due
  • Entrambe le macchine devono utilizzare il formato IEEE in virgola mobile, altrimenti le tabelle non devono contenere colonne in virgola mobile (FLOAT o DOUBLE)

In pratica, queste due condizioni pongono poche restrizioni. L'aritmetica di numeri interi a due complementi e il formato a virgola mobile IEEE sono la norma sull'hardware moderno. Una terza condizione per la portabilità binaria di InnoDB è che è necessario utilizzare nomi minuscoli per tabelle e database. Questo perché InnoDB memorizza questi nomi internamente (nel suo dizionario dei dati) in minuscolo su Windows. L'uso di nomi in minuscolo consente la portabilità binaria tra Windows e Unix, per forzare l'uso di nomi in minuscolo, è possibile inserire le seguenti righe in un file di opzioni:

[mysqld]
lower_case_table_names=1

Se si configura InnoDB per l'utilizzo di tablespace per tabella, le condizioni per la portabilità binaria vengono estese per includere anche i file .ibd per le tabelle InnoDB. (Le condizioni per i tablespace condivisi sono ancora applicabili perché contiene il dizionario dei dati che memorizza le informazioni su tutte le tabelle InnoDB.)

Se le condizioni per la portabilità binaria non sono soddisfatte, è possibile copiare le tabelle MyISAM o InnoDB da un server a un altro scaricandole utilizzando un formato di testo (ad esempio, con mysqldump) e ricaricandole nel server di destinazione.

Esistono due modi principali basati sul motore di archiviazione per spostare singole tabelle.

Per l'esempio dato supponiamo che:

  1. il datadir è/var/lib/mysql
  2. database chiamato mydb
  3. tabella in mydb database chiamato mytable.

Tabelle MyISAM

Se mydb.mytable utilizza il motore di archiviazione MyISAM, la tabella verrà fisicamente manifestata come tre file separati

  1. /var/lib/mysql/mydb/mytable.frm (file .frm)
  2. /var/lib/mysql/mydb/mytable.MYD (file .MYD)
  3. /var/lib/mysql/mydb/mytable.MYI (file .MYI)

.Frm contiene la struttura della tabella
.MYD contiene i dati della tabella
.MYI contiene la pagina dell'indice della tabella

Questi file vengono utilizzati in modo interdipendente per rappresentare la tabella da un punto di vista logico in mysql. Poiché a questi file non è associata alcuna ulteriore associazione logica, la migrazione di una tabella da un server DB a un altro. Puoi persino farlo da un server Windows a un server Linux o MacOS. Ovviamente, potresti spegnere mysql e copiare i 3 file della tabella. È possibile eseguire quanto segue:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

in una sessione ssh per tenere la tabella in sola lettura e tenere il blocco per 24 ore. Un secondo dopo, esegui la copia in un'altra sessione ssh. Quindi uccidi la sessione mysql con il blocco di 24 ore. Non è necessario attendere 24 ore.

Tabelle InnoDB

Sulla base della citazione di cui sopra dal libro di certificazione, ci sono molti fattori che regolano il backup di una tabella InnoDB specifica. Per semplicità, chiarezza e brevità, è sufficiente eseguire un mysqldump della tabella desiderata utilizzando i parametri --single-transazione per ottenere un perfetto dump temporaneo della tabella. Non è necessario cncernersi con la semantica InnoDB se si desidera solo una tabella. Puoi ricaricare quel file di dump su qualsiasi server MySQL di tua scelta.

Poiché due domande sono state unite qui (jcolebrand): EDIT

Se sei più che disposto a vivere con alcune prestazioni DB lente, puoi eseguire una serie di rsync dal vecchio server (ServerA) al nuovo server (ServerB) anche mentre mysql è ancora in esecuzione su ServerA.

Step 01) installa la stessa versione di mysql su ServerB di ServerA

Passaggio 02) Su ServerA, eseguire SET GLOBAL innodb_max_dirty_pages_pct = 0; da mysql e circa 10 minuti (Questo elimina le pagine sporche dal pool di buffer InnoDB. Aiuta anche a eseguire un arresto mysql più velocemente) Se il tuo database è tutto MyISAM, puoi saltare questo passaggio.

Passaggio 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

Passaggio 04) Ripetere il passaggio 03 fino a quando un rsync impiega meno di 1 minuto

Passaggio 05) service mysql stop su ServerA

Passaggio 06) Eseguire un altro rsync

Passaggio 07) scp ServerA:/etc/my.cnf ServerB:/etc/

Passaggio 08) service mysql start su ServerB

Passaggio 08) service mysql start su ServerA (opzionale)

Provaci !!!

AVVERTIMENTO

È possibile creare uno slave di replica come questo. Ricorda solo di avere ID server esplicitamente impostato nel master /etc/my.cnf e un numero diverso per id server nello slave /etc/my.cnf

34
RolandoMySQLDBA

Non hai nemmeno bisogno di mysqldump se stai spostando un intero schema di database e sei disposto a fermare il primo database (quindi è coerente quando viene trasferito)

  1. Arresta il database (o bloccalo)
  2. Vai alla directory in cui si trovano i file di dati mysql.
  3. Trasferisci sulla cartella (e sui suoi contenuti) nella directory dei dati mysql del nuovo server
  4. Avvia il backup del database
  5. Sul nuovo server, emettere un comando 'crea database'. '
  6. Ricreare gli utenti e concedere le autorizzazioni.

Non riesco a ricordare se mysqldump gestisce utenti e autorizzazioni, o solo i dati ... ma anche se lo fa, questo è modo più veloce di fare un dump ed eseguirlo. Lo userei solo se avessi bisogno di scaricare un database mysql per poi reinserirlo in qualche altro RDBMS, se avessi bisogno di cambiare le opzioni di archiviazione (innodb vs. myisam), o forse se stessi cambiando i versi principali di mysql (ma Penso di averlo fatto tra 4 e 5, però)

29
Joe

Se vuoi solo spostare una tabella specifica prova:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

È possibile specificare più nomi di tabella sopra, nello stesso comando. Una volta completato il comando, spostare il file databasename.tablename.sql sull'altro server e quindi ripristinare utilizzando:

mysql -u username -ppassword databasename < databasename.tablename.sql

Si noti che il file .sql posteriore viene creato utilizzando il programma mysqldump e il ripristino viene eseguito direttamente in mysql.

12
StanleyJohns
  1. Se si dispone dell'accesso ssh, è possibile utilizzare mysqldump dalla riga di comando
  2. Se non hai accesso ssh ma hai accesso phpMyAdmin puoi usarlo per esportare/importare
  3. Se non si dispone dell'accesso a phpMyAdmin, ci sono alcuni utili script php che verranno scaricati e importati (tuttavia, per esperienza personale, non ne ho mai trovato uno affidabile come phpMyAdmin).

Potrebbe esserci questa possibilità in cui si spostano i file di database effettivi (per la mia installazione si trovano in/var/lib/mysql), ma non sono proprio sicuro di come funzionerà/funzionerà.

7
poelinca

Avrai bisogno di fermarti. Ci vorrà del tempo a seconda della velocità della rete. Presumo che tu stia eseguendo MySQL su Linux/Unix. Ecco il processo che utilizzo:

  1. Arresta il demone mysql sull'host di origine.
  2. Crea una cartella tmp sull'host di destinazione per ricevere i file.
  3. Usa schermo per creare una sessione Shell che sopravviva se il tuo ssh viene disconnesso.
  4. Utilizzare rsync per trasferire i file tra host. Qualcosa del tipo: rsync -avhP source user @ targethost:/path/to/folder /
  5. Esegui i tuoi casi di test per assicurarti di non aver perso nulla nel trasferimento.

Quindi procedere come al solito ottenendo la configurazione locale di MySQL.

* Nota: è anche possibile utilizzare il parametro -c con rsync per aggiungere un checksum al trasferimento, tuttavia questo sarà sloowow a seconda della velocità della CPU.

5
randomx

Penso che probabilmente tutte le risposte precedenti funzionino correttamente, ma in realtà non risolvono il problema dell'impostazione di un nome di database durante il trasferimento.

Questo è come l'ho appena fatto con bash:

Potrebbe essere meglio usare rsync rispetto a scp e non comprimere il file se lo fai spesso.

Sul mio server di origine:

[email protected]:~$ d=members
[email protected]:~$ mysqldump $d | gzip > $d.sql.gz
[email protected]:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

Sul mio server di destinazione:

[email protected]:~$ d1=members
[email protected]:~$ d2=members_sb
[email protected]:~$ mysqladmin create $d2
[email protected]:~$ cat $d1.sql.gz | gunzip |  mysql $d2

Su entrambe le macchine per vedere i progressi:

[email protected]:~$ ls *.gz 
[email protected]:~$ cat $d.sql.gz | gunzip |  less

Tutto questo presuppone che tu abbia configurazione MySQL file nella tua home directory su entrambe le macchine e imposta i permessi:

$ echo "
[client]
user=drupal6
password=metoknow
Host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
4
ErichBSchulz

Posso confermare che il metodo DTest funziona anche per la copia tra ubuntu e osx.

Per copiare tutti i database senza dover eseguire il dumping o simili:

Assicurati di avere un mysql pulito di mysql (installato il dmg scaricato da mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), che (MOLTO IMPORTANTE) non è mai stato eseguito.

Copia il contenuto della cartella/var/lib/mysql/dalla macchina ubuntu sopra/usr/local/mysql/data/contents sul mac. Per ottenere l'accesso per ottenere la cartella sulla macchina Ubuntu ho dovuto usare Sudo cioè:

Sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
Sudo chown -R foouser /home/foouser/mysql_data_folder

Ho copiato la cartella usando scp.

Prima di iniziare, prendi una copia della cartella mysql sul Mac per assicurarti di non rovinare nulla.

Dopo aver copiato la cartella, eseguire le seguenti operazioni sul computer Mac:

Sudo chown -R _mysql /usr/local/mysql/data/
Sudo chgrp -R wheel /usr/local/mysql/data/
Sudo chmod -R g+rx /usr/local/mysql/data/

Avviare il server mysql per la prima volta (dal riquadro delle preferenze in Preferenze di Sistema-> mysql). Tutti gli utenti e i database ora dovrebbero essere impostati correttamente.

Questo ha funzionato con mysql 5.1.61 su Ubuntu 64 bit 11.10 e mysql 5.1.63 su osx lion (macbook pro).

4
paalvibe

lo stai spostando su un altro server mysql db? in tal caso, esegui un'esportazione

# mysqldump -u username -ppassword database_name > FILE.sql
3
seyz4all

Metodo linux generico:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

modificare il datadir (e il socket) sia per mysqld che mysqld_safe (se applicabile) per puntare alla nuova posizione, quindi

/etc/init.d/mysql start

Ho pubblicato questo perché nessuno sembrava semplicemente elencare il minor numero di passaggi per farlo e penso che sia il modo più semplice personalmente.

3
seeafish

Vorrei suggerire i due semplici passaggi per trasferire l'intero database da un server a un altro.

Passaggio 1: esegue un backup completo dei database nel server di origine utilizzando mysqldump.

Passaggio 2: è possibile utilizzare il comando rsync per trasferire l'intero database al server di destinazione.

2
Rudra

Forse questo è un modo migliore per farlo:

Versione 1: copia dei file di dati (solo MYISAM)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

servizio ssh server2 riavvia mysql

  • Se i tuoi file di database vengono letti solo puoi saltare l'arresto del server.

Versione 2: mysqldump

Installa pigz: sui moderni processori Xeon o Opteron, specialmente quando hai 2 o più CPU, è MOLTO più veloce di gzip.

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

Versione: master/slave + mysqldump/file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

script:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

PS:

per copiare piccoli tavoli usare:

ssh server1 tabella schema mysqldump | schema ssh server2 mysql

2
parf