टेबल्स को लॉक किए बिना MySQLDump चलाएं


437

मैं अपने स्थानीय विकास डेटाबेस में एक लाइव उत्पादन डेटाबेस की प्रतिलिपि बनाना चाहता हूं। क्या उत्पादन डेटाबेस को लॉक किए बिना ऐसा करने का कोई तरीका है?

मैं वर्तमान में उपयोग कर रहा हूं:

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

लेकिन यह दौड़ते हुए प्रत्येक टेबल को लॉक कर रहा है।


एक और देर से समाधान: आप लेनदेन प्रसंस्करण के बारे में बिना किसी रुकावट के अपने उत्पादन डेटाबेस को डंप करने के लिए पर्कोना एक्सट्रैकबैक का उपयोग कर सकते हैं। यह एक हॉट बैकअप करने की अनुमति देता है, अर्थात यह वर्तमान गतिविधियों को प्रभावित नहीं करता है। यहाँ देखें: percona.com/software/mysql-database/percona-xtrabackup (मेरा Percona के साथ किसी भी तरह से कोई संबंध नहीं है।)
delx

जवाबों:


625

क्या --lock-tables=falseविकल्प काम करता है?

मैन पेज के अनुसार , यदि आप InnoDB टेबल डंप कर रहे हैं तो आप --single-transactionविकल्प का उपयोग कर सकते हैं :

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

के लिए InnoDB डीबी :

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

23
मासूम के लिए DB mysqldump --single-transaction = TRUE -u उपयोगकर्ता नाम -p DB
AMB

19
अगर आपके पास मासूम और मायसम है तो क्या होगा?
CMCDragonkai

क्या यह डिफ़ॉल्ट रूप से है?
CMCDragonkai

जाहिर है (यानी बंद)?
इवांड्रिक्स

290

यह उम्र बहुत देर से है, लेकिन इस विषय को खोजने वाले किसी भी व्यक्ति के लिए अच्छा है। यदि आप innoDB नहीं हैं, और आप डंपिंग के बारे में चिंतित नहीं हैं जब आप डंप करते हैं तो केवल विकल्प का उपयोग करें:

--lock-tables=false

1
प्रतिक्रिया के लिए धन्यवाद वॉरेन, यह बहुत मददगार था और एक आकर्षण की तरह काम करता था।
गाविं

7
'--lock-table = false --quick' का उपयोग करके कम से कम सर्वर संसाधनों का उपयोग किया जाता है
SyntaxGoonoo

43
लेकिन आपको तालिकाओं को लॉक करने के बारे में चिंतित होना चाहिए । यदि mysqldump चल रहा है (और आप विदेशी कुंजियों का उपयोग करते हैं), तो कई तालिकाएँ लिखी जाती हैं, आप डंप कर असंगत हो सकते हैं। जब तक आप इसे पुनर्स्थापित नहीं करते हैं और असंगत डेटा पर JOIN क्वेरी को चलाने के लिए नहीं जानते हैं। असंगत डेटा को खोजे जाने में कुछ समय लग सकता है क्योंकि JOINs का उपयोग आपके आवेदन द्वारा नहीं किया जाता है, MySQL (MyISAM तालिकाओं के साथ); पुनर्स्थापना ठीक काम करेगी, mysql आपको विसंगतियों के बारे में चेतावनी नहीं देगी। इसलिए: MyIsam -> हमेशा अपनी टेबल लॉक करें। InnoDB -> उपयोग करें --single-transaction
कोस्टा

12
@ कोस्टा मुझे नहीं लगता कि ताला लगाना भी MyISAM तालिकाओं के लिए पर्याप्त है। यदि mysqldump एप्लिकेशन द्वारा निष्पादित प्रश्नों के बीच तालिकाओं को लॉक करता है, तो आप उसी विसंगतियों के साथ हवा देते हैं। उत्तर और भी सरल है: MyISAM -> इसके बजाय InnoDB का उपयोग करें।
cdhowie

@ कोस्टा आपको निश्चित रूप से तालिकाओं को बंद करने के बारे में चिंतित होना चाहिए , लेकिन केवल तभी जब आपको एक सुसंगत डंप की आवश्यकता हो । जब आप नहीं करते हैं तो कुछ दुर्लभ मामले होते हैं। उदाहरण के लिए, डेटाबेस-वाइड डंप (डीबगिंग) पर एक क्रैग fgrep: मैं शर्त लगाता हूं कि उपयोगकर्ता नहीं चाहते कि प्रोडक्शन डेटाबेस (सच्ची कहानी) के डंप बनाने के लिए ~ 20 मिनट तक प्रतीक्षा करें। यदि बिंदु को न केवल एएसएपी, बल्कि कंसिस्टेंट भी डंप करना है, तो किसी को प्रतिकृति दास को डंप करना चाहिए या निचले स्तर के स्नैपशॉटिंग (lvm, zfs, btrfs, आदि) का उपयोग करना चाहिए, FLUSH TABLES WITH READ LOCKसामान को ध्यान में रखते हुए ।
एलेक्स ऑफशोर

44

उत्तर इस बात पर निर्भर करता है कि आप किस संग्रहण इंजन का उपयोग कर रहे हैं। आदर्श परिदृश्य यदि आप InnoDB का उपयोग कर रहे हैं। उस स्थिति में आप --single-transactionध्वज का उपयोग कर सकते हैं , जो आपको उस समय डेटाबेस के सुसंगत स्नैपशॉट देगा जो डंप शुरू होता है।


35

--skip-add-locks मेरे लिए मदद की


2
या भी - अन्य अनुकूलन के साथ छोड़ ताले को शामिल करने के लिए समझौता।
ppostma1

77
यह डंप फ़ाइल से LOCK TABLES और UNLOCK TABLES स्टेटमेंट को हटा देता है, यह निर्यात के दौरान लॉकिंग को प्रभावित नहीं करता है।
dabest1

11
नहीं, यह वह नहीं है जो आप खोज रहे हैं! Dabest1 की टिप्पणी देखें यह एक mysqldump करते समय आपकी तालिकाओं को लॉक होने से रोकने के लिए कुछ भी नहीं करता है। यह सवाल का जवाब नहीं है।
orth

@dabest और @orrd सही हैं: --skip-add-locksबस डंप को तेजी से बहाल करेगा। यह एक सही उत्तर नहीं है।
dr_

16

बड़ी तालिकाओं को डंप करने के लिए, आपको --quick के साथ -single-transaction विकल्प को संयोजित करना चाहिए।

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


2
विकल्प - क्लिक विकल्प का हिस्सा है - अब अपनाएं। और - डिफ़ॉल्ट रूप से सक्षम है।
अलेक्जेंडर उशाकोव

11

InnoDB तालिकाओं के लिए ध्वज का उपयोग करें --single-transaction

यह उस समय डेटाबेस की सुसंगत स्थिति को डंप करता है जब किसी एप्लिकेशन को अवरुद्ध किए बिना BEGIN जारी किया गया था

MySQL डॉक्स

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


शायद साथ में --skip-lock-tables
ज़ावि मोंटेरो

10

ईमानदारी से, मैं इसके लिए प्रतिकृति सेटअप करूंगा, जैसे कि यदि आप तालिकाओं को लॉक नहीं करते हैं तो आपको डंप से असंगत डेटा मिलेगा।

यदि डंप में अधिक समय लगता है, तो पहले से डंप की गई टेबल कुछ टेबल के साथ बदल सकती हैं जो केवल डंप होने वाली है।

तो या तो तालिकाओं को लॉक करें या प्रतिकृति का उपयोग करें।


यह पूरी डीबी लगभग पूरी तरह से पढ़ी जाती है इसलिए मैं इसे बदलने के बारे में बहुत चिंतित नहीं हूं।
ग्रेग

2
यह टिप्पणी गलत है। MVCC InnoDB पर ताले के बिना सुसंगत स्थिति को पढ़ने की अनुमति देता है।
स्कॉट हंडमैन

5
यदि आपके पास प्रतिकृति पहले से सेट नहीं है, तो आपको इसे सेट करने के लिए डंप करने की आवश्यकता है। एक ही समस्या मौजूद है।
मैट कोनॉली

3
यदि आपके पास प्रतिकृति पहले से सेटअप नहीं है, तो आपको डेटा अखंडता सुनिश्चित करने के लिए डंप करने के लिए तालिकाओं को लॉक करना होगा। तो यह एक पकड़ है 22.
जॉर्डनC

9

यह उस आदमी की तुलना में देर से होता है जिसने कहा था कि वह मूल उत्तर के रूप में देर हो चुकी थी, लेकिन मेरे मामले में (विंडोज 7 पर WAMP के माध्यम से MySQL), मुझे उपयोग करना था:

--skip-lock-tables

यह त्रुटि बिना डंप INFORMATION_SCHEMA मेरे लिए क्या काम किया है "पहुँच उपयोगकर्ता के लिए इनकार कर दिया 'डेबियन-सिस-maint' @ जब लॉक तालिकाओं का उपयोग डेटाबेस 'INFORMATION_SCHEMA' को 'स्थानीय होस्ट'"
रुई एफ रिबेरो

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

वोट के लिए, इसने मेरे लिए काम किया - बस पैरामीटर जोड़ें --स्काइप-ऑप्ट - सिंगल्स-ट्रांजेक्शन - max_allowed_packet = 1G
स्टीवन लिज़ाराज़ो

1
मैं इस उद्देश्य के लिए "-स्काइप-ऑप्ट" की सिफारिश नहीं करता हूं। यह मूल प्रश्न के लिए पूछे जाने वाले प्रश्न की तुलना में बहुत अधिक है। यह त्वरित मोड को बंद कर देता है, इसमें चारसेट आदि शामिल नहीं हैं
ऑरड

3

डेटा निर्यात पर MySQL वर्कबेंच का उपयोग करते समय, उन्नत विकल्पों में क्लिक करें और "लॉक-टेबल" विकल्पों को अनचेक करें।

यहां छवि विवरण दर्ज करें


1

जैसा कि इनमें से किसी भी दृष्टिकोण ने मेरे लिए काम नहीं किया, मैंने बस एक किया:

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

यह LOCK TABLE <x>और दोनों को बाहर करेगाUNLOCK TABLES कमांड कमांड ।

नोट: उम्मीद है कि आपके डेटा में यह स्ट्रिंग नहीं है!


2
डंप के दौरान -स्काइप-ऐड-लॉक वह भी करता है
कोडवर्ड

1

Https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables के कारण :

कुछ विकल्प, जैसे --ॉप्ट (जो डिफ़ॉल्ट रूप से सक्षम है), स्वचालित रूप से --लॉक-टेबल को सक्षम करते हैं। यदि आप इसे ओवरराइड करना चाहते हैं, तो विकल्प सूची के अंत में --skip- लॉक-टेबल का उपयोग करें।


0

एक और देर से जवाब:

आप सर्वर डेटाबेस की एक गर्म प्रतिलिपि बनाने के लिए (एक लिनक्स वातावरण में) की कोशिश कर रहा है और कर रहे हैं सभी तालिकाओं के डेटाबेस इंजन MyISAM आप है चाहिए का उपयोग mysqlhotcopy

प्रलेखन के लिए रिकॉर्डिंग:

यह डेटाबेस बैकअप बनाने के लिए FLUSH TABLES, LOCK TABLES और cp या scp का उपयोग करता है। यह डेटाबेस या एकल तालिकाओं का बैकअप बनाने का एक तेज़ तरीका है, लेकिन इसे केवल उसी मशीन पर चलाया जा सकता है जहाँ डेटाबेस निर्देशिकाएँ स्थित हैं। mysqlhotcopy केवल MyISAM और ARCHIVE तालिकाओं के बैकअप के लिए काम करता है।

LOCK TABLESसमय समय सर्वर MySQL फ़ाइलों की प्रतिलिपि कर सकते हैं (यह एक डंप नहीं है) की निर्भर करता है।


0

आज भी मुझे एक ही मुद्दे का सामना करना पड़ा, लेकिन मेरे पास कमांड लाइन तक पहुंच नहीं थी। क्या मैंने नोटपैड संपादक में एसक्यूएल फ़ाइल खोली और टेबल से लाइन के नीचे हटा दिया

LOCK TABLES `yourtable name` WRITE;

तब मैं अपने विकास के वातावरण के लिए आयात किया। ठीक ठीक है। आशा है कि यह किसी एक की मदद करे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.