एक डेटाबेस से दूसरे में तालिका की प्रतिलिपि बनाने का सबसे आसान तरीका?


151

जब डेटाबेस अलग-अलग उपयोगकर्ताओं के अधीन होता है, तो एक डेटाबेस में एक तालिका से डेटा को किसी अन्य डेटाबेस में तालिका में कॉपी करने का सबसे अच्छा तरीका क्या है?

मुझे पता है कि मैं उपयोग कर सकता हूं

INSERT INTO database2.table2 SELECT * from database1.table1

लेकिन यहाँ समस्या यह है कि दोनों database1और database2विभिन्न MySQL उपयोगकर्ताओं के अधीन हैं। तो केवल user1पहुंच सकता है database1और केवल user2पहुंच सकता है database2। कोई उपाय?


6
आप यूजर्स को टेबल लेवल ग्रांट दे सकते हैं। देखें: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
दुर्भाग्य से यह मेरे मामले में काम नहीं करेगा, जैसा कि मैं एक Godaddy साझा होस्टिंग सर्वर का उपयोग कर रहा हूं। वे डेटाबेस के साथ ऐसी चीजें करने की अनुमति नहीं देंगे।
स्पार्की

@mmdemirbas डेटाबेस में एक तालिका में लगभग 1 मिलियन पंक्तियाँ हैं। डेटाबेस डंप बहुत बड़ा होगा। इसके अलावा जब मैंने निर्यात करने की कोशिश की, तो लगभग 10000 पंक्तियों का निर्यात किया जा रहा है - शायद बड़े आकार के कारण।
स्पार्क

मुझे पता है कि आप तालिकाओं को स्थानांतरित करने के लिए RENAME का उपयोग कर सकते हैं, और यह सुपर त्वरित है। क्या तालिकाओं की नकल करने के लिए एक समान चाल है?
दान

बीटीडब्ल्यू: आपको यह ध्यान रखना होगा कि फ़ील्ड सूची दोनों तालिकाओं में एक ही क्रम में है। अन्यथा डेटाबेस 1 में तालिका से नाम से फ़ील्ड का चयन करना आवश्यक होगा ताकि वे डेटाबेस 2 में तालिका के सही फ़ील्ड में मैप करें। यह मुद्दा मेरे लिए आया था जहां मैंने एक डेटाबेस का समर्थन किया था जहां शुरुआती निर्माण के बाद तालिका 1 को संशोधित किया गया था, और नया डेटाबेस जहां इसे mysqldump फ़ाइल से बनाया गया था।
स्टीव एल

जवाबों:


113

यदि आपके पास शेल एक्सेस है, तो आप इसका उपयोग mysqldumpडंप करने के लिए कर सकते हैं database1.table1और इसे करने के mysqlलिए पाइप कर सकते हैं database2। यहाँ समस्या यह है कि table1अभी भी है table1

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

हो सकता है आप नाम बदलने की आवश्यकता table1के लिए table2किसी अन्य क्वेरी के साथ। दूसरे तरीके से आप पाइप के बीच टेबल 1 को टेबल 2 में बदलने के लिए सेड का उपयोग कर सकते हैं।

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

यदि तालिका 2 पहले से मौजूद है, तो आप पहले mysqldump में पैरामीटर जोड़ सकते हैं जो तालिका-निर्माण नहीं करने देता है।

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

इसके साथ समस्या तब है जब यह स्वचालित है आपको पासवर्ड दिखाना होगा। यदि स्वचालित नहीं है और कमांड लाइन से उपयोगकर्ता द्वारा किया जा रहा है तो यह ठीक है।
नेल्स

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

जहां db1 गंतव्य है और db2 स्रोत है


क्या यह काम करता है, अगर दोनों उपयोगकर्ताओं के पास एक दूसरे से डेटा का चयन करने की अनुमति नहीं है?
बेरिलियम 19

1
हालांकि यह अलग mysql सर्वर पर काम नहीं करेगा?
पग

8
यह अनुक्रमणिका पर प्रतिलिपि नहीं करता है
bcoughlan

@ बेरिलियम नहीं, इसके लिए उपयोगकर्ता को दोनों डीबी के लिए अनुमति की आवश्यकता होती है। jaminator नहीं यह विभिन्न सर्वरों पर काम नहीं करेगा, लेकिन मुझे नहीं लगता कि इस बारे में सवाल पूछ रहा था। bcoughlan आप सही हैं। इस दृष्टिकोण में यह एक बड़ा दोष है: यह तालिका संरचना को ठीक से संरक्षित नहीं करता है।
thomasrutter

4
कॉपी की गई तालिका में प्राथमिक कुंजी और ऑटो वेतन वृद्धि सेट नहीं थी। इसके बाद आपको इसे चलाना होगाALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
वेस्टन गैंगर

60

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

DB1 & DB2

DB1 में एक टेबल उपयोगकर्ता हैं जिन्हें आप DB2 पर कॉपी करना पसंद करते हैं

PHPMyAdmin के तहत, DB1 खोलें, फिर उपयोगकर्ताओं की तालिका पर जाएं।

इस पृष्ठ पर, ऊपर दाईं ओर "संचालन" टैब पर क्लिक करें । संचालन के तहत, अनुभाग प्रतिलिपि तालिका के लिए देखें (database.table):

& आप कर चुके हैं!


1
मृत सरल! यह तब है जब मैं आलसी होने का जश्न मना सकता हूं!
डैनियल डुत

1
आप मेरा समय बचाएं..मैं भोली दृष्टिकोण कर रहा था..फिर से निर्यात और फिर आयात।
हमजा ज़फ़र 12

1
अन्य उत्तरों में से कोई भी काम नहीं करता है, केवल आपका है जो सूचकांक को भी कॉपी करता है
Bsienn

1
यह काम नहीं करेगा यदि तालिका विशेष रूप से बड़ी थी, अर्थात 4 जीबी से अधिक। उदाहरण के लिए, मेरे पास एक मेज है जो 22GB की है कि phpMyAdmin सिर्फ साथ काम नहीं कर सकती है।
मार्क डी

1
एकदम सही जवाब। फ्लॉपडैमिन की इस विशेषता के बारे में नहीं पता था।
zookastos

23

MySql कार्यक्षेत्र : दृढ़ता से अनुशंसित

MySql कार्यक्षेत्र से डेटाबेस प्रवासन उपकरण

यह आसानी से प्रवास की समस्याओं को संभाल लेगा। आप MySql और SqlServer के बीच चयनित डेटाबेस के चयनित तालिकाओं को माइग्रेट कर सकते हैं। आपको इसे जरूर आजमाना चाहिए।


मैं इसे विदा करने वाला हूं, मेरे पास यह सेटअप है लेकिन आश्चर्य है कि क्या आपने mysql Workbenchमाइग्रेशन की SQLYogडेटाबेस कॉपी से तुलना की है? मेरे त्वरित रूप से ऐसा लगता है कि वे बहुत समान हैं, लेकिन mysql कार्यक्षेत्र एक नई विशेषता है
wired00

नहीं, मैंने SQLYog की कोशिश नहीं की।
mmdemirbas

MySql कार्यक्षेत्र का उपयोग करके MySQL से SQL सर्वर पर कैसे माइग्रेट किया जाए यह स्पष्ट नहीं है। मैं वर्कबेंच में हूं और मदद या यूआई से कोई सुराग नहीं मिला। मुझे पता है कि MySQL के लिए SSMA मेरे लिए काम करता है।
उपसमुच्चय

2
दिलचस्प है, लेकिन प्रोग्राम ने एक बड़े डेटाबेस के साथ माइग्रेशन करते हुए पकड़ा, कमांड लाइन ने सबसे अच्छा काम किया।
क्लॉडियन ऑलिवेरा

1
@mmdemirbas, " आप MySql और SqlServer के बीच चयनित डेटाबेस के चयनित तालिकाओं को स्थानांतरित कर सकते हैं। " OP का प्रश्न SQL सर्वर के बारे में नहीं है, हालाँकि।
सम्पाबलोकुपर

19

मैं MySQL के लिए Navicat का उपयोग करता हूं ...

यह सभी डेटाबेस हेरफेर को आसान बनाता है!

आप बस Navicat में दोनों डेटाबेस का चयन करें और फिर उपयोग करें।

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

मुझे पता है कि यह पुराना सवाल है, सिर्फ इसलिए जवाब देना ताकि जो कोई भी यहां उतरे उसे बेहतर दृष्टिकोण मिले।

5.6.10 के रूप में आप कर सकते हैं

CREATE TABLE new_tbl LIKE orig_tbl;

यहाँ प्रलेखन देखें: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
यह डेटा की नकल नहीं होगा! आपके द्वारा संदर्भित दस्तावेज़ पढ़ें:> ** निर्माण तालिका ... LIKE किसी डेटा को संरक्षित नहीं करता है **
dgpro

11

यदि आपकी टेबल एक ही mysql सर्वर पर हैं, तो आप निम्नलिखित चला सकते हैं

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

अन्य सूचकांक के बारे में क्या?! सवाल यह है कि न केवल अपने डेटा की एक तालिका की नकल करने के लिए
जोर्ज

9

MySql कार्यक्षेत्र के निर्यात और आयात कार्यक्षमता का उपयोग करें। चरण:
1. इच्छित मानों का चयन करें

E.g. select * from table1; 
  1. निर्यात बटन पर क्लिक करें और इसे सीएसवी के रूप में सहेजें।
  2. पहले वाले के समान कॉलम का उपयोग करके एक नई तालिका बनाएं

    E.g. create table table2 like table1; 
  3. नई तालिका से सभी का चयन करें

    E.g. select * from table2;  
  4. आयात पर क्लिक करें और चरण 2 में आपके द्वारा निर्यात की गई CSV फ़ाइल का चयन करें

MySql कार्यक्षेत्र में निर्यात और आयात बटन का नमूना


1
मेरे विचार से यह केवल एक अरब पंक्तियों से कम की तालिकाओं के लिए काम करता है।
दिओगो पैम जूल

9

यहाँ एक और आसान तरीका है:

  1. DB1 का उपयोग करें; शो बनाने के लिए तालिका TB1;
    • DB2 में TB1 बनाने के लिए क्लिपबोर्ड में यहाँ सिंटैक्स की प्रतिलिपि बनाएँ
  2. DB2 का उपयोग करें;
    • तालिका TB1 बनाने के लिए सिंटैक्स को यहां पेस्ट करें

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


इससे मुझे एक गुई कार्यक्रम का उपयोग किए बिना, डेटाबेस की नकल को स्वचालित करने में मदद मिली, धन्यवाद।
New2HTML

4

कोशिश mysqldbcopy( प्रलेखन )

या आप अपने टारगेट होस्ट पर एक " फ़ेडरेटेड टेबल " बना सकते हैं । फेडरेटेड टेबल आपको एक अलग डेटाबेस सर्वर से एक टेबल देखने की अनुमति देता है जैसे कि यह एक स्थानीय था। ( प्रलेखन )

फ़ेडरेटेड टेबल बनाने के बाद, आप डेटा को सामान्य रूप से कॉपी कर सकते हैं insert into TARGET select * from SOURCE


1
मैंने फ़ेडरेटेड टेबल के बारे में पढ़ा है, लेकिन अमेज़ॅन आरडीएस (अभी) के पास इसके लिए समर्थन नहीं है ... XP
चोकोक्रोक

4

MySQL वर्कबेंच के साथ आप डेटा निर्यात का उपयोग सिर्फ टेबल को स्थानीय SQL फ़ाइल (डेटा ओनली, स्ट्रक्चर ओनली या स्ट्रक्चर और डेटा) में डंप करने के लिए कर सकते हैं और फिर डेटा आयात करके इसे अन्य DB में लोड कर सकते हैं।

आपके पास एक ही समय में कई कनेक्शन (विभिन्न होस्ट, डेटाबेस, उपयोगकर्ता) हो सकते हैं।


3

आपके लिए आवश्यक सभी प्रश्नों को प्राप्त करने का एक सरल तरीका है कि data_schema और concat से डेटा का उपयोग करें।

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

फिर आपको इस तरह दिखने वाले परिणामों की एक सूची मिलेगी:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

फिर आप उन प्रश्नों को चला सकते हैं।

हालाँकि यह MySQL Views के साथ काम नहीं करेगा। AND TABLE_TYPE = 'BASE TABLE'प्रारंभिक क्वेरी से जोड़कर आप उनसे बच सकते हैं :


1

क्या यह ऐसा कुछ है जिसे आपको नियमित रूप से करने की ज़रूरत है, या सिर्फ एक बंद?

आप एक निर्यात (जैसे phpMyAdmin या इसी तरह का उपयोग करके) कर सकते हैं जो आपकी तालिका और उसकी सामग्री को एक पाठ फ़ाइल में लिख देगा, फिर आप उसे अन्य डेटाबेस में पुन: आयात कर सकते हैं।


मुझे इसे केवल एक बार करने की आवश्यकता है। लेकिन समस्या यह है कि डेटाबेस में तालिका लगभग 1 मिलियन पंक्तियाँ हैं। डेटाबेस डंप बहुत बड़ा होगा। इसके अलावा जब मैंने निर्यात करने की कोशिश की, तो लगभग 10000 पंक्तियों का निर्यात किया जा रहा है - शायद बड़े आकार के कारण।
स्पार्की

आह, हाँ यह एक सीमा है। यह वर्डप्रेस कोडेक्स लेख मदद कर सकता है? यह एक वर्डप्रेस लेख है, लेकिन आपको कुछ अंतर्दृष्टि प्रदान कर सकता है (कमांड लाइन का उपयोग करके तालिकाओं को डंप करने के तरीके पर एक खंड है, उस स्थिति में जहां डीबी phpMyAdmin को संभालने के लिए बहुत बड़ा है)।
Sepster

Mysqldump कमांड लाइन टूल में 1 मिलियन पंक्तियों, या कई बिलियन पंक्तियों के साथ कोई समस्या नहीं है - यह सब प्रभावित करेगा कि कितना समय लगता है और आपकी हार्ड ड्राइव का कितना परिणाम होता है (आप इसे फ़ाइल में आउटपुट करते हैं)। PhpMyAdmin के निर्यात कमांड के साथ मेरा अनुभव यह है कि यह mysqldump से बहुत अधिक सीमित है।
१३

1

एक डेटाबेस टेबल से दूसरे डेटाबेस टेबल पर कुछ कॉलम कॉपी और डालने के लिए नीचे दिए गए चरणों का उपयोग करें-

  1. बनाएँ तालिका टैबलेनेम (कॉलमनाम डेटाटाइप (आकार), कॉलमनाम डेटाटाइप (आकार));

2.INSERT INTO db2.tablename SELECT columnname1, columnname2 FROM db1.tablename से;


1

पहले डंप बनाएं। --no-create-info --no-create-dbयदि table2पहले से मौजूद हो तो झंडे जोड़े :

mysqldump -u user1 -p database1 table1 > dump.sql

फिर user1पासवर्ड डालें। फिर:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

फिर दर्ज करें user2 पासवर्ड डालें।

@Helmors उत्तर के समान है, लेकिन दृष्टिकोण अधिक सुरक्षित है क्योंकि पासवर्ड कच्चे पाठ में कंसोल (रिवर्स-आई-सर्च, पासवर्ड स्निफर्स, आदि) में उजागर नहीं होते हैं। अन्य दृष्टिकोण ठीक है अगर यह एक स्क्रिप्ट फ़ाइल से निष्पादित होता है, यह अनुमतियों पर रखे गए उचित प्रतिबंधों के साथ है।


0

में xampp सिर्फ एक .sql फ़ाइल के रूप में आवश्यक तालिका निर्यात करें और फिर इसे आवश्यक आयात करें


-1

sakila.customer (Database_name.tablename) की तरह टेबल डेस्टिनेशन बनाएं । यह केवल सोर्स टेबल के स्ट्रक्चर को कॉपी करेगा, डेटा के साथ कॉपी करने के लिए भी। टेबल डेस्टिनेशन बनाएं। sakila.customer के रूप में सेलेक्ट करें


यह एक बिल्कुल अलग सवाल का जवाब लगता है। CREATE TABLE LIKEप्रश्न में कोई बात नहीं है, इसलिए इसका उल्लेख गलत क्यों है? और इस बात की कोई व्याख्या नहीं है कि यह उत्तर उस समस्या को कैसे हल करता है जो न तो उपयोगकर्ता के पास दूसरे के तालिकाओं तक पहुंच है।
टोबी स्पाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.