2008-09-19 14 views
374

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

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

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

लेकिन यह हर तालिका ताला लगा है के रूप में यह चलता है।

+0

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

उत्तर

512

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

man page के मुताबिक, अगर आप 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. 
+14

innodb डीबी mysqldump के लिए --single-credit = TRUE -u उपयोगकर्ता नाम -पी डीबी – AMB

+12

क्या होगा यदि आपके पास innodb और myisam है? – CMCDragonkai

+0

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

8

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

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

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

+0

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

+2

यह टिप्पणी गलत है। एमवीसीसी इनओडीबी पर ताले के बिना लगातार राज्य पढ़ने की अनुमति देता है। –

+5

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

42

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

268

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

--lock-tables=false 
+1

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

+0

ditto। अच्छी तरह से काम। – simplethemes

+7

'--lock-table = false --quick' का उपयोग कर कम से कम सर्वर संसाधन – SyntaxGoonoo

31

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

+1

या अन्य अनुकूलन के साथ स्किप लॉक को शामिल करने के लिए भी कॉम्पैक्ट। – ppostma1

+54

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

+6

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

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

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

+0

मैं इस उद्देश्य के लिए "--skip-opt" की अनुशंसा नहीं करता हूं। यह मूल प्रश्न पूछने के मुकाबले बहुत कुछ करता है। यह त्वरित मोड बंद कर देता है, इसमें अक्षरसेट इत्यादि शामिल नहीं हैं। – orrd

12

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

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

+0

विकल्प --क्विक विकल्प का हिस्सा है - अभी। और - डिफ़ॉल्ट रूप से --opt सक्षम है। –

7

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

--skip-lock-tables 
+0

यह मेरे लिए काम करता है बिना सूचना के स्केल को डंप करने के लिए काम करता है "त्रुटि 'उपयोगकर्ता के लिए डेबियन-सिस-रखरखाव' @ 'लोकलहोस्ट' से डेटाबेस 'info_schema' में लॉक टैबलेट का उपयोग करते समय" –

6

InnoDB तालिकाओं के लिए

"यह समय में डेटाबेस के अनुरूप राज्य उदासीनता जब शुरू तो कोई भी एप्लिकेशन को रोके बिना जारी किया गया था" MySQL DOCS

--एकल-लेन-देन का उपयोग

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

यह दोनों LOCK TABLE <x> और UNLOCK TABLES आदेशों को बाहर निकाल देगा:

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

0

इन तरीकों में से कोई भी मेरे लिए काम किया है, मैं बस एक था।

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

+1

--skip-add-locks डंप भी करता है – codewandler

0

एक और देर से उत्तर:

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

प्रलेखन के लिए तदनुसार

:

यह फ्लश तालिकाएं, लॉक टेबल, और सीपी या SCP का उपयोग करता है एक डेटाबेस बैकअप बनाने के लिए। यह डेटाबेस या एकल तालिकाओं का बैकअप बनाने का एक तेज़ तरीका है, लेकिन इसे केवल उसी मशीन पर चलाया जा सकता है जहां डेटाबेस निर्देशिका स्थित हैं। mysqlhotcopy केवल माईसाम और आर्चीव टेबल का बैक अप लेने के लिए काम करता है।

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

संबंधित मुद्दे