कई दृश्यों पर DEFINER संशोधित करें


25

मुझे अपडेट के बाद अपने डेटाबेस का बैकअप लेने में समस्या हो रही है । मैं अपने सिस्टम पर यह जानने की कोशिश में इधर-उधर ताक रहा हूं। मेरे द्वारा चलाए गए एक प्रश्न ने यह परिणाम लौटा दिया।

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

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

एक निश्चित के साथ लगभग 40 विचार हैं जो अब मौजूद नहीं हैं। क्या एक ही बार में सब कुछ पर एक अलग खाते में निश्चित को बदलने का एक आसान तरीका है? वहाँ एक तरीका है mysqldump पाने के लिए बस एक फ़ाइल के लिए सभी विचारों बाहर डंप ताकि मैं उस फ़ाइल को संपादित कर सकता है और विचारों को फिर से बना सकता है?


मेरे लिए, मैंने बस लापता खाते को डेटाबेस में जोड़ा और त्रुटि दूर हो गई।
user1794918

जवाबों:


13

सभी दृश्य परिभाषाओं के साथ एक टेक्स्ट फ़ाइल बनाएं:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

आप वहाँ से AllMyViews.sql संपादित करें। फिर, ड्रॉप्स द व्यूज

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

AllMyViews.sql के संपादन के बाद उन्हें पुनः लोड करें

mysql -uusername -ppassword -A < AllMyViews.sql

कोशिश तो करो !!!


+1 एक बेहतरीन विकल्प के रूप में यदि view_definition of info_schema नहीं दिखा रहा है, लेकिन शो क्रिएट व्यू ठीक काम करता है।
डेरेक डाउनी

जबकि मुझे सिद्धांत रूप में डीटीएस्ट का समाधान बेहतर लगा, मेरे सिस्टम के बारे में कुछ इसे काम करने से रोक रहा था। मैंने मूल रूप से उपरोक्त का उपयोग शो बनाने के बयानों को फ़ाइल में डंप करने के लिए किया था, और मुझे मैन्युअल रूप से उन्हें थोड़ा संपादित करना था और फिर उन्हें चलाना था।
ज़ॉडेचे जूल 26'11

शो क्रिएट व्यू तब काम नहीं करता जब निश्चित उपयोगकर्ता मौजूद नहीं है - यह mysqldump के समान त्रुटि फेंकता है:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 फिर, आपको उस उपयोगकर्ता को अस्थायी रूप से बनाना होगा। दौड़ो CREATE USER 'abc'@'1.2.3.4';। फिर, फिर से प्रयास करें।
RolandoMySQLDBA

मैंने अभी देखा कि व्यू कुछ संग्रहीत प्रक्रिया का उपयोग करता है और उस त्रुटि संदेश को उस प्रक्रिया के निश्चित रूप से महसूस किया जाता है, न कि खुद को देखें
Marki555

25

आप सूचना स्कीमा के साथ संयोजन में अन्य दृश्य का उपयोग कर सकते हैं । आपने इसे एक पाठ फ़ाइल में डंपिंग का उल्लेख किया है, इसलिए शायद कुछ इस तरह है:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

इसे mysql कमांड लाइन के साथ मिलाएं (यह मानते हुए * निक्स, विंडोज़ से परिचित नहीं):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: आप सीधे सूचनाओं की प्रविष्टि को बदल नहीं सकते । नोट 2: यह एक समय में केवल एक डेटाबेस के लिए काम करता है, यदि आप WHER को छोड़ देते हैं, तो आपको प्रत्येक के लिए USE कमांड सम्मिलित करने की आवश्यकता है।


मुझे यह पसंद है क्योंकि यह मेरी तुलना में थोड़ा कम शामिल है और अधिक संक्षिप्त है। +1 !!! (मैं इसके बारे में भूल गया)
RolandoMySQLDBA

किसी भी विचार क्यों view_definition फ़ील्ड खाली होगा? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; रिटर्न| Staff | |
ज़ॉदाचे जूल 26'11

चैट में चर्चा से, ऐसा लगता है कि यह सुपर विशेषाधिकार के साथ एक अनुमति मुद्दा है। Bugs.mysql.com/bug.php?id=39733
डेरेक डाउनी

सही समाधान! +1
पाब्लो मार्टिनेज

कम से कम echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
रेडहैट

3

डेरेक के समाधान पर स्वचालित, यह DEFINER को बदल देगा root@localhostऔर सेट SQL SECURITY INVOKERकर देगा (सुनिश्चित करें कि आप चाहते हैं कि पहले!) सभी डेटाबेस में सभी विचारों में:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

चेतावनी: सुनिश्चित करें कि आपने एक पूर्ण mysql बैकअप बनाया है (उदाहरण के लिए, mysqld को रोक कर, और इसे चलाने से पहले / var / lib / mysql में सभी फ़ाइलों का बैकअप लें - बस मामले में ... यह मेरे लिए काम किया है, लेकिन YMMV ।

आपको अपने सभी तालिकाओं / विचारों की जांच करनी चाहिए:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

इसे अब विचारों में अमान्य परिभाषा के बारे में शिकायत नहीं करनी चाहिए।


बेशर्मी से इसे मेरे स्निपेट में जोड़ दिया। धन्यवाद!
स्टेफगोसेलिन

3

डेटाबेस के सभी विचारों को निर्यात करें <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स्विच करें ।


VIEWS, को किस तरीके views.sqlसे संपादित किया जाना चाहिए ? इसके अलावा, उन्हें कैसे फिर से बनाना है?
शेरिलहोमैन

@SherylHohman बदलें DEFINER = olduser@oldhostकरने के लिए DEFINER = newuser@newhost, cat views.sql | mysql <DB>विचारों का पुनर्निर्माण करने वाला।
x- यूरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.