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?

tounano
sumber

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>;

RolandoMySQLDBA
sumber
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.

Alex
sumber
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
0

tabel mysqldump mengunci selama dump. Gunakan snapshot LVM atau Xtrabackup .

Wasif
sumber