2013-08-05 28 views
10

मैं, 2 डेटाबेस है ~ 100,000 पंक्तियों db1, जो मैं db2 से निर्यात से मरम्मत करने के लिए करना चाहते हैं से तालिका field_collection_item से लापता के साथ ।mysqldump "बंद नहीं किया गया था" त्रुटि

मेरे यह पूरा करने की योजना के लिए गया था:

  1. db2 में item_id से लापता आइटम की पहचान, item_id रों की सूची निर्यात।
  2. एक नई तालिका missing_field_collection_item
  3. में db1 में आयात item_id डेटा खींचने के लिए निम्नलिखित mysqldump का उपयोग करना: --no-बनाने-की जानकारी field_collection_item --tables

    mysqldump -u उपयोगकर्ता -pPASS डाटाबेस --where = "item_id IN (missing_field_collection_item से आइटम_आईडी चुनें);"

    Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `field_collection_item` WHERE item_id IN (SELECT item_id FROM missing_field_collection_item);': Table 'missing_field_collection_item' was not locked with LOCK TABLES (1100) 
    

    मैं अगर यह यह है करने के लिए केवल यथार्थवादी तरीका पता चला है, यह सख्ती से आवश्यक नहीं है लेकिन db2 में बदलाव किए बिना यह करने के लिए पसंद करेंगे:

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

अद्यतन

मैं बस --single-transaction जोड़ने, जो ताला बंद करने के लिए लगता है से ऊपर काम करता है की खोज की। यह सुरक्षित होना चाहिए क्योंकि db2 लाइव नहीं है, हालांकि मुझे विश्वास नहीं है कि मैं किसी भी दुष्प्रभाव को समझता हूं, इसलिए मैं इसे दूसरी राय के बिना उत्तर के रूप में स्वीकार नहीं करूंगा।

+0

'--tables' कमांड काम में दोनों टेबल सूचीबद्ध करता है? – Stobor

+0

हां, फिर भी मुझे डंप को पार्स करने और 'missing_field_collection_item' प्रविष्टियों को बाहर करने की आवश्यकता होगी। विशेष रूप से मुश्किल नहीं है लेकिन यह थोड़ा गंदा लगता है। हो सकता है कि आप सही हों, यह बेहतर शैतान है जिसे आप जानते हैं। – DanH

उत्तर

13

यदि आपकी टेबल MyISAM हैं, तो इसे संभालने का सबसे सुरक्षित, आसान तरीका ध्वज --lock-all-tables को पास करना है। यदि आपकी टेबल InnoDB हैं तो --single-transaction बेहतर है।

+0

धन्यवाद, मैं भी - सिंगल लेनदेन के साथ जा रहा है :) – DanH

2

आप एक स्थिरता की गारंटी की जरूरत नहीं है, तो आप को जोड़कर एक लेन-देन के बिना ताला निष्क्रिय कर सकते हैं:

--lock-tables=false

मैं इस का उपयोग करने के बाद (डेटा के सबसेट डंपिंग) एक ही बात आप कर रहे हैं करने के लिए और प्रतिकृति गुलामों पर जो मैं रोक सकता हूं (वैसे भी इसे लगातार बना रहा हूं)।

--single-transaction पर एक लाभ यह है कि आप गैर-एमवीसीसी-इंजन तालिकाओं का उपयोग/मिश्रण कर सकते हैं।

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