MySQLDump'ı Tabloları Kilitlemeden Çalıştırma


437

Canlı prodüksiyon veri tabanını yerel geliştirme veri tabanıma kopyalamak istiyorum. Üretim veritabanını kilitlemeden bunu yapmanın bir yolu var mı?

Şu anda kullanıyorum:

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

Ama çalışırken her masayı kilitliyor.


Başka bir geç çözüm: Percona XtraBackup aracını ayrıca, işlem işleme ile ilgili herhangi bir kesinti olmadan üretim veritabanınızı dökmek için de kullanabilirsiniz. Etkin bir yedekleme yapılmasına izin verir, yani mevcut aktiviteleri etkilemez. Buraya bakın: percona.com/software/mysql-database/percona-xtrabackup ( Percona ile herhangi bir ilişkim yok.)
delx

Yanıtlar:


626

Does --lock-tables=falseseçenek çalışır?

Göre adam sayfasında size InnoDB'nin tabloları damping eğer, sen kullanabilirsiniz --single-transactionseçeneği:

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

İçin innodb DB :

mysqldump --single-transaction=TRUE -u username -p DB

23
innodb DB için mysqldump --single-transaction = DOĞRU -u kullanıcı adı -p DB
AMB

19
Innodb ve myisam'ınız varsa ne olur?
CMCDragonkai

Bu varsayılan olarak açık mı?
CMCDragonkai

belli ki açık (yani kilitli)?
evandrix

290

Bu çok geç, ama konuyu arayan herkes için iyi. İnnoDB değilseniz ve döküm sırasında kilitleme konusunda endişelenmiyorsanız, sadece seçeneği kullanın:

--lock-tables=false

1
Yanıt Warren için teşekkürler, bu çok yardımcı oldu ve bir cazibe gibi çalıştı.
Gavin

7
'--lock-table = false --quick' kullanmak, en az sunucu kaynağını kullanır
SyntaxGoonoo

43
Ama gereken tabloları kilitleme hakkında endişe. Mysqldump çalışırken birden çok tablo yazılırsa (ve yabancı anahtarlar kullanırsanız), döküm tutarsız olabilir. Geri yükleyene ve tutarsız veriler üzerinde JOIN sorguları çalıştırılana kadar bilemezsiniz. Tutarsız verilerin keşfedilmesi biraz zaman alabilir, çünkü JOIN'ler Mysql tarafından değil (MyISAM tablolarıyla) uygulamanız tarafından kullanılır; geri yükleme gayet iyi çalışır, mysql tutarsızlıklar konusunda sizi uyarmaz. Yani: MyIsam -> her zaman masalarınızı kilitleyin. InnoDB -> kullanın --single-transaction.
Costa

12
@Costa Tabloları kilitlemenin MyISAM tabloları için bile yeterli olduğunu düşünmüyorum. Mysqldump , uygulama tarafından yürütülen sorgular arasında tabloları kilitlerse , aynı tutarsızlıklar ile sarılır. Cevap daha da basit: MyISAM -> bunun yerine InnoDB'yi kullanın.
cdhowie

@Costa tabloları kilitleme konusunda kesinlikle endişelenmelisiniz, ancak sadece tutarlı bir döküme ihtiyacınız varsa . Yapmadığınız bazı nadir durumlar vardır. Örneğin, veritabanı çapında dökümü (hata ayıklama) üzerinde ham bir fgrep: Eminim bir kullanıcı üretim veritabanı dökümü (gerçek hikaye) dökümü oluşturmak için ~ 20 dakika beklemek istemiyorum. Eğer nokta sadece ASAP'ı değil, aynı zamanda SÜREKLİ'yi de dökmekse, kopyalanmış köleyi boşaltmalı veya daha düşük seviyeli anlık görüntü (lvm, zfs, btrfs, vb.) Kullanmalı FLUSH TABLES WITH READ LOCK.
Alex Offshore

44

Yanıt, kullandığınız depolama motoruna bağlı olarak değişir. İdeal senaryo, InnoDB kullanıyorsanız. Bu durumda --single-transaction, dökümün başladığı anda veritabanının tutarlı bir anlık görüntüsünü verecek bayrağı kullanabilirsiniz .


35

--skip-add-locks bana yardım etti


2
veya - diğer optimizasyonlarla atlama kilitlerini dahil etmek için kompakt.
ppostma1

77
Bu, LOCK TABLES ve UNLOCK TABLES deyimlerini döküm dosyasından kaldırır, dışa aktarma sırasında kilitlemeyi etkilemez.
dabest1

11
Hayır, aradığınız şey değil! Dabest1'in yorumuna bakın. Bu bir mysqldump yaparken tabloları kilitli tutmak için hiçbir şey yapmaz. Bu sorunun cevabı DEĞİLDİR.
orrd

@ dabest ve @orrd doğrudur: --skip-add-locksçöplüklerin daha hızlı geri yüklenmesini sağlar. Bu doğru bir cevap değil .
dr_



10

Dürüst olmak gerekirse, tabloları kilitlemezseniz, tutarsız verileri dökümden alacaksınız gibi, bunun için çoğaltma kurarım.

Döküm daha uzun sürerse, zaten dökülmüş olan tablolar, yalnızca dökülmek üzere olan bazı tablolarla birlikte değişmiş olabilir.

Yani tabloları kilitleyin veya çoğaltmayı kullanın.


Bu bütün DB neredeyse tamamen okunuyor, bu yüzden değişen konusunda çok endişelenmiyorum.
Greg

2
Bu yorum yanlış. MVCC, InnoDB üzerinde kilitsiz tutarlı durumun okunmasına izin verir.
Scott Hyndman

5
Önceden ayarlanmış çoğaltmanız yoksa, ayarlamak için bir döküm yapmanız gerekir. Aynı sorun var.
Matt Connolly

3
Zaten kurulumda çoğaltma yoksa, veri bütünlüğünü sağlamak için dökümü yapmak için tabloları kilitlemeniz gerekir. Yani bu bir yakalama 22.
JordanC

9

Bu, orijinal cevaba olduğu gibi geç kaldığını söyleyen adama göre yaklaşık olarak geç, ancak benim durumumda (Windows 7'de WAMP aracılığıyla MySQL) kullanmak zorunda kaldım:

--skip-lock-tables

"KİLİT TABLOLARI kullanılırken" debian-sys-maint '@' localhost 'kullanıcısı için erişim reddedildi "bilgi_schema' yı LOCK TABLES kullanırken" bilgi_schema 'veritabanına "atmak için işe yarayan şey buydu
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

Yukarı oy, bu benim için çalıştı sadece parametreleri eklemek - atlama-opt - tek-işlem --max_allowed_packet = 1G
Steven Lizarazo 18:09

1
Bu amaçla "--skip-opt" önermiyorum. Bu, orijinal sorunun istediğinden çok daha fazlasını yapar. Hızlı modu kapatır, karakter seti vb.
İçermez

3

MySQL Workbench'i kullanırken, Verileri Dışa Aktar'da Gelişmiş Seçenekler'e tıklayın ve "kilit tabloları" seçeneklerinin işaretini kaldırın.

resim açıklamasını buraya girin


1

Bu yaklaşımların hiçbiri benim için işe yaramadığından, basitçe şunları yaptım:

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

Hem dışarıda bırakır LOCK TABLE <x>ve UNLOCK TABLESkomutları.

Not: Umarız verileriniz bu dizeyi içermez!




0

Başka bir geç cevap:

Eğer (a linux ortamında) sunucusu veritabanının sıcak kopyasını yapmaya çalışıyoruz ve tüm tabloları veritabanı motoru MyISAM ise olmalıdır kullanmakmysqlhotcopy .

Belgelere göre:

Bir veritabanı yedekleme yapmak için FLUSH TABLES, LOCK TABLES ve cp veya scp kullanır. Veritabanının veya tek tabloların yedeğini almanın hızlı bir yoludur, ancak yalnızca veritabanı dizinlerinin bulunduğu makinede çalıştırılabilir. mysqlhotcopy yalnızca MyISAM ve ARCHIVE tablolarını yedeklemek için çalışır.

LOCK TABLESZaman sunucusu MySQL dosyaları kopyalayabilirsiniz zaman (bir dökümü yapmaz) bağlı.


0

Bugün bile aynı sorunla karşı karşıya kaldım ama komut satırına erişimim yoktu. Bu yüzden not defteri düzenleyicisinde sql dosyasını açtım ve tabloların altındaki satır kaldırıldı

LOCK TABLES `yourtable name` WRITE;

o zaman benim geliştirme ortamına ithal. iyi çalışır. umarım bazılarına yardım et

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.