Jalankan MySQLDump tanpa Mengunci Tabel

437

Saya ingin menyalin database produksi langsung ke dalam database pengembangan lokal saya. Apakah ada cara untuk melakukan ini tanpa mengunci basis data produksi?

Saat ini saya menggunakan:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

Tapi itu mengunci setiap tabel saat dijalankan.

Greg
sumber
Solusi terlambat lainnya: Anda juga dapat menggunakan Percona XtraBackup untuk membuang basis data produksi Anda tanpa gangguan terkait pemrosesan transaksi. Itu memungkinkan untuk melakukan cadangan panas, artinya tidak memengaruhi aktivitas saat ini. Lihat di sini: percona.com/software/mysql-database/percona-xtrabackup (saya tidak punya hubungan apa pun dengan Percona.)
delx

Jawaban:

626

Apakah --lock-tables=falseopsi ini berfungsi?

Menurut halaman manual , jika Anda membuang tabel InnoDB Anda dapat menggunakan --single-transactionopsi:

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

Untuk innodb DB :

mysqldump --single-transaction=TRUE -u username -p DB
John Millikin
sumber
23
untuk innodb DB mysqldump --single-transaction = BENAR -U username -p DB
19
Bagaimana jika Anda memiliki innodb dan myisam?
CMCDragonkai
Apakah ini aktif secara default?
CMCDragonkai
jelas aktif (mis. terkunci)?
evandrix
290

Ini sudah terlambat, tetapi bagus untuk siapa saja yang mencari topik. Jika Anda bukan innoDB, dan Anda tidak khawatir tentang penguncian saat membuang, cukup gunakan opsi:

--lock-tables=false
Warren Krewenki
sumber
1
Terima kasih atas tanggapan Warren, ini sangat membantu dan bekerja seperti pesona.
Gavin
7
menggunakan '--lock-table = false --quick' menggunakan sumber daya server yang paling sedikit
SyntaxGoonoo
43
Tetapi Anda harus khawatir tentang mengunci meja. Jika beberapa tabel ditulis saat mysqldump sedang berjalan (dan Anda menggunakan kunci asing), dump Anda mungkin tidak konsisten. Anda tidak akan tahu sampai Anda mengembalikannya dan menjalankan kueri JOIN pada data yang tidak konsisten. Mungkin perlu beberapa saat untuk menemukan data yang tidak konsisten karena GABUNGAN digunakan oleh aplikasi Anda bukan Mysql (dengan tabel MyISAM); pemulihan akan berfungsi dengan baik, mysql tidak akan memperingatkan Anda tentang ketidakkonsistenan. Jadi: MyIsam -> selalu mengunci meja Anda. InnoDB -> gunakan --single-transaction.
Costa
12
@Costa Saya tidak berpikir tabel penguncian bahkan cukup untuk tabel MyISAM. Jika mysqldump mengunci tabel di antara kueri yang dieksekusi oleh aplikasi maka Anda berakhir dengan inkonsistensi yang sama. Jawabannya bahkan lebih sederhana: MyISAM -> gunakan InnoDB sebagai gantinya.
cdhowie
@Costa Anda pasti harus khawatir tentang mengunci tabel, tetapi hanya jika Anda memang membutuhkan dump yang konsisten . Ada beberapa kasus langka ketika Anda tidak melakukannya. Sebagai contoh, gambar kasar pada dump basis data (debugging): Saya yakin seseorang tidak ingin pengguna menunggu ~ 20 menit untuk membuat dump database produksi (kisah nyata). Jika intinya adalah untuk mendapatkan dump tidak hanya SECEPATNYA, tetapi juga KONSISTEN , seseorang harus membuang budak yang direplikasi atau menggunakan snapshotting tingkat rendah (lvm, zfs, btrfs, dll), dengan mengingat FLUSH TABLES WITH READ LOCKhal-hal yang diingat .
Alex Offshore
44

Jawabannya bervariasi tergantung pada mesin penyimpanan apa yang Anda gunakan. Skenario yang ideal adalah jika Anda menggunakan InnoDB. Dalam hal ini Anda dapat menggunakan --single-transactionflag, yang akan memberi Anda snapshot yang masuk akal dari database pada saat dump dimulai.

dvorak
sumber
35

--skip-add-locks membantu saya

Azamat Tokhtaev
sumber
2
atau --compact untuk menyertakan lewati kunci dengan optimisasi lainnya.
ppostma1
77
Ini menghapus pernyataan LOCK TABLES dan UNLOCK TABLES dari file dump, itu tidak mempengaruhi penguncian selama ekspor.
dabest1
11
Tidak, bukan itu yang Anda cari! Lihat komentar dabest1. Ini TIDAK ADA untuk menjaga meja Anda dari terkunci saat melakukan mysqldump. Ini BUKAN jawaban untuk pertanyaan itu.
orrd
@dabest dan @orrd benar: --skip-add-lockshanya akan membuat pengembalian sampah lebih cepat. Ini bukan jawaban yang benar.
dr_
10

Jujur, saya akan menyiapkan replikasi untuk ini, seolah-olah Anda tidak mengunci tabel Anda akan mendapatkan data yang tidak konsisten dari dump.

Jika dump membutuhkan waktu lebih lama, tabel yang sudah dibuang mungkin telah berubah bersama dengan beberapa tabel yang hanya akan dibuang.

Jadi kunci meja atau gunakan replikasi.

mikrofon
sumber
Seluruh DB ini hampir seluruhnya hanya dibaca jadi saya tidak terlalu khawatir tentang perubahan itu.
Greg
2
Komentar ini salah. MVCC memungkinkan untuk membaca keadaan konsisten tanpa kunci pada InnoDB.
Scott Hyndman
5
Jika Anda belum membuat replikasi, maka Anda perlu melakukan dump untuk mengaturnya. Masalah yang sama ada.
Matt Connolly
3
Jika Anda belum memiliki replikasi yang telah disiapkan, maka Anda perlu mengunci tabel untuk melakukan dump untuk memastikan integritas data. Jadi itu adalah tangkapan 22.
JordanC
9

Ini hampir terlambat dibandingkan dengan orang yang mengatakan dia terlambat seperti dia dengan jawaban asli, tetapi dalam kasus saya (MySQL via WAMP pada Windows 7), saya harus menggunakan:

--skip-lock-tables
dtbarne
sumber
Inilah yang berhasil bagi saya untuk membuang information_schema tanpa kesalahan "Akses ditolak untuk pengguna 'debian-sys-maint' @ 'localhost' ke basis data 'information_schema' saat menggunakan LOCK TABLES"
Rui F Ribeiro
6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db
naveen_sfx
sumber
Suara, yang satu ini berhasil bagi saya hanya menambahkan parameter --skip-opt --single-transaction --max_allowed_packet = 1G
Steven Lizarazo
1
Saya tidak merekomendasikan "--skip-opt" untuk tujuan ini. Itu lebih dari sekadar pertanyaan awal. Ini mematikan mode cepat, tidak termasuk charset, dll.
orrd
3

Saat menggunakan MySQL Workbench, di Ekspor Data, klik Opsi Lanjut dan hapus centang opsi "kunci-tabel".

masukkan deskripsi gambar di sini

Samuel Diogo
sumber
1

Karena tidak satu pun dari pendekatan ini bekerja untuk saya, saya hanya melakukan:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

Ini akan mengecualikan keduanya LOCK TABLE <x>dan UNLOCK TABLESperintah.

Catatan: Semoga data Anda tidak mengandung string di dalamnya!

augustomen
sumber
2
--skip-add-locks selama dump melakukan itu juga
codewandler
0

Jawaban terlambat lainnya:

Jika Anda mencoba untuk membuat salinan panas dari database server (dalam lingkungan linux) dan mesin database dari semua tabel adalah MyISAM yang harus Anda gunakan mysqlhotcopy.

Menurut dokumentasi:

Ia menggunakan FLUSH TABLES, LOCK TABLES, dan cp atau scp untuk membuat cadangan basis data. Ini adalah cara cepat untuk membuat cadangan dari database atau tabel tunggal, tetapi itu dapat dijalankan hanya pada mesin yang sama di mana direktori database berada. mysqlhotcopy hanya berfungsi untuk membuat cadangan tabel MyISAM dan ARCHIVE.

The LOCK TABLESwaktu tergantung dari waktu server dapat menyalin file MySQL (itu tidak membuat dump).

Andrés Morales
sumber
0

Hari ini Bahkan saya menghadapi masalah yang sama tetapi saya tidak memiliki akses ke command line. Jadi saya membuka file sql di Notepad editor dan menghapus baris di bawah ini dari tabel

LOCK TABLES `yourtable name` WRITE;

maka saya diimpor ke lingkungan pengembangan saya. Bekerja dengan baik. semoga bisa membantu seseorang

iCoders
sumber