2010-07-14 9 views
21

मैं कोड का उपयोग करके ऐसा करना चाहता हूं और "MySQL माइग्रेशन टूलकिट" जैसे टूल का उपयोग नहीं करना चाहता हूं। मुझे पता है कि सबसे आसान तरीका एक कनेक्शन (MySQL कनेक्टर का उपयोग करके) को डीबी 1 में खोलना है और इसके डेटा को पढ़ना है। डीबी 2 से कनेक्शन खोलें और डेटा को लिखें। क्या कोई बेहतर/आसान तरीका है?मैं 2 MySQL डेटाबेस के बीच डेटा कैसे स्थानांतरित कर सकता हूं?

+1

दो डेटाबेस या अलग अलग सर्वरों पर दो डेटाबेस? –

+0

@Itay: मुझे यकीन है कि नहीं कर रहा हूँ अभी तक मौसम वे एक ही सर्वर या नहीं पर कर रहे हैं? मुझे पता है कि यह एक फर्क नहीं पड़ता, लेकिन उन्हें पूछने के लिए मेरे मन में आया था नहीं था।मैं कल करूँगा – Morano88

उत्तर

20

सबसे पहले मुझे लगता है कि आप एक स्थिति अभी कॉपी करने के लिए नहीं कर रहे हैं जा रहा हूँ कर सकते हैं डेटा/निर्देशिका, क्योंकि यदि आप फिर अपने मौजूदा स्नैपशॉट/बैकअप का उपयोग कर रहे/बहाल शायद पर्याप्त होगा (और अपने बैकअप परीक्षण/सौदा में प्रक्रियाओं को बहाल)।

जो मामले में, यदि दो तालिकाओं में एक ही संरचना आम तौर पर तेज, और विडंबना यह है कि राशि के लिए सबसे आसान दृष्टिकोण का चयन करें उपयोग करने के लिए ... outfile जांच ... एक छोर पर हो जाएगा, और डेटा लोड INFILE ... पर अन्य।

http://dev.mysql.com/doc/refman/5.1/en/load-data.html देखें और .../निश्चित जानकारी के लिए select.html।

तुच्छ तालिकाओं के लिए निम्नलिखित काम करेगा:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

हम भी वास्तव में डिस्क पर लिखने की भूमि के ऊपर से बचने के लिए फीफो का इस्तेमाल किया है महान प्रभाव के लिए, या यदि हम किसी कारण से डिस्क पर लिखने की ज़रूरत है, gzip के माध्यम से इसे पाइप करने के लिए।

यानी।

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

मूल रूप से, एक तुम एक फीफो के लिए तालिका डेटा आप इसे सेक कर सकते हैं, यह Munge प्रत्यक्ष, या अपने दिल की सामग्री के लिए एक नेटवर्क के पार सुरंग।

+0

धन्यवाद, हालांकि यह dev.mysql मैनुअल में है लेकिन यह proberly काम नहीं कर रहा है। यह मुझे यह त्रुटि दे रहा है: आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; लाइन 1 पर '\ n' 'के निकट उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैन्युअल की जांच करें) यह' \ n 'स्वीकार नहीं कर रहा है .. क्यों? – Morano88

+0

स्टैक ओवरफ़्लो ने नमूना क्वेरी को दूषित कर दिया। स्रोत में, खंड द्वारा एस्केप में स्लैश बच निकला था, लेकिन एचटीएमएल में परिवर्तित होने पर बच निकला था। इसके बारे में खेद है, मैंने भ्रष्टाचार पर ध्यान नहीं दिया - मैंने इसे ऊपर तय कर दिया है। – Recurse

+0

यह वही है जो मुझे काफी बड़े डेटाबेस का बैक अप लेने के लिए उपयोग करने की ज़रूरत है, लेकिन मुझे काम करने के लिए आपका उदाहरण नहीं मिल सकता है। मैं फीफो बना सकता हूं, और यदि मैं mysqldump का उपयोग करके पाइप पर डंप करता हूं तो यह ठीक काम करता है। हालांकि, अगर मैं चयन का उपयोग कर पाइप पर डंप करने का प्रयास करता हूं ... आउटपुट में मुझे एक त्रुटि मिलती है कि "myfifo पहले से मौजूद है"। –

11

फेडेरेटेड स्टोरेज इंजन? गुच्छा में सबसे तेज़ नहीं है, लेकिन एक समय के लिए, आकस्मिक, या डेटा की थोड़ी मात्रा में यह होगा। ऐसा लगता है कि आप 2 सेवा के बारे में बात कर रहे हैं। एक पर 2 डेटाबेस और एक ही सर्वर के साथ यह बस हो जाएगा:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

बहुत बहुत धन्यवाद, मुझे अभी तक यकीन नहीं है कि यदि 2 डेटाबेस एक ही सर्वर पर हैं या नहीं। – Morano88

+0

यह मेरी स्थिति के लिए शानदार था। चीयर्स :) – Nick

+0

अमेज़ॅन आरडीएस के साथ बहुत अच्छा काम किया जहां आपके पास अंतर्निहित मशीन तक पहुंच नहीं है, जिसमें MySQL इंस्टेंस चल रहा है, INFILE/OUTFILE से जुड़े समाधानों का निर्णय लेना। – Andz

1

आप mysqldump और mysql (कमांड लाइन ग्राहक) का उपयोग कर सकते हैं। ये कमांड लाइन टूल्स हैं और आपके द्वारा लिखे गए प्रश्न में आप उनका उपयोग नहीं करना चाहते हैं, लेकिन फिर भी उनका उपयोग कर रहे हैं (यहां तक ​​कि उन्हें अपने कोड से चलाकर) सबसे आसान तरीका है; mysqldump बहुत सारी समस्याएं हल करता है।

आप एक डेटाबेस से select एस और insert को दूसरे में बना सकते हैं, जो कि बहुत आसान है। लेकिन अगर आपको डेटाबेस स्कीमा (create table एस इत्यादि) को स्थानांतरित करने की भी आवश्यकता है, तो यह थोड़ा और जटिल हो जाता है, यही कारण है कि मैं mysqldump की अनुशंसा करता हूं। लेकिन बहुत सारे PHP-MySQL-admin टूल भी ऐसा करते हैं, ताकि आप उनका उपयोग कर सकें या उनके कोड को देख सकें।

या शायद आप MySQL प्रतिकृति का उपयोग कर सकते हैं।

+0

क्या यह (चयन, आवेषण) काम करेगा यदि दो डेटाबेस 2 अलग-अलग सर्वर पर हैं? नहीं मैं सिर्फ डेटा, नहीं तालिका कृतियों स्थानांतरित करना चाहते हैं .. आदि – Morano88

+0

हाँ, आप tvo कनेक्शन होगा - एक सिलसिले में आप डेटा है कि चयन से लौटे के साथ अन्य सम्मिलित में चयन चलाते हैं, तो - प्रत्येक सर्वर एक के लिए । – Messa

0

आप अपने वर्तमान सर्वर पर बाइनरी लॉगिंग सक्षम (और सभी बिन लॉग है) आप दूसरे सर्वर के लिए सेटअप प्रतिकृति

1
http://dev.mysql.com/doc/refman/5.0/en/rename-table.html से

:

जब तक दो डेटाबेस में एक ही फाइल सिस्टम पर कर रहे हैं, जब आप एक डेटाबेस से एक मेज के लिए कदम का पुन: नामकरण तालिका का उपयोग कर सकते हैं: एक ही सर्वर पर

RENAME TABLE current_db.tbl_name TO other_db.tbl_name; 
संबंधित मुद्दे