Posso copiare un database MySQL copiando i file? Cosa contengono esattamente i file?


13

Sto usando il database MySQL e sto usando una macchina Ubuntu Linux.

Il mio database denominato db_test, ho notato che sotto il percorso /var/lib/mysql/db_test, ci sono file un suffisso con .frm, .MYD, .MYIcome segue:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Sembra ogni .frm, .MYD, .MYIgruppo file mappato con una tabella nel database.

Ho le seguenti due domande da porre:

  1. Cosa stanno facendo esattamente i tre file?

  2. Se creo una nuova directory sotto il percorso /var/lib/mysql/dire db_test_2, e copio tutti i file dalla db_test_1directory in db_test_2, creerà anche un nuovo database db_test_2che ha esattamente lo stesso contenuto (tabelle) di db_test_1's?

Questa azione di spostamento dei file del database fisico crea lo stesso risultato delle seguenti azioni della riga di comando:

  1. il dump del database db_test_1fuori

  2. creare un nuovo database db_test_2

  3. quindi scaricare db_test_1nuovamente il database nel nuovo database db_test_2?

In tal caso, sembra che lo spostamento dei file sia molto più veloce rispetto all'utilizzo mysqldumpper copiare database (o per importare dati da un DB a un altro DB in MySQL). Qualche opinione su questo?

Risposte:


5
  1. AFAIR, .frm è un file di descrizione (in cui è descritta la struttura della tabella del database), .MYD è un file con dati, .MYI è un file con indici.

  2. Sì, la copia sarà molto più veloce. Ma c'è un problema: non è atomico. Sotto carico elevato i file copiati saranno incoerenti e forse addirittura corrotti. Soprattutto se si utilizza un motore più "intelligente" come InnoDB.

Modifica: ps È possibile copiare in sicurezza questi file, ma prima di interrompere il server mysql.


4

Hai uno strumento cmd line che fa esattamente questo: mysqlhotcopy

Funziona bene con le tabelle myisam, ma non con le tabelle InnoDb.

Se hai configurato il tuo server con lvm e metti il ​​tuo / var / lib / mysql su un volume dedicato, ecco il modo in cui consiglio di eseguire il backup molto velocemente e in modo non bloccante tutti i tuoi database:

mysql -U root -p
  > flush tables with read lock;

Questo scarica tutte le tue tabelle su disco e blocca qualsiasi operazione di r / w

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

Deve essere adattato alla tua configurazione, questo crea un'istantanea del filesystem del tuo database. Non ci vuole tempo

  > unlock tables;

Ciò viene fatto, le operazioni di R / W vengono riprese.

Ora puoi montare / dev / vg_myserver / lvMysql_snap e creare un archivio tar del tuo database!


Questo sembra un modo rapido per eseguire il backup del db. Ma che dire di ripristinare quella istantanea in modo che diventi di nuovo il mio database live? Questa è la parte di cui sono veramente preoccupato. Posso il mysqldumpmio db in meno di 2 secondi. Il ripristino è la parte lenta, che richiede 5-10 minuti.
Buttle Butkus,

su distro recenti le istantanee di lvm possono essere ripristinate all'origine, ma probabilmente non è ciò che si desidera per la gestione dei backup del database.
Olivier S,

Per quanto riguarda mysqlhotcopy: "Questa utility è obsoleta in MySQL 5.6.20 e rimossa in MySQL 5.7" Da: [ dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html]
zeusstl

0

Funzionerà con MyISAM, ma non con InnoDB. Vedi https://serverfault.com/a/367321/57569

Da quella risposta, su InnoDB:

Se stai pensando di copiare semplicemente il file .frm e .ibd, sei in linea con il mondo del male. La copia del file .frm e .ibd di una tabella InnoDB è utile solo se si può garantire che l'id del tablespace del file .ibd corrisponda esattamente alla voce dell'ID del tablespace nei metdati del file ibdata1.

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.