EC2 MySQL माइग्रेट करने का पहला प्रयास Amazon RDS के लिए अच्छा नहीं है - SUPER विशेषाधिकार


11

मैं EC2 पर चल रहे MySQL से एक मौजूदा db को एक नए अमेज़ॅन RDS उदाहरण (यह देखने के लिए कि क्या हम पार ले जा सकते हैं एक प्रयोग) को स्थानांतरित करने की कोशिश कर रहे हैं। अब तक, यह ठीक नहीं चल रहा है। मैं प्रतिकृति ( यहां निर्देश ) स्थापित करने से पहले प्रारंभिक आयात पर अटक गया हूं ।

मैंने वर्णित के रूप में RDS उदाहरण तैयार किया है और इसे mysql का उपयोग करते हुए EC2 उदाहरण से जोड़ सकते हैं। मैंने mysqldump कमांड को इस प्रकार चलाया:

mysqldump --master-data --databases db1 db2 > dump.sql

फिर इसे आरडीएस के साथ अपलोड करने का प्रयास किया गया:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

पहली समस्या डंप की लाइन 22 पर थी:

MASTER_LOG_FILE = 'mysql-bin.000002' में MASTER_LOG_PEG = 106 को बदलें;

इस लाइन में त्रुटि हुई ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation। कोई समस्या नहीं, बस उस लाइन पर टिप्पणी की और इसे बाद में mysql.rds_set_external_master () के माध्यम से ठीक करने की उम्मीद है। अपलोड को पुनः प्राप्त किया, और एक समान त्रुटि मिली ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation:। लाइन के चारों ओर 7844 खंड इस तरह दिखता है:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

पहली 2 पंक्तियों को टिप्पणी करके और तीसरे में एक 'क्रेट' जोड़कर, मैं इस एक को पाने में सक्षम था। लेकिन देखते हैं टन इस तरह वर्गों की। वहाँ किसी तरह से यह सब संपादन के बिना दौर है? एक विकल्प की तरह mysqldumpकुछ भी नहीं है जो सुपरर विशेषाधिकार की जरूरत नहीं है?

ऐसा लगता है कि बहुत से लोगों को इसी तरह की समस्याएं हुई हैं, जैसे कि sedmysqldump / mysqlbinlog के आउटपुट के खिलाफ चलना ! मैं AWS फोरम पर भी पोस्ट करने जा रहा हूं - वास्तव में मुझे लगता है कि RDS के पास mysqldump से आयात करने का अधिक सहिष्णु तरीका होना चाहिए, या एक विशिष्ट उपकरण जो डंप बनाने के लिए मौजूदा db के खिलाफ चलाया जा सकता है जो RDS सुरक्षा के साथ शिकायत है। अगर कोई किसी भी अन्य व्यंजनों या चालें जो यहाँ मदद कर सकता है बस सोच रहा था।

धन्यवाद,

डेव


क्षमा करें - यह कहना भूल गया कि मैंने log_bin_trust_function_creators1 को पैरामीटर बदलने की कोशिश की है , लेकिन अभी भी लाइन 7844 पर एक ही त्रुटि है।
dsl101

पुरानी पोस्ट, लेकिन पहली त्रुटि आप कह कर टाल सकते हैं --masterdata=2। फिर डंप में लाइन पर टिप्पणी की जाएगी।
हाफगैर

जवाबों:


26

आपको log_bin_trust_function_creatorsRDS पर = 1 की संभावना है, लेकिन यह मुद्दा नहीं है, यहाँ है।

आप DEFINER अपने स्वयं के खाते के अलावा किसी अन्य मूल्य को निर्दिष्ट कर सकते हैं  यदि आपके पास  SUPER विशेषाधिकार है।

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

जब एक संग्रहीत प्रोग्राम (खरीद, फ़ंक्शन, ईवेंट, या ट्रिगर) चल रहा है, तो उसके पास जो कुछ भी है उसे उपयोगकर्ता की अनुमति है जिसने इसे परिभाषित किया है, या उपयोगकर्ता द्वारा स्पष्ट रूप से एक DEFINERघोषणा के साथ कहा गया है । यह अन्य चीज़ों के बीच, संग्रहीत प्रोग्रामों के लिए, अन्य उपयोगकर्ताओं को डेटा को उन चीज़ों की अनुमति देने के लिए अनुमति देता है जिनके पास सीधे हेरफेर करने की अनुमति नहीं है, जब तक कि उनके पास संग्रहीत प्रोग्राम का उपयोग करने की अनुमति है।

यह एक गंभीर भेद्यता होगी, फिर, यदि कोई गैर- SUPERउपयोगकर्ता एक मनमाने ढंग से निश्चित के साथ एक प्रक्रिया बना सकता है, क्योंकि उपयोगकर्ता इच्छा पर अपने विशेषाधिकार को बढ़ा सकता है।

यह विचारों का भी सच है, निश्चित रूप से, जब निश्चित सुरक्षा संदर्भ का उपयोग किया जाता है, जैसा कि आपने पोस्ट किए उदाहरण में।

आरडीएस के पास मेरे पास सबसे बड़ी शिकायतों में से एक यह है कि आपके पास नहीं हो सकता SUPER... और अब यह आपकी भी हो सकती है, :) क्योंकि यह समस्या आपके पास होने वाली समस्या का कारण है।

बेशक, अगर मैं एक प्रबंधित MySQL सेवा चला रहा था, तो मैं किसी को भी नहीं दूंगा SUPER, इसलिए, उनका सुरक्षा मॉडल समझ में आता है, भले ही वह कभी-कभी अनिष्टकारी हो।

यदि आपकी सभी वस्तुओं में एक ही निश्चित है, तो उस खाते का उपयोग करके डंप को पुनर्स्थापित करने के लिए एक वर्कअराउंड होगा, जिसे आप अभी उपयोग कर रहे हैं, लेकिन ऐसा लगता है कि संभावना नहीं है।

DEFINERघोषणा के साथ सिर्फ रेखा को हटाने से उन मामलों में डंपफाइल काम करना चाहिए जहां यह खुद से एक पंक्ति में दिखाई देता है, या आप फ़ाइल को संशोधित करने के लिए sed या पर्ल का उपयोग कर सकते हैं ... एक विचार जो मुझे पहले से पता है कि आप शौकीन नहीं हैं लेकिन यह MySQL के बारे में वास्तव में एक अच्छी बात है कि इस तरह की हैकिंग काफी वैध है, और वास्तव में यह सब कुछ नहीं है जो कि मुझे गैर-आरडीएस एनवायरनमेंट में भी एक डीबीए के रूप में करना है।

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql

... संभवत: वह उत्तर नहीं, जिसकी आपने उम्मीद की थी, लेकिन आप अपने डंपफाइल के खिलाफ दौड़ सकते हैं और थोड़ा अधिक प्रयोग करने योग्य फ़ाइल के साथ समाप्त होना चाहिए।


व्यापक उत्तर के लिए बहुत धन्यवाद, और पुष्टि करने के लिए कि मुझे क्या लगा कि sed / perl एकमात्र समाधान है। मैं जिस ऐप का उपयोग कर रहा हूं, वह बहुत कस्टमाइज़्ड जूमला है, और ओपन-सोर्स होने के बावजूद मेरे पास यह विश्लेषण करने का समय / कौशल नहीं है कि क्या यह आरडीएस में अच्छी तरह से बढ़ेगा। मेरा विचार था कि 'कोशिश करो और देखो' - लेकिन ऐसा लगता है कि पहला कदम सबसे मुश्किल है - अमेज़ॅन के अपर्याप्त (मेरे विचार में) माइग्रेशन टूल के कारण कोई छोटा हिस्सा नहीं। मैं सुरक्षा मॉडल पर सहमत हूं, लेकिन अगर mysqldump का डिफ़ॉल्ट आउटपुट इतनी समस्याएं पैदा करता है, तो उनके पास बेहतर समाधान क्यों नहीं है? मैं उनसे भी यही पूछूंगा।
dsl101

1
बहुत बढ़िया। उस पर्ल स्क्रिप्ट के लिए बहुत बहुत धन्यवाद। मेरा बैकअप 4+ जीबी था और इसे खोलना एक चुनौती थी। इससे मेरा दिन बच गया।
एमिल बैजेल

1
महान व्याख्या, महान जवाब, और महान समाधान! मूर्ख निश्चित।
राकेरगरान

4
आपके पर्ल वन लाइनर के लिए बहुत बहुत धन्यवाद। यह केवल एक ही है जो मैं वास्तव में काम करता हूं। इन बोर्डों पर कई अन्य बस नहीं है। अगर मैं कर सकता तो मैं फिर से उठता।
lucian303

1

मेरे मामले में "CHANGE MASTER TO MASTER_LOG_FILE = ..." डंप में लाइन थी जो मुझे त्रुटि दे रही थी। यह लाइन mysqldump के "--master-data" विकल्प द्वारा जोड़ी गई थी। अमेज़ॅन AWS में आपको "mysql.rds_set_external_master" प्रक्रिया के साथ मास्टर विवरण सेट करके प्रतिकृति शुरू करने की आवश्यकता है बजाय यहाँ पढ़ें

तो मैं सिर्फ उस लाइन "हेड 22 बैकअप। डंप" के नोट्स को टॉक करता हूं, जहां लाइन 22 ने त्रुटि की सूचना दी थी। फिर आयात करने से पहले इसे हटा दें, अपनी बड़ी फ़ाइल के लिए जो मैं उपयोग करता हूं: "sed '22d' backup.dump> backup_clean.dump"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.