Bisakah saya menyalin database MySQL dengan menyalin file? Apa isi file-file itu sebenarnya?

13

Saya menggunakan database MySQL dan menggunakan mesin Ubuntu Linux.

Database saya bernama db_test, saya melihat bahwa di bawah jalan /var/lib/mysql/db_test, ada file akhiran dengan .frm, .MYD, .MYIseperti berikut:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Tampaknya setiap .frm, .MYD, .MYIkelompok file dipetakan dengan satu tabel dalam database.

Saya memiliki dua pertanyaan berikut untuk diajukan:

  1. Apa sebenarnya tiga file itu?

  2. Jika saya membuat direktori baru di bawah path /var/lib/mysql/say db_test_2, dan menyalin setiap file dari db_test_1direktori ke db_test_2, apakah itu juga akan membuat database baru db_test_2yang memiliki konten (tabel) yang persis sama dengan db_test_1?

Apakah tindakan memindahkan file database secara fisik ini menghasilkan hasil yang sama seperti tindakan baris perintah berikut:

  1. buang database db_test_1keluar

  2. buat database baru db_test_2

  3. lalu buang db_test_1database kembali ke database baru db_test_2?

Jika demikian, sepertinya memindahkan file jauh lebih cepat daripada menggunakan mysqldumpuntuk menyalin basis data (atau untuk mengimpor data dari satu DB ke DB lain di MySQL). Ada pendapat tentang ini?

Mellon
sumber

Jawaban:

5
  1. AFAIR, .frm adalah file deskripsi (di mana struktur tabel basis data dijelaskan), .MYD adalah file dengan data, .MYI adalah file dengan indeks.

  2. Ya, penyalinan akan jauh lebih cepat. Tapi ada satu masalah: itu bukan atom. Di bawah memuat file yang disalin tinggi akan tidak konsisten dan bahkan mungkin rusak sama sekali. Apalagi jika Anda menggunakan mesin yang lebih 'pintar' seperti InnoDB.

Sunting: ps Anda dapat dengan aman menyalin file-file ini, tetapi sebelum Anda harus menghentikan server mysql.

rvs
sumber
4

Anda memiliki alat cmd-line yang melakukan hal ini: mysqlhotcopy

Ini berfungsi baik dengan tabel myisam, tetapi tidak dengan tabel InnoDb.

Jika Anda telah mengkonfigurasi server Anda dengan lvm, dan meletakkan / var / lib / mysql Anda di volume khusus di sini adalah cara yang saya rekomendasikan untuk membuat backup dengan sangat cepat dan dengan cara yang tidak menghalangi semua database Anda:

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

Ini mem-flush semua tabel Anda ke disk dan memblokir operasi r / w

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

Perlu disesuaikan dengan konfigurasi Anda, ini membuat snapshot dari sistem file database Anda. Tidak butuh waktu

  > unlock tables;

Ini dilakukan, operasi R / W dilanjutkan.

Sekarang Anda dapat me-mount / dev / vg_myserver / lvMysql_snap dan membuat arsip tar dari database Anda!

Olivier S
sumber
Ini sepertinya cara cepat untuk membuat cadangan db. Tetapi bagaimana dengan mengganti snapshot itu kembali sehingga menjadi basis data langsung saya lagi? Itulah bagian yang saya benar-benar khawatirkan. Saya bisa mysqldumpdb saya di bawah 2 detik. Memulihkannya adalah bagian yang lambat, memakan waktu 5-10 menit.
Buttle Butkus
pada distro baru-baru ini, snapshot lvm dapat dikembalikan ke asalnya, tetapi mungkin bukan itu yang Anda inginkan untuk mengelola backup database.
Olivier S
Mengenai mysqlhotcopy: "Utilitas ini tidak digunakan lagi di MySQL 5.6.20 dan dihapus di MySQL 5.7" Dari: [ dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html]
zeusstl
0

Ini akan bekerja untuk MyISAM, tetapi tidak untuk InnoDB. Lihat https://serverfault.com/a/367321/57569

Dari jawaban itu, tentang InnoDB:

Jika Anda berpikir untuk hanya menyalin file .frm dan .ibd, Anda berada di jalur untuk dunia yang terluka. Menyalin file .frm dan .ibd dari tabel InnoDB hanya baik jika Anda dapat menjamin bahwa id tablespace dari file .ibd cocok dengan entri id tablespace dalam metdata file ibdata1.

Peter V. Mørch
sumber