Linux / mysql: क्या यह cs कमांड के साथ mybql db फ़ाइलों को एक db से दूसरे db में कॉपी करना सुरक्षित है?


11

अधिकांश गाइड mysqldump और सरल SQL को anoter db में एक तालिका की प्रतिलिपि बनाने के लिए सलाह देते हैं। कैसे के बारे में linux shell cp? क्या मैं बस कर सकता हूं

cp /db1/mytable.frm /db2/mytable.frm

जवाबों:


21

नकल MyISAM के लिए बहुत सरल है और पूरी तरह से 100% जोखिम भरा है (आत्महत्या के करीब) InnoDB के साथ।

अपने प्रश्न से, आप लाए

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

यह करना ठीक है। हालाँकि, आप सिर्फ .frm को स्थानांतरित नहीं कर सकते। आपको सभी घटकों को स्थानांतरित करना होगा। आप सवाल से, चलो db1.mytable नामक एक तालिका लेते हैं। एक सामान्य स्थापना में, तालिका / var / lib / mysql / db1 में स्थित है। टेबल बनाने वाली तीन फाइलें होंगी।

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (तालिका डेटाबेस)
  • /var/lib/mysql/db1/mytable.MYI (तालिका अनुक्रमणिका)

आपको एक तालिका को स्थानांतरित करने के लिए सभी तीन फ़ाइल को स्थानांतरित करना होगा। यदि आपके सभी टेबल MyISAM स्टोरेज इंजन का उपयोग करते हैं, तो आप mysql को बंद कर सकते हैं और कॉपी कर सकते हैं। यदि आप केवल तालिका की प्रतिलिपि बना रहे हैं और इसे किसी अन्य डेटाबेस में रखते हैं, तो आपको SQL का उपयोग करना चाहिए।

उदाहरण के लिए, यदि आप डेटाबेस db2 पर db1.mytable की प्रतिलिपि बनाना चाहते हैं, तो यह करें:

CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;

अब यदि आप तालिका को db1 से db2 पर ले जा रहे हैं, तो आप यह कर सकते हैं:

ALTER TABLE db1.mytable RENAME db2.mytable;

InnoDB

इनफ़बीडी के तहत काम करने वाले बुनियादी ढांचे की वजह से नकल बहुत खतरनाक है। दो बुनियादी संरचनाएँ हैं: 1) innodb_file_per_table अक्षम और 2) innodb_file_per_table सक्षम

अचिल्स 'हील ऑफ इनोबीडी' सिस्टम टेबलस्पेस फ़ाइल है जिसे आईबेटा 1 (सामान्य रूप से / var / lib / mysql में स्थित) के रूप में जाना जाता है। उस फ़ाइल में क्या निहित है ?

  • तालिका डेटा पृष्ठ
  • टेबल इंडेक्स पेज
  • तालिका मेटाडेटा (टेबलस्पेस आईडी प्रबंधन सूची)
  • MVCC डेटा (लेनदेन अलगाव और ACID अनुपालन का समर्थन करने के लिए)

InnoDB (innodb_file_per_table अक्षम)

Innodb_file_per_table अक्षम होने पर, इन सभी प्रकार की InnoDB जानकारी ibdata1 के भीतर रहती हैं। Ibdata1 के बाहर किसी भी InnoDB तालिका की एकमात्र अभिव्यक्ति InnoDB तालिका की .frm फ़ाइल है। एक बार में सभी InnoDB डेटा कॉपी करना सभी / var / lib / mysql की प्रतिलिपि बनाने की आवश्यकता है।

एक व्यक्ति InnoDB तालिका की नकल करना कुल असंभव है। आपको डेटा के तार्किक प्रतिनिधित्व और उसकी अनुक्रमणिका परिभाषाओं के रूप में तालिका का एक डंप निकालने के लिए mysqldump होना चाहिए। फिर आप उस डंप को उसी सर्वर या किसी अन्य सर्वर पर दूसरे डेटाबेस में लोड करेंगे।

InnoDB (innodb_file_per_table सक्षम)

Innodb_file_per_table सक्षम होने के साथ, तालिका डेटा और इसके अनुक्रमित .frm फ़ाइल के बगल में डेटाबेस फ़ोल्डर में रहते हैं। उदाहरण के लिए, तालिका db1.mytable के लिए, ibdata1 के बाहर उस InnoDB तालिका की अभिव्यक्ति होगी:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Db1.mytable के लिए सभी मेटाडेटा अभी भी ibdata1 में रहते हैं और इसके आसपास कोई रास्ता नहीं है । Redo लॉग और MVCC डेटा अभी भी ibdata1 के साथ रहते हैं।

चेतावनी (या रोबोट को अंतरिक्ष में खो जाने के रूप में कहेंगे )

यदि आप .frm और .ibd फ़ाइल को कॉपी करने के बारे में सोच रहे हैं, तो आप चोट पहुँचाने की दुनिया के अनुरूप हैं। एक InnoDB तालिका की .frm और .ibd फ़ाइल की प्रतिलिपि बनाना केवल तभी अच्छा होता है जब आप गारंटी दे सकते हैं कि .ibd फ़ाइल की आईडी आईडी ibdata फ़ाइल के मेटाडेटा में टेबलस्पेस आईडी प्रविष्टि के साथ बिल्कुल मेल खाती है।

मैंने इस टेबल्स आईडी कॉन्सेप्ट के बारे में DBA StackExchange में दो पोस्ट लिखे

यहाँ बेमेल तालिकाओं की स्थिति में ibdata1 पर फ़ाइल को रीबेट करने और .ibd करने के लिए उत्कृष्ट लिंक दिया गया है: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file । इसे पढ़ने के बाद, आपको यह देखने में सक्षम होना चाहिए कि मैंने आत्महत्या के निकट क्यों कहा।

InnoDB के लिए आपको केवल इसकी आवश्यकता है

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

एक InnoDB तालिका की एक प्रतिलिपि बनाने के लिए। यदि आप इसे किसी अन्य DB सर्वर पर माइग्रेट कर रहे हैं, तो mysqldump का उपयोग करें।


4
अन्य प्रतिक्रियाओं ने यह कहा, इसलिए शायद यह "बिना कहे" चला जाता है, लेकिन वैसे भी यह कहना अच्छा है: इनोबीडी फ़ाइलों को लिखता रहता है भले ही डेटाबेस निष्क्रिय हो, इसलिए MySQL चल रहा है, जबकि इसकी फ़ाइलों की प्रतिलिपि बनाना भ्रष्टाचार का कारण लगभग निश्चित है! आप इसे बंद कर सकते हैं, एक फाइलसिस्टम स्नैपशॉट ले सकते हैं, या इसके आसपास काम करने के लिए पर्कोना एक्स्ट्राबैकअप का उपयोग कर सकते हैं।
बैरन श्वार्ट्ज

1
हमेशा की तरह उत्कृष्ट जवाब, @ रोलैंडो! एकमात्र बड़ा सवाल मेरे पास है: कोई ऐसा क्यों करना चाहेगा जो सीधे MySQL डंप और आयात करने के विपरीत है? मैं सरासर डेटाबेस आकार मान रहा हूं, लेकिन लगता है कि इसे ऊपर लाया जाना चाहिए।
जेकगॉल्ड

1
@JakeGould लोड हो रहा है mysql में एक mysqldump स्क्रिप्ट को SQL की बहुत सारी प्रक्रिया की आवश्यकता है, एक समय में हजारों पंक्तियाँ सम्मिलित करना, CPU चक्रों का उपयोग करना, योजनाओं को समझाना, अनुक्रमणिका बनाना (BTree सम्मिलन, लीफ डायोड विभाजन, पुनर्संतुलन कुंजी, प्रत्येक गैर के लिए एक टेबल स्कैन -यानी बनाने के लिए) बस एक ही तालिका का उत्पादन करने के लिए। MyISAM के मामले में, पहिया को क्यों मजबूत करना है? बस की प्रतिलिपि .frm, .MYDऔर .MYI
RolandoMySQLDBA

@JakeGould InnoDB के मामले में, मैंने एक जीवित डेटाबेस की नकल की थी जो rsync के साथ सभी InnoDB का उपयोग कर रहा था। Rsync का उपयोग करके कॉपी करने के बाद, मैंने mysql का शटडाउन चलाया, अंतिम rsync किया, और समस्याओं के बिना mysql को पुनरारंभ किया। मैंने पहले की तरह एक पोस्ट लिखा था: serverfault.com/questions/288140/…
RolandoMySQLDBA

8

संपूर्ण MySQL डेटादिर को कॉपी करना एक व्यावहारिक तकनीक है, माना जाता है कि MySQL सेवा बंद कर दी गई है और आप संपूर्ण डेटाबेस सर्वर की प्रतिलिपि बनाना चाहते हैं।

यह बड़े सूचकांक के साथ डेटाबेस को बदलने के लिए एक उपयोगी तकनीक है, और एक mysql डंप में अनुक्रमणिका शामिल नहीं होगी, जिसे आयात समय पर पुनर्जीवित करने की आवश्यकता होगी। MySQL गुलामों की स्थापना करते समय मैंने इस तकनीक को उपयोगी पाया है।

एक व्यक्तिगत फ़ाइल की प्रतिलिपि बनाना उपयोग में टेबल स्कीमा पर निर्भर करेगा, लेकिन ज्यादातर स्थिति में एक उपयुक्त समाधान नहीं है।


2
बाहर निकलने के लिए: आपको प्रति सेवा को रोकने की आवश्यकता नहीं है, यदि आपका फाइल सिस्टम सक्षम है, तो आप या तो एलवीएम स्नैपशॉट प्रदर्शन कर सकते हैं और उसका बैकअप ले सकते हैं; या फाइल सिस्टम को ही फ्रीज करें।
18

जब तक एक व्यक्ति डाउनटाइम खा सकता है, यह सबसे आसान तरीका है। +1 !!!
RolandoMySQLDBA

2

का प्रयोग करें xtrabackup डब्ल्यू / ow w / ओ innobackupex आवरण और आप दोनों MyISAM और InnoDB डेटाबेस पर ठीक हो जाएगा। ध्यान दें, कि innodb डेटाबेस को पुनर्स्थापित करना न केवल फ़ाइलों को कॉपी करना है, भले ही आप xtrabackup का उपयोग करें। यदि आपको अधिक जानकारी चाहिए तो बताएं


1

नहीं, आपको mysqdump के साथ बैकअप लेना चाहिए और mysql cli यूटिलिटी के साथ रिस्टोर करना चाहिए, जिस frm फाइल को आप कॉपी कर रहे हैं वह केवल टेबल स्ट्रक्चर को कॉपी कर रही है न कि डेटा को अंदर, और अगर आप innodb पर हैं तो फाइल को सीधे कॉपी करना संभव नहीं है।

सबसे अच्छा तरीका डंप है और टेबल को पुनर्स्थापित करना है।

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