Saya telah menemukan sejumlah situs berbicara tentang melakukan hal ini, tetapi saya kehilangan beberapa detail penting. Langkah umumnya adalah
- Lari
FLUSH TABLES WITH READ LOCK
- Ambil snapshot ZFS
- Lari
UNLOCK TABLES
Berbagai sumber melaporkan bahwa InnoDB, yang saya gunakan, sebenarnya tidak menghormati a FLUSH
. Catatan pengguna pengguna MySQL ada FLUSH TABLES...FOR EXPORT
varian untuk digunakan dengan InnoDB, tetapi itu membutuhkan menentukan setiap tabel secara individual, daripada mencadangkan seluruh database. Saya lebih suka menghindari menentukan setiap tabel secara individual karena ada kemungkinan daftar tabel akan menjadi tidak sinkron dengan tabel yang sebenarnya ada.
Masalah lain yang saya miliki adalah saya berencana untuk melakukan sesuatu seperti mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"
. Namun, ini langsung mengunci setelah sesi keluar. Ini masuk akal, tetapi juga cukup menjengkelkan karena saya perlu memegang kunci baca ketika saya mengambil foto saya.
Gagasan saya yang lain adalah mengambil cadangan panas menggunakan alat seperti Percona XtraBackup dan mengambil snapshot cadangan, tetapi saya lebih suka tidak membayar biaya untuk menulis semua data saya ke lokasi kedua hanya untuk memotretnya.
Jawaban:
Jika Anda hanya menggunakan InnoDB untuk semua tabel dan set
innodb_flush_log_at_trx_commit
ke:1
(isi buffer log InnoDB ditulis ke file log pada setiap transaksi komit dan file log disiram ke disk) atau,2
(isi dari buffer log InnoDB ditulis ke file log setelah setiap transaksi komit dan file log dibilas ke disk kira-kira sekali per detik),maka Anda tidak perlu FLUSH TABLES sebelum melakukan snapshot, cukup jalankan snapshot ZFS secara langsung. InnoDB dapat memulihkan data dari log komit transaksi tanpa kehilangan data.
Ref: https://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit
sumber
Anda memerlukan kunci basis data lengkap untuk membuat cadangan (sebagian besar) database secara konsisten.
Manual https://dev.mysql.com/doc/refman/5.5/en/backup-methods.html mengatakan FLUSH TABLES WITH READ LOCK benar untuk snapshot ZFS secara khusus.
Ini adalah jenis konyol bahwa mereka ditinggalkan fakta bahwa Anda perlu
FLUSH TABLES table_a, table_b, table_c FOR EXPORT
untuk InnoDB dari petunjuk ini. Ini juga bodoh untuk menentukan setiap tabel seperti itu. Tetapi seperti yang dikatakan EEAA, Anda dapat membuat daftar tabel saat Anda memulai pencadangan dengan cukup mudah.Sedangkan untuk memegang kunci, Anda harus menjaga koneksi db aktif saat melakukan snapshot
Secara umum saya akan menggunakan sesuatu seperti Perl atau bahasa pemrograman lain yang dapat terhubung, mengunci db dan sambil mempertahankan koneksi db mengambil snapshot, lalu membuka kunci dan memutuskan sambungan. Itu tidak rumit. Saya bertaruh bahwa ada alat di luar sana yang sudah melakukan ini tetapi menulis satu itu mudah.
Saya katakan mudah, tidak kompleks, dll. Beberapa kali. Saya berasumsi Anda memiliki beberapa pemrograman dasar atau keterampilan menulis yang baik.
sumber
FLUSH TABLES WITH READ LOCK
dan kemudianFLUSH TABLES...FOR EXPORT
, sedangkan bacaan saya tentang manual MySQL mengatakan hanya perlu satu.Saya telah merobek dan mengadaptasi skrip konseptual sederhana di Bash yang saya temukan di pos Server Fault lain oleh Tobia . Ini akan membuat Anda sekitar 90% dari perjalanan ke sana.
Di sini,
mysql
perintah yang Anda gunakan dijalankan di latar belakang dan menyentuh file. Itu menunggu di latar belakang untuk file menghilang sebelum keluar dan dengan demikian membuka kunci tabel. Sementara itu skrip utama menunggu hingga file ada, kemudian membuat snapshot dan menghapus file.File yang ditunjuk oleh
$mysql_locked
harus dapat diakses oleh kedua mesin, yang Anda harus dapat melakukannya dengan cukup mudah karena mereka berdua dapat mengakses dataset umum (meskipun mereka mungkin menggunakan jalur yang berbeda, dan Anda harus memperhitungkan ini).sumber
system zfs snapshot...
di dalam skrip utama? Atau apakah snap-shotting harus dijalankan dalam proses terpisah?SYSTEM
perintah menjalankan hal-hal secara lokal. Jika saya menjalankan klien mysql pada kotak FreeBSD dan mengeksekusiLOCK; SYSTEM zfs snapshot; UNLOCK
, sepertinya itu akan berhasil.Anda memerlukan FLUSH TABLES DENGAN READ LOCK untuk myisam karena itu tidak menjurnal.
Anda tidak benar-benar membutuhkan apa pun untuk innodb sama sekali, IMO, karena itu penjurnalan. Ini akan tetap konsisten, hanya memutar kembali jurnal secara otomatis jika ada sesuatu yang terjadi pada saat Anda mengambil snapshot atom.
Jika Anda ingin konsistensi tingkat aplikasi, aplikasi Anda harus menggunakan transaksi. Jika aplikasi Anda menggunakan transaksi dan innodb, snapshot apa pun akan konsisten menanyakan cara naik ke level aplikasi secara otomatis.
sumber
Ini adalah solusi saya cara membuat snapshot ZFS sambil menjaga kunci:
sumber