Apakah tabel InnoDB terkunci selama mysqldump saat dicampur dengan MyISAM?


9

Saya mencari solusi cadangan untuk server mysql saya dan saya perlu waktu henti sesedikit mungkin. Saya memiliki yang berikut ini:

  • Server MySQL
  • mereka tidak direplikasi
  • setiap server adalah singkatan dari sendiri

Jumlah ini bisa bertambah, jadi menyiapkan replikasi master / slave tidak akan menjadi ide yang baik.

Cara backup termudah seperti yang saya lihat akan menggunakan mysqldump dengan perangkat lunak seperti "automysqlbackup". Data saya yang paling penting menggunakan InnoDB. Tabel InnoDB saya cukup berat.

Pertanyaannya adalah: Jika saya melakukan mysqldump ke semua database di server, apakah itu akan mengunci tabel Innodb saya?

Jawaban:


7

mysqldumps dengan InnoDB dan MyISAM bersama-sama diperlakukan sebagai saling eksklusif. Inilah alasannya:

Jika Anda dapat masuk ke mysql saat mysqldump sedang berlangsung, Anda akan melihat sesuatu seperti ini:

SELECT /* SQL_NO_CACHE */ * FROM tblname

Secara default, mysqldump akan melakukan hal berikut:

  • Setiap basis data dibuang dalam urutan abjad
  • Setiap tabel yang dibuang per basis data ditumpuk dalam urutan abjad (terlepas dari mesin penyimpanan)

Ini harus baik untuk MySQL Instance yang tidak memiliki aktivitas database lainnya. Tabel InnoDB dan tabel MyISAM tidak saling memengaruhi.

Menggunakan --single-transactionterhadap MySQL Instance all-InnoDB menciptakan pos pemeriksaan dan membuang semua tabel dari titik-dalam-waktu yang sama. Setelah tabel MyISAM ditemukan, semua taruhan dimatikan. Ini bisa menyebabkan semua tabel InnoDB setelah MyISAM dibuang dari titik waktu yang berbeda.

Untuk memiliki dump point-in-time yang konsisten untuk campuran InnoDB dan MyISAM Anda memiliki opsi di sana

PILIHAN 1

Mulai ulang mysql sehingga tidak ada orang lain yang bisa masuk melalui TCP / IP dan kemudian mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

PILIHAN 2

Jika semua tabel MyISAM hanya untuk membaca, hanya mysqldump menggunakan --single-transaction

OPSI # 3

Jika ada tabel MyISAM yang sedang ditulis, - transaksi tunggal tidak cukup

Anda harus melakukan hal berikut:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Segera setelah mysqldump selesai, login ke mysql dan lakukan show processlist;. Cari kueri SELECT SLEEP(86400), temukan ID proses, dan jalankanKILL <procidnumn>;


5

mysqldump --single-transactiontidak mengunci tabel tetapi tabel MyISAM tidak dijamin memiliki dump yang konsisten dengan opsi ini. Lebih baik digunakan mydumper, mydumpermengunci tabel MyISAM dan tidak mengunci InnoDB sehingga dump konsisten.


Wow, terima kasih atas alat hebat ini! Apakah Anda terbiasa dengan alat yang dapat mengotomatiskan cadangan harian, mingguan, bulanan dengan mydumper? Sesuatu seperti "automysqlbackup", hanya dengan mydumper? Terima kasih.
tounano

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.