उत्पन्न की गई .sql
फ़ाइल को आयात करने की प्रक्रिया को "स्वचालित" करने के लिए , उन सभी जालों से बचते हुए, जिनके माध्यम से फ़ाइलों को पास करने की कोशिश में छिपाया जा सकता है stdin
और stdout
, MySQL को MySQL .sql
में SOURCE
कमांड का उपयोग करके उत्पन्न फ़ाइल को निष्पादित करने के लिए कहें ।
क्षितिज सूद से संक्षिप्त, लेकिन उत्कृष्ट, उत्तर में वाक्य रचना , सबसे अच्छा प्रारंभिक बिंदु देता है। संक्षेप में, क्षितिज सूद के सिंटैक्स के अनुसार ओपी की कमांड को संशोधित करें और कमांड को उस कमांड के साथ बदलें :SOURCE
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
यदि डेटाबेस का नाम जनरेट में शामिल है .sql
फ़ाइल , तो इसे कमांड से छोड़ा जा सकता है।
यहाँ अनुमान यह है कि उत्पन्न फ़ाइल अपने आप में एक फ़ाइल के रूप में मान्य है.sql
। शेल द्वारा फ़ाइल को पुनर्निर्देशित, पाइप्ड या किसी अन्य तरीके से नियंत्रित नहीं करने से, शेल के कारण उत्पन्न आउटपुट में किसी भी वर्ण से बचने की आवश्यकता के साथ कोई समस्या नहीं है। एक .sql
फ़ाइल में बच निकलने की जरूरत के संबंध में नियम , निश्चित रूप से, अभी भी लागू होते हैं।
कमांड लाइन पर, या एक my.cnf
फ़ाइल आदि में पासवर्ड के आसपास सुरक्षा मुद्दों से निपटने के लिए , कुछ उत्कृष्ट सुझावों के साथ, अन्य उत्तरों में अच्छी तरह से संबोधित किया गया है। डैनी से मेरा पसंदीदा जवाब , यह कवर करता है, जिसमें नौकरी से निपटने के दौरान समस्या को कैसे संभालना है , या कुछ और भी शामिल है।cron
मेरे द्वारा बताए गए संक्षिप्त उत्तर पर एक टिप्पणी (प्रश्न?) को संबोधित करने के लिए : नहीं, इसका उपयोग HEREDOC सिंटैक्स के साथ नहीं किया जा सकता है, क्योंकि यह शेल कमांड दिया गया है। HEREDOC का उपयोग पुनर्निर्देशन संस्करण सिंटैक्स में किया जा सकता है , ( -Bse
विकल्प के बिना ), क्योंकि I / O पुनर्निर्देशन वह है जो HEREDOC के आसपास बनाया गया है। यदि आपको HEREDOC की कार्यक्षमता की आवश्यकता है, तो .sql
फ़ाइल के निर्माण में इसका उपयोग करना बेहतर होगा , भले ही यह एक अस्थायी हो, और MySQL बैच लाइन के साथ निष्पादित करने के लिए "कमांड" के रूप में उस फ़ाइल का उपयोग करें।
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
ध्यान रखें कि शेल विस्तार के कारण आप HEREDOC के भीतर शेल और पर्यावरण चर का उपयोग कर सकते हैं। डाउन-साइड यह है कि आपको प्रत्येक बैकटिक से बचना चाहिए । MySQL उन्हें पहचानकर्ताओं के लिए सीमांकक के रूप में उपयोग करता है लेकिन शेल, जो पहले स्ट्रिंग प्राप्त करता है, उन्हें निष्पादन योग्य कमांड सीमांकक के रूप में उपयोग करता है। माईएसक्यूएल कमांड्स के सिंगल बैकटिक पर भागने से चूक जाते हैं, और पूरी चीज त्रुटियों के साथ फट जाती है। पूरे मुद्दे को HEREDOC के लिए उद्धृत सीमा रेखा का उपयोग करके हल किया जा सकता है:
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
शेल विस्तार को हटाने से बैकटिक्स और अन्य शेल-विशेष पात्रों से बचने की आवश्यकता समाप्त हो जाती है। यह इसके भीतर शेल और पर्यावरण चर का उपयोग करने की क्षमता को भी हटा देता है। यह बहुत ज्यादा खोल स्क्रिप्ट के अंदर एक HEREDOC का उपयोग करने के लाभों को हटा देता है।
अन्य विकल्प बैच वाक्यविन्यास संस्करण ( -Bse
) के साथ बैश में अनुमत बहु-पंक्ति उद्धृत स्ट्रिंग्स का उपयोग करना है । मैं अन्य गोले नहीं जानता, इसलिए मैं यह नहीं कह सकता कि क्या वे इसमें काम करते हैं। आपको किसी भी तरह .sql
से SOURCE
कमांड के साथ एक से अधिक फ़ाइल को निष्पादित करने के लिए इसका उपयोग करने की आवश्यकता होगी , क्योंकि यह किसी अन्य MySQL कमांड द्वारा समाप्त नहीं किया ;
जाता है, और प्रति लाइन केवल एक की अनुमति है। मल्टी-लाइन स्ट्रिंग शेल विस्तार पर सामान्य प्रभावों के साथ या तो सिंगल या डबल उद्धृत किया जा सकता है। बैकटिक्स इत्यादि के लिए HEREDOC सिंटैक्स का उपयोग करने के समान ही यह भी है।
एक संभावित रूप से बेहतर समाधान एक स्क्रिप्टिंग भाषा का उपयोग करना होगा, पर्ल, पायथन, आदि, .sql
फ़ाइल बनाने के लिए , जैसा कि ओपी ने किया था, और SOURCE
शीर्ष पर सरल कमांड सिंटैक्स का उपयोग करके वह फ़ाइल। शेल की तुलना में स्ट्रिंग भाषाओं में स्क्रिप्टिंग भाषाएं बहुत बेहतर हैं, और MySQL के साथ काम करते समय उद्धृत और बच निकलने के लिए अधिकांश में अंतर्निहित प्रक्रियाएं हैं।