क्या मैं पूर्ण mysql mysqldump फ़ाइल से एकल तालिका को पुनर्स्थापित कर सकता हूं?


194

मेरे पास mysql डेटाबेस का एक mysqldump बैकअप है जिसमें हमारी सभी तालिकाएँ शामिल हैं जो लगभग 440 megs हैं। मैं केवल एक तालिका mysqldump को बनाने की सामग्री को पुनर्स्थापित करना चाहता हूं। क्या यह संभव है? सैद्धांतिक रूप से, मैं बस उस अनुभाग को काट सकता हूं जो मुझे चाहिए तालिका को फिर से जोड़ता है लेकिन मुझे यह भी पता नहीं है कि उस आकार के पाठ दस्तावेज़ को प्रभावी ढंग से कैसे संपादित किया जाए।


2
FWIW, आप mydumper का उपयोग भी कर सकते हैं । यह mysqldump की तरह एक तार्किक डंप बनाता है, लेकिन यह प्रति तालिका अलग-अलग फ़ाइलों को आउटपुट करता है, और यह डंपिंग और लोडिंग मल्टी-थ्रेडेड दोनों कर सकता है, इसलिए इसमें कम समय लगता है।
बिल करविन

जवाबों:


289

आप जिस तालिका को चाहते हैं, उसे निकालने के लिए आप sed का उपयोग करने का प्रयास कर सकते हैं।

मान लें कि आपकी तालिका का नाम है mytableऔर फ़ाइल mysql.dump आपकी विशाल डंप वाली फ़ाइल है:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

यह उस फाइल में कॉपी हो जाएगा mytable.dumpजो अगले टेबल के बीच CREATE TABLE mytableऔर उसके आगे CREATE TABLEस्थित है।

फिर आप उस फ़ाइल को समायोजित कर सकते हैं mytable.dumpजिसमें तालिका की संरचना mytable, और डेटा (एक सूची INSERT) शामिल है।


5
यह मेरे जवाब से भी अच्छा है क्योंकि यह क्रिएट टेबल की भी देखभाल करता है, लेकिन आपको बैककॉट्स के साथ खोजना चाहिए ताकि "थिसिसम्यटेलेटू" नामक एक अन्य तालिका न मिल सके।
JCCyC

1
सच। मुझे यकीन नहीं था कि सभी mysql डंप में टेबल के नाम हमेशा बैकक्वाइट से घिरे होते हैं या यदि "क्रिएट टेबल म्युटेबिल" भी संभव हो सकता है। यदि हम जानते हैं कि डंप कैसा दिखता है, तो हम पहले रेगेक्स को आसानी से अपना सकते हैं। एक दूसरी समस्या यह हो सकती है यदि तालिका mytable अद्वितीय नहीं है (डेटाबेस db1 में एक, और डेटाबेस db2 में एक अन्य)। दोनों को mytable.dump फ़ाइल में निर्यात किया जाएगा। यदि तालिका अद्वितीय नहीं है, तो हम केवल सही डेटाबेस को निकालने के लिए उसी DATEABASE के साथ पहले उसी कमांड का उपयोग कर सकते हैं। फिर, CREATE TABLE के साथ sed कमांड का उपयोग करें।
uloBasEI

13
मिठाई! शीर्ष पर DROP TABLE को जोड़ना याद रखें और फाइल के नीचे DROP TABLE [अगली तालिका] को हटा दें।
नाथन

20
DROP TABLE को न जोड़ने / हटाने के लिए, यह Table structure for tableटिप्पणी से मिलान करने के लिए अधिक उपयोगी है , बजाय CREATE TABLE द्वारा मिलान करने के। यह सुनिश्चित करेगा कि अगली तालिका को गिराया नहीं जाएगा यदि कोई अपना DROP टेबल स्टेटमेंट निकालना भूल जाता है, और सिंगल-कमांड टेबल रिस्टोर के लिए पाइपिंग की अनुमति देता है (gzip | sed | mysql)। हालांकि, यह समाधान mysqldump टिप्पणी सिंटैक्स पर निर्भर है (मुझे नहीं पता कि यह कैसे मानक है)।
ओलेक्सा

12
ओलेक्सा के संशोधन के साथ यह एकदम सही है: sed -n -e '/ के लिए टेबल संरचना। * `mytable /, / टेबल संरचना के लिए / p' पूरे.sql> mytable.sql
22:21

120

मैंने uloBasEI के सेड कमांड के संशोधित संस्करण का उपयोग किया। इसमें पूर्ववर्ती DROP कमांड शामिल है, और तब तक पढ़ता है जब तक mysql आपके टेबल पर डेटा डंपिंग नहीं करता (UNLOCK)। मेरे लिए (re) वर्डप्रेस साइटों के एक समूह में wp_users आयात करना

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

3
यह वास्तव में उत्तर के रूप में चुने गए एक से अधिक बेहतर समाधान है, ऊपर। विश्वास नहीं कर सकता कि यह अधिक उत्थान नहीं है।
आरआईसीएच

9
मेरा सुझाव है कि टेबल के नाम से कम से कम बैकटिक कोट्स को जोड़ना: मेरे मामले में `mytable`मेल खाने वाली टेबल वगैरह से बचना mytable2
बारटेकब्रक

3
आपने अभी-अभी मेरी गांड बचाई है
गेब्रियल अलैक

1
@ user706420 हम्म, क्या आप निश्चित हैं कि आपके टर्मिनल को दोष नहीं दिया गया था? sedएन्कोडिंग में हस्तक्षेप नहीं करना चाहिए ...
bryn

6
SQL फ़ाइलों के साथ उन लोगों के लिए जिनके पास DROP TABLE(मेरा MySQL डंप यह नहीं था) का उपयोग करना चाहते हो सकता है: sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql यह MySQl डंप में प्रत्येक तालिका से पहले प्रदान की गई तालिका टिप्पणियों का उपयोग करता है, और लाइनों /*!40101 SET @saved_cs_client = @@character_set_client */;को शामिल करना सुनिश्चित करता है ।
हैमएक्स 06

50

यह अधिक आसानी से किया जा सकता है? मैंने इस तरह से इसे किया:

एक अस्थायी डेटाबेस बनाएँ (जैसे पुनर्स्थापित करें):

mysqladmin -u रूट -p रिस्टोर बनाता है

अस्थायी डेटाबेस में पूर्ण डंप को पुनर्स्थापित करें:

mysql -u रूट -p रिस्टोर <fulldump.sql

उस तालिका को डंप करें जिसे आप पुनर्प्राप्त करना चाहते हैं:

mysqldump mytable> mytable.sql को पुनर्स्थापित करता है

तालिका को किसी अन्य डेटाबेस में आयात करें:

mysql -u रूट -p डेटाबेस <mytable.sql


2
यह वही है जो ज्यादातर लोगों की जरूरत है।
एसजेएस

2
इस संपादन सुझाव के अनुसार , आपको "--one-database" पैरामीटर जोड़ना चाहिए, यह सुनिश्चित करने के लिए कि आप केवल एक डेटाबेस को पुनर्स्थापित करते हैं और बाकी सब को नष्ट नहीं करते हैं।
एसएल बर्थ -

7
वास्तव में बहुत बड़ी डीबी के लिए यह बहुत अजीब है - 100 एमबी की एक तालिका के लिए 150 जीबी डेटा पुनर्स्थापित करें।
एनीबी

मैंने बस इसे "--one-database" के बिना चलाया और यह अभी भी तालिकाओं को सिर्फ ठीक से मिला देता है। इसने मेरी मौजूदा तालिकाओं को नहीं हटाया।
कासिम

1
बहुत बुरा अभ्यास! मेरे पास डंप में कुछ डीबी थे, और केवल एक को बहाल करने की कोशिश कर रहे थे, अन्य सभी को हटा दिया।
एंड्रीपी

11

एक सरल उपाय यह होगा कि आप सिर्फ अलग से रिस्टोर करने की इच्छा रखने वाले टेबल का एक डंप बनाएं। आप निम्नलिखित सिंटैक्स के साथ ऐसा करने के लिए mysqldump कमांड का उपयोग कर सकते हैं:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

फिर इसे सामान्य रूप से आयात करें, और यह केवल डंप की गई तालिका को आयात करेगा।


9

एक तरीका या दूसरा, किसी भी प्रक्रिया को करना जो डंप के पूरे पाठ से गुजरना होगा और इसे किसी तरह से पार्स करना होगा। मैं अभी के लिए grep चाहता हूं

INSERT INTO `the_table_i_want`

और mysql में आउटपुट को पाइप करें। पहले डंप में पहले तालिका पर एक नज़र डालें, यह सुनिश्चित करने के लिए कि आपको INSERT सही तरीके से मिल रहा है।

संपादित करें: ठीक है, इस बार स्वरूपण मिला।


मैं इसे तुरंत नहीं समझने के लिए गूंगा हूं। ग्रीप हर दिन मेरी बेकन बचाता है, ऐसा लगता है। अन्य दो सुझाव भी धमाकेदार थे और पूरी तरह से मैंने क्या किया बिना grep के चमत्कार उपलब्ध थे। आप सभी को धन्यवाद!
मोबियस

6
अगर आपको लगता है कि आप grep से प्यार करते हैं, जब आप
जागते हैं

7

आपको @bryn कमांड की कोशिश करनी चाहिए, लेकिन `सीमांकक के साथ अन्यथा आप एक उपसर्ग या प्रत्यय वाली तालिकाओं को भी निकालेंगे, यह वही है जो मैं आमतौर पर करता हूं:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

परीक्षण उद्देश्य के लिए, आप आयात करने से पहले तालिका का नाम बदलना चाह सकते हैं:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

आयात करने के लिए आप mysql कमांड का उपयोग कर सकते हैं:

mysql -u root -p'password' mydatabase < mytable_restore.sql

6
  1. बैकअप

    $ mysqldump -A | gzip > mysqldump-A.gz
  2. एकल तालिका पुनर्स्थापित करें

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME

4

इससे निपटने का एक संभावित तरीका एक अस्थायी डेटाबेस को पुनर्स्थापित करना है, और अस्थायी डेटाबेस से बस उस तालिका को डंप करना है। फिर नई स्क्रिप्ट का उपयोग करें।



3
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

यह ऊपर के अन्य की तुलना में बेहतर समाधान है क्योंकि सभी एसक्यूएल डंप में एक DROP TABLEबयान नहीं है। यह एक काम करेगा सभी प्रकार के डंप।


2

इससे भी मदद मिल सकती है।

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

2

तालिका को डंप और डेटाबेस दोनों में समान संरचना के साथ प्रस्तुत करना चाहिए।

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

या

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`

1

अधिकांश आधुनिक पाठ संपादकों को उस आकार की एक पाठ फ़ाइल को संभालने में सक्षम होना चाहिए, यदि आपका सिस्टम इसके ऊपर है।

वैसे भी, मुझे यह करना था कि एक बार बहुत जल्दी और मैं किसी भी उपकरण को खोजने के लिए समय नहीं था। मैंने एक नया MySQL इंस्टाल किया, पूरे बैकअप को इम्पोर्ट किया और फिर मैं जिस टेबल को चाहता था, उसे थूक दिया।

फिर मैंने उस तालिका को मुख्य डेटाबेस में आयात किया।

यह थकाऊ था, बल्कि आसान था। सौभाग्य।


1

आप vi संपादक का उपयोग कर सकते हैं। प्रकार:

vi -o mysql.dump mytable.dump

पूरी डंप mysql.dumpऔर एक नई फ़ाइल खोलने के लिए mytable.dump। प्रेस करके लाइन में उपयुक्त इंसर्ट का पता लगाएं /और फिर एक वाक्यांश टाइप करें, उदाहरण के लिए: "इन माईटेबल 'में डालें", फिर उस लाइन का उपयोग करके कॉपी करें yyctrl+wतब तक अगली फ़ाइल पर जाएँ down arrow key, कॉपी की गई लाइन को चिपकाएँ pp। अंत में टाइप करके नई फाइल को सेव करें :wqऔर काफी vi एडिटर को:q

ध्यान दें कि यदि आपने कई आवेषणों का उपयोग करके डेटा को डंप किया है तो आप उन सभी का उपयोग (यैंक) कर सकते हैं Nyyजिनमें एक बार उपयोग किया जाता हैN प्रतिलिपि बनाने के लिए लाइनों की संख्या है।

मैंने इसे 920 एमबी आकार की फ़ाइल के साथ किया है।


0

नोटपैड ++ या विम जैसा एक सभ्य टेक्स्ट संपादक प्राप्त करें (यदि आप पहले से ही इसके साथ कुशल हैं)। तालिका नाम की खोज करें और आप उस तालिका के लिए केवल CREATE, ALTER और INSERT कमांड को हाइलाइट करने में सक्षम होना चाहिए। माउस के बजाय अपने कीबोर्ड से नेविगेट करना आसान हो सकता है। और मुझे यकीन है कि आप बहुत या रैम के साथ एक मशीन पर हैं ताकि एक बार में पूरी फ़ाइल लोड करने में समस्या न हो। एक बार जब आपने अपनी ज़रूरत की पंक्तियों को हाइलाइट कर लिया और कॉपी कर लिया, तो यह एक अच्छा विचार होगा कि कॉपी किए गए हिस्से को बैकअप की खुद की फ़ाइल में डाल दें और फिर इसे MySQL में आयात करें।


1
यह वास्तव में शुरुआती लोगों द्वारा वास्तव में करना और समझना आसान है। मुझे नहीं पता, यह क्यों ठुकराया गया है।
कार्ल जोहान वालनर

0

एसक्यूएल के टुकड़े "टेबल के लिए टेबल संरचना my_table" और "टेबल के लिए डंपिंग डेटा" के साथ बंद हो जाते हैं my_table

आप विभिन्न वर्गों के लिए लाइन नंबर प्राप्त करने के लिए निम्नानुसार विंडोज कमांड लाइन का उपयोग कर सकते हैं। आवश्यकतानुसार स्ट्रिंग को समायोजित करें।

तालिका "" sql.txt के लिए / n "खोजें

निम्नलिखित लौटा दिए जाएंगे:

---------- SQL.TXT

[४३ [४] - टेबल के लिए टेबल संरचना my_table

[४५००] - टेबल के लिए डंपिंग डेटा my_table

[४५१४] - टेबल के लिए टेबल संरचना some_other_table

... आदि।

आपको वह लाइन नंबर मिलते हैं जिनकी आपको आवश्यकता होती है ... अब, अगर मुझे केवल यह पता था कि उनका उपयोग कैसे करना है ... जांच करना।


0

वापस '08 में मुझे यह भी करने की आवश्यकता थी। मैंने एक पर्ल स्क्रिप्ट लिखी है जो इसे करूँगा, और अब यह मेरी पसंद का तरीका है। यह भी संक्षेप में कि इसे जाग में कैसे करें या अन्यत्र कैसे पुनर्स्थापित करें और निकालें। हाल ही में मैंने इस sed विधि को सूची में जोड़ा। आप स्क्रिप्ट और अन्य तरीकों को यहां पा सकते हैं: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html


0

मैंने कुछ विकल्प आजमाए, जो अविश्वसनीय रूप से धीमे थे। इसने कुछ ही मिनटों में 360GB डंप को अपनी तालिकाओं में विभाजित किया:

मैं mysqldump से आउटपुट को छोटी फ़ाइलों में कैसे विभाजित करूं?


0

पहले वर्णित 'सेड' समाधान अच्छे हैं लेकिन 100% सुरक्षित नहीं हैं

  • आपके पास डेटा युक्त INSERT कमांड हो सकते हैं: ... क्रिएट टेबल ... (जो भी हो) ... mytable ...

  • या यहां तक ​​कि सटीक स्ट्रिंग "सृजन योग्य` mytable`; " यदि आप उदाहरण के लिए DML कमांड स्टोर कर रहे हैं!

(और यदि तालिका बहुत बड़ी है तो आप उसे मैन्युअल रूप से जांचना नहीं चाहते हैं)

मैं उपयोग किए गए डंप संस्करण के सटीक सिंटैक्स को सत्यापित करूंगा, और अधिक प्रतिबंधात्मक पैटर्न खोज करूंगा:

"*।" से बचें और "^" का उपयोग करके यह सुनिश्चित करें कि हम लाइन की शुरुआत पर शुरू करें। और मैं शुरुआती 'DROP' को हथियाना पसंद करूंगा

सब सब में, यह मेरे लिए बेहतर काम करता है:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.