Mysqldump से रिकॉर्ड की संख्या को सीमित करना?


137

मैं एक बड़े डेटाबेस से एक परीक्षण डेटाबेस में रिकॉर्ड का एक छोटा सा नमूना लोड करने की कोशिश कर रहा हूं।

आप mysqldump को केवल 8 मिलियन में से n रिकॉर्ड कैसे देंगे?

धन्यवाद

जवाबों:


212

जैसा कि स्कैफ़मैन कहते हैं, - the- विकल्प का उपयोग करें :

mysqldump --opt --where="1 limit 1000000" database

बेशक, यह आपको हर तालिका से पहली मिलियन पंक्तियाँ देगा।


15
सीमा से पहले "1" क्या करता है?
फोब

31
@Phob: - the- विकल्प मूल रूप से प्रपत्र की एक क्वेरी से जुड़ा होता है SELECT * from table WHERE , इसलिए इस मामले में आपको मिलता है SELECT * from table WHERE 1 limit 1000000। 1 के बिना, आपके पास एक अमान्य क्वेरी होगी। जहां क्लॉज के लिए 1 निर्दिष्ट करना (क्योंकि 1 हमेशा सत्य होता है) बस सभी रिकॉर्ड का चयन करता है।
एडम बेलेयर

24
वाह, क्या हैक है। तो आप मूल रूप से एसक्यूएल अपने आप को इस तरह से इंजेक्ट कर सकते हैं।
फोब

6
क्या यह सभी विदेशी प्रमुख एकीकरण बनाए रखता है? यदि नहीं, तो क्या ऐसा करने का कोई तरीका है?
कीथएक्सएम

4
धन्यवाद! इसके अतिरिक्त, आप उपयोग कर सकते हैं: mysqldump --opt --where="1 limit 1000000 offset 1000000" --no-create-info database 1 मिलियन रिकॉर्ड का दूसरा पृष्ठ प्राप्त करने के लिए। केवल डेटा को डंप करने और क्रिएट टेबल सामान को छोड़ने के अलावा अन्य पृष्ठों पर -no-create-info ध्वज का उपयोग करना सुनिश्चित करें ।
pfuri

59

यदि आप nकिसी विशिष्ट तालिका से रिकॉर्ड प्राप्त करना चाहते हैं तो आप कुछ इस तरह से कर सकते हैं:

mysqldump --opt --where="1 limit 1000000" database table > dump.sql

यह फ़ाइल में 1000000नामित तालिका से पहली पंक्तियों को डंप करेगा ।tabledump.sql


9

mysqldump को निष्पादित करने के लिए एक SQL क्वेरी दी जा सकती है, जिससे यह डंप के लिए डेटा ले जाएगा। आप पंक्तियों की संख्या को सीमित करने के लिए अपनी क्वेरी में "सीमा X" खंड का उपयोग कर सकते हैं।


7

जैसा कि डिफ़ॉल्ट क्रम ASC है जो शायद ही कभी आप इस स्थिति में चाहते हैं, आपको DESC को बॉक्स से बाहर काम करने के लिए एक उचित डेटाबेस डिज़ाइन की आवश्यकता होती है। यदि आपके सभी तालिकाओं में एक ही नाम (प्राकृतिक या सरोगेट) के साथ एक प्राथमिक कुंजी कॉलम है, तो आप आसानी से उपयोग कर रहे एन नवीनतम रिकॉर्ड को डंप कर सकते हैं:

mysqldump --opt --where="1 ORDER BY id DESC limit 1000000" --all-databases > dump.sql

यह एक सही कारण है कि आपको हमेशा अपनी पीके की आईडी का नाम देना चाहिए और समग्र पीके से भी बचना चाहिए, यहां तक ​​कि एसोसिएशन तालिकाओं में भी (सरोगेट कुंजी का उपयोग करें)।


1
ऐसा करें (नाम आईडी और समग्र पीके से बचें) और आपको रिलेशनल डेटाबेस सिद्धांत को अनदेखा करना होगा।
मोटोलेटो

1
वास्तव में, यदि आप रिलेशनल डेटाबेस की सर्वोत्तम प्रथाओं का पालन करते हुए अपने डेटाबेस को डिज़ाइन करते हैं, तो अपने पीके को डेटा और इकाई के आधार पर परिभाषित करते हुए, आप उदाहरण के लिए --option --where = "1 LIMIT 10000" का उपयोग कर सकते हैं। ORDER BY के बिना, यह काम करेगा क्योंकि MySQL प्राकृतिक तरीके से ऑर्डर करेगा, जो यह कहने के बराबर है कि यह PK के इंडेक्स ऑर्डर का पालन करेगा। फिर, संबंधित तालिकाओं के सभी एफके में केवल डेटा होगा जो उनके संदर्भ तालिका में मौजूद है क्योंकि आदेश समान होगा।
म्पलेटो

आईडी का उपयोग कई डेवलपर्स का सच्चा प्लेग है। पीके की तरह आईडी का होना पीके के समान नहीं है। आपकी अखंडता को छेद दिया गया था, क्योंकि अधिकांश मामलों में, एक ऑटो वेतन वृद्धि संख्या का इकाई डेटा के साथ कोई लेना-देना नहीं है।
म्पलेटो

@mpoletto --where = "1 लिमिट 10000" केवल 10000 प्रथम प्रविष्टियाँ चुनेगा। मेरे उत्तर का पूरा बिंदु यह दिखाना था कि आप नवीनतम एक्स प्रविष्टियाँ प्राप्त करना कैसे हल करेंगे, जो आमतौर पर आप चाहते हैं। मुझे यह भी समझ में नहीं आता है कि "संबंधपरक डेटाबेस सिद्धांत की अनदेखी" के साथ नामकरण सम्मेलनों का क्या करना है, मुझे लगता है कि आपने मेरे जवाब को गलत समझा। सबसे लोकप्रिय ORM जैसे EF, Django ORM, आदि पीके-कॉलम के लिए "id" को डिफ़ॉल्ट और सलाह देते हैं, क्योंकि यह केवल users.id के बजाय users.user_id कहना निरर्थक है।
एंड्रियास बर्गस्ट्रॉम्म

जब आप कहते हैं कि "आपको पीके की आईडी को हमेशा नाम देना चाहिए और कंपोजिट पीके के" से बचने का एक सही कारण है, तो आप रिलेशनल डेटाबेस सिद्धांत को अनदेखा कर रहे हैं। "सबसे लोकप्रिय ORM" के बारे में आपका तर्क मान्य नहीं है क्योंकि इस ORM को काम करने के लिए ID के साथ तालिकाओं की आवश्यकता है।
मोटोलेटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.