मैं मैसकॉल में एक दृश्य के DEFINER को कैसे बदलूं?


35

जब मैं mysqldump चलाता हूं, मुझे एक त्रुटि मिलती है:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

यह समझ में आता है क्योंकि foobarएक विरासत मशीन है जो अब मौजूद नहीं है।

मैं अपनी सभी टेबलों की परिभाषा को 'रूट' @ 'लोकलहोस्ट' में कैसे बदलूं?


4
क्या आपके पास दृश्य हैं? टेबल्स के पास निश्चित नहीं है मुझे यकीन है ... इसके अलावा dba.stackexchange.com/q/4129/630
gbn

1
@ आप +1 सही थे - वे लिंक के लिए विचार - thx थे, लेकिन मैं इसे ठीक से काम नहीं कर पाया। हालाँकि, मैं SQLyog में विचारों को संशोधित करने में सक्षम था ताकि मैं डंप कर सकूं।
kfmfe04

यह मेरे लिए काम करता है। {{सभी पर अनुदान अनुदान विकल्प के साथ 'पासवर्ड' द्वारा पहचाने गए 'मूल' @ '%' को; }}
मुहम्मद अज़ीम

जवाबों:


33

मुझे क्या लगता है कि जिस डेटाबेस को आप डंप करने की कोशिश कर रहे हैं उसमें ऐसी प्रक्रियाएँ / विधियाँ हैं जो एक उपयोगकर्ता द्वारा परिभाषित की गई थीं जबकि रूट @ 'फोबोब' के रूप में लॉग इन थीं।

अब समाधान यह है कि आपको उस प्रक्रिया / विधियों के लिए निश्चित की जगह लेनी होगी

तो आप त्रुटि के बिना डंप उत्पन्न कर सकते हैं।

आप ऐसा कर सकते हैं।

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

सावधान रहें, क्योंकि यह सभी डेटाबेस के लिए सभी परिभाषाओं को बदल देगा।

कोशिश करो....!

9 फरवरी 2012 को अद्यतन

जैसा कि मैंने @ जीबीएन द्वारा दिया गया लिंक देखा जो कि @ रोलैंडो द्वारा दिया गया एक उत्तर है जो कि केस भी हो सकता है। कृपया लिंक पर जाएँ

EDIT @RolandoMySQLDBA 2011-12-16 11:20 EDT द्वारा

जबकि जोखिम भरा है, यह जवाब अच्छा है। बस स्पष्ट करने के लिए: आप इस तरह से अपनी क्वेरी में डेटाबेस निर्दिष्ट कर सकते हैं:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
ऊपर दिए गए लिंक से पता चलता है कि इसे ALTER कथनों के साथ कैसे किया जाए जो कम जोखिम भरा हो सकता है ... इसके अलावा, कृपया अपने अद्यतन के लिए मेरे अद्यतन की जाँच करें
gbn

UPDATEतालिका को बदल दिया, लेकिन mysqldumpइसे नहीं देखा mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES:। पुनरारंभ करने के बाद भी mysql। मैं दौड़ रहा हूं mysql-5.5.31
x-yuri

मेरी गलती। मेरे पास एक गलत परिभाषा के साथ विचार थे। update mysql.procदृष्टिकोण वास्तव में काम करता है।
x- यूरी

काम नहीं किया ....
ナ ナ

3
यह उत्तर प्रक्रियाओं और कार्यों की निश्चितताओं को बदलने के लिए काम करता है लेकिन किसी दृश्य के परिभाषा को नहीं बदलता है ।
एंथोनी जी - मोनिका के लिए न्याय

35

--single-transactionस्विच का उपयोग करने के लिए आसान :

mysqldump --single-transaction -u username -p db > db.sql

1
क्षमा करें, यह मूल प्रश्न में वर्णित समस्या को कैसे हल करता है? लगता है कि आपने गलत प्रश्न का उत्तर दिया ...
dezso

6
उत्तर की संरचना गलत है, क्योंकि - एकल-लेनदेन को डेटाबेस के नाम से पहले होना चाहिए, लेकिन उत्तर वास्तव में सही है। इस विकल्प को निर्दिष्ट करने से mysqldump का लॉकिंग व्यवहार बदलकर समस्या के आसपास काम करता है, इसलिए मूल प्रश्न में त्रुटि अब नहीं होती है।
माइकल - sqlbot 3

मैंने उसी समस्या का सामना किया। काम किया - सिंघल-लेन-देन।

यकीन नहीं है कि यह क्या करता है, लेकिन हालांकि काम किया! धन्यवाद
श्री हर्ष Kappala

17

सबसे तेज़ समाधान बस निश्चित को फिर से बनाना होगा ताकि यह मौजूद हो, जब तक कि यह मौजूदा उपयोगकर्ताओं के साथ कोई टकराव पैदा नहीं करता है।

CREATE USER 'root'@'foobar';


यदि उपयोगकर्ता ''% '' मूल '' है तो क्या होगा? मैं एक सर्वर पर ऐसी बात से इनकार करता हूं जिसके लिए हम जिम्मेदार हैं।
एटिला फुलोप

@AttilaFulop हां, सुरक्षा निश्चित रूप से एक विचार होना चाहिए, लेकिन मैंने कहा कि यह "सबसे तेज" समाधान था, न कि एकदम सही। एक बार आयात पूरा हो जाने पर उपयोगकर्ता को अतिरिक्त उपयोगकर्ता होने के जोखिमों को कम करने के लिए हटाया जा सकता है।
कॉलिनम

तुम उसमें सही हो। मैं इस विशेष पहलू पर भी ध्यान आकर्षित करना चाहता था। मेरे काम करने वालों ने 'रूट' @ '%' जोड़ दिया है और इसे तब तक छोड़ दिया है जब तक चक नॉरिस जीवित है। हमेशा के लिए;)
अत्तिला फुलोप

6

डेटाबेस के सभी विचारों को निर्यात करें <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

या:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

views.sqlउन्हें संपादित करें और पुन: बनाएँ:

cat views.sql | mysql <DB>

यदि आवश्यक हो तो निर्दिष्ट करें -uऔर -pस्विच करें ।


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