Praktik terbaik untuk membuat cadangan DB MySQL

23

Saya baru-baru ini menemukan bahwa server web produksi kami yang menjalankan MySQL tidak didukung secara teratur (atau sama sekali). Saya sudah terbiasa membuat cadangan SQL Server DB tetapi tidak memiliki banyak pengalaman dengan MySQL DB. Adakah praktik terbaik untuk menggunakan 'mysqldump' atau alat cadangan DB lainnya?

Saya mungkin akan menjadwalkan tugas cron sehingga selesai setiap malam dan kemudian membuat cadangan file dengan sistem cadangan saya.

Terima kasih.

Valien
sumber

Jawaban:

29

Praktik Terbaik untuk mengambil cadangan server MySQL:

Replikasi MySQL

Setup Replikasi di MySQL. Anda harus mengatur server Master dan Slave. Semua baca-tulis ke DB bisa masuk ke Server Slave Anda. Keuntungan dari memiliki Replikasi adalah Anda dapat mengambil cadangan dari server slave Anda tanpa mengganggu server Master, aplikasi Anda akan terus bekerja pada Master tanpa downtime.

Menggunakan MySQL Dump

Jika kumpulan data Anda kecil (saya sadar "kecil" adalah istilah relatif .. untuk memenuhi syarat, katakanlah <10GB), maka mysqldump mungkin akan berfungsi dengan baik. Mudah, online, dan sangat fleksibel. Hanya beberapa hal yang dapat dilakukan mysqldump: mencadangkan semuanya atau hanya basis data atau tabel tertentu, hanya mengoptimalkan DDL dump untuk pemulihan yang lebih cepat membuat file sql yang dihasilkan lebih kompatibel dengan RDBMS lain dan banyak lagi hal lainnya.

Namun, opsi yang paling penting terkait dengan konsistensi cadangan Anda. Opsi favorit saya adalah: - transaksi tunggal: opsi ini memberikan cadangan yang konsisten, jika (dan hanya jika) tabel menggunakan mesin penyimpanan InnoDB. Jika Anda memiliki tabel MyISAM non-baca-saja, maka jangan gunakan opsi ini saat mencadangkannya. --master-data = 2: opsi ini akan memastikan dump Anda konsisten (dengan melakukan kunci-semua-tabel kecuali Anda telah menambahkan opsi --single-transaction). Opsi --master-data juga mencatat posisi log biner dalam file dump yang dihasilkan (= 2 menyebabkan baris ini menjadi komentar dalam file dump)

Catatan akhir tentang mysqldump: perlu diingat bahwa waktu pemulihan mungkin jauh lebih lama daripada waktu cadangan. Ini akan tergantung pada beberapa faktor, misalnya, berapa banyak indeks yang Anda miliki.

Snapshot LVM

Bagi mereka yang memiliki kumpulan data yang lebih besar, cadangan fisik adalah caranya. Meskipun Anda dapat mengambil cadangan dingin (yaitu, mematikan layanan MySQL, menyalin direktori data, memulai kembali layanan), banyak orang tidak ingin downtime. Solusi favorit saya adalah snapshot. Ini bisa panas (untuk InnoDB) atau memerlukan kunci singkat (untuk MyISAM). Jangan lupa sertakan semua data Anda (sertakan ib_logfiles). Lenz menyediakan utilitas yang bagus untuk membantu dengan ini: http://www.lenzg.net/mylvmbackup/

Menggunakan MySQL Enterprise Backup

Keuntungan menggunakan MySQL Enterprise Backup:

  • Cadangan "Hot" dari tabel InnoDB dilakukan sepenuhnya secara online, tanpa memblokir Cadangan hanya tabel atau tablespace tertentu
  • Hanya buat cadangan data yang berubah sejak cadangan sebelumnya
  • Cadangan Terkompresi - Menghemat penyimpanan hingga 90% dan banyak lagi ..

Referensi: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
sumber
7

Saya akan merekomendasikan pengaturan replika khusus untuk digunakan sebagai cadangan. Ini akan memungkinkan Anda melakukan tugas cadangan apa pun tanpa memengaruhi tugas utama. Karena hal ini menambah kompleksitas pada arsitektur Anda, Anda akan ingin memantau jeda replikasi untuk memastikan semuanya berfungsi.

Adapun proses yang sebenarnya, Anda memiliki beberapa opsi tanpa alat pihak ketiga. Snapshots dapat diambil dengan menggunakan mysqldumpperintah (dengan asumsi Anda menggunakan InnoDB): mysqldump --all-databases --single-transaction > all_databases.sql. Tergantung pada ukuran data, mungkin lebih baik untuk mematikan MySQL dan mencadangkan file data secara langsung. Ketika replika dimulai kembali itu akan memutar ulang semua peristiwa utama yang diterima dalam durasi itu turun. Jika Anda menggunakan MySQL Enterprise, mysqlbackuputilitas melakukan hal ini.

Pencadangan tambahan dapat diambil dengan mengaktifkan log biner pada replika. Jelas, ini hanya merekam peristiwa yang memutasi data sehingga Anda harus menggabungkan ini dengan foto di atas.

Schumacher kaya
sumber
3
Memberi +1 untuk --single-transactiontetapi jangan lupa untuk menambahkan --events --routinesdan saya selalu menggunakan --triggersjuga, meskipun itu diaktifkan secara default, karena dapat dinonaktifkan di my.cnf. Saya akan mengatakan itu cukup baik selalu menggunakan ini sebagai praktik standar apakah Anda saat ini memiliki jenis objek dalam database Anda atau tidak.
Michael - sqlbot
Catatan mysqldump --all-database dapat memicu kesalahan saat Anda memiliki pengaturan tabel terbuka maks rendah. jadi awasi mysql.log Anda. Replikasi memang akan menjadi cara cadangan terbaik
Raymond Nijland
Lalu bagaimana Anda menyimpan salinan historis data? (Seringkali, klien menginginkan cadangan satu bulan atau lebih disimpan, dan ketika bug aplikasi merusak data, pengembang menginginkan salinan db dari sebelum bug tersebut.)
RonJohn