Semua Data adalah InnoDB
Inilah yang akan memberi Anda snapshot point-in-time data yang tepat:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
menghasilkan pos pemeriksaan yang memungkinkan dump untuk menangkap semua data sebelum pos pemeriksaan saat menerima perubahan yang masuk. Perubahan yang masuk itu tidak menjadi bagian dari dump. Itu memastikan point-in-time yang sama untuk semua tabel.
--routines
membuang semua prosedur tersimpan dan fungsi tersimpan
--triggers
dump semua pemicu untuk setiap tabel yang memilikinya
Semua Data adalah MyISAM atau Campuran InnoDB / MyISAM
Anda harus memaksakan kunci baca global, melakukan mysqldump, dan melepaskan kunci global
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Cobalah !!!
UPDATE 2012-06-22 08:12 EDT
Karena Anda memiliki <50MB total data, saya memiliki opsi lain. Alih-alih meluncurkan perintah SLEEP ke latar belakang untuk menahan kunci baca global selama 86400 detik (24 jam) hanya untuk mendapatkan ID proses dan membunuh di luar, mari kita coba menetapkan batas waktu 5 detik di mysql daripada di OS:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Ini adalah pendekatan yang lebih bersih dan sederhana untuk database yang sangat kecil.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
ada pesan kesalahan yang diharapkan?--single-transaction
opsi, sebagaimana disebutkan dalam jawaban lain.--lock-tables
.Lihat dokumentasi resmi di sini
sumber
Jika Anda ingin melakukan ini untuk MyISAM atau tabel campuran tanpa downtime dari mengunci tabel, Anda dapat mengatur database slave, dan mengambil foto Anda dari sana. Menyiapkan database slave, sayangnya, menyebabkan beberapa downtime untuk mengekspor database live, tetapi begitu itu berjalan, Anda harus dapat mengunci tabel itu, dan mengekspor menggunakan metode yang telah dijelaskan orang lain. Ketika ini terjadi, itu akan tertinggal di belakang master, tetapi tidak akan menghentikan master dari memperbarui tabel itu, dan akan menyusul segera setelah cadangan selesai.
sumber
Begini cara saya melakukannya. Ini harus bekerja dalam semua kasus sejak digunakan
FLUSH TABLES WITH READ LOCK
.sleep
Perintah shell hanya untuk memastikan bahwa tugas latar belakang yang menjalankan perintah penguncian mysql dijalankan sebelum mysqldump dimulai. Anda bisa menguranginya menjadi 1 detik dan itu harus tetap baik-baik saja. Naikkan menjadi 30 detik dan coba masukkan nilai dalam tabel apa pun dari klien lain selama 30 detik itu Anda akan melihatnya terkunci.Ada 2 keuntungan dalam menggunakan penguncian latar belakang manual ini, daripada menggunakan
mysqldump
opsi--single-transaction
dan--lock-tables
:mysqldump
pada periode penguncian yang sama. Ini berguna, misalnya, ketika mengatur replikasi pada master node, karena Anda perlu mendapatkan posisi log biner denganSHOW MASTER STATUS;
keadaan yang tepat dari dump yang Anda buat (sebelum membuka kunci basis data), untuk dapat membuat budak replikasi.sumber
Saran dari dokumentasi resmi mysql adalah bahwa Anda harus memiliki database Master "M1" dan Database Slave "S1" yang dijelaskan dalam "Skenario 2: Cadangkan dengan Slave Hanya-Baca" Mencadangkan Master atau Slave dengan Membuatnya Baca Saja
Anda harus mengatur basis data slave hanya baca dan lakukan th
sumber
jika Anda memiliki tabel MYISAM yang sangat besar dan Anda perlu membuang tabel tersebut tanpa mengunci dan menghindari beban server yang tinggi, Anda dapat menggunakan skrip berikut.
sumber