पहुंच अस्वीकृत; इस ऑपरेशन के लिए आपको कम से कम (एक) सुपर विशेषाधिकार की आवश्यकता है


89

इसलिए मैं sql फ़ाइल को rds (1G MEM, 1 CPU) में आयात करने का प्रयास करता हूं। Sql फ़ाइल 1.4G की तरह है

mysql -h xxxx.rds.amazonaws.com -u user -ppass --max-allow-packet = 33554432 db <db.sql

इस पर अटक गया:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

वास्तविक sql सामग्री है:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
        SET NEW.created_at = NOW();
END IF */;;

another_user rds में मौजूद नहीं है, इसलिए मैं करता हूं:

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';

फिर भी नसीब नहीं।

जवाबों:


167

या तो DEFINER=..अपने sqldump फ़ाइल से कथन निकालें , या उपयोगकर्ता मानों को बदलें CURRENT_USER

RDS द्वारा प्रदान किया गया MySQL सर्वर DEFINERकिसी अन्य उपयोगकर्ता (मेरे अनुभव में) के लिए एक सिंटैक्स की अनुमति नहीं देता है ।

आप sedउन्हें फ़ाइल से निकालने के लिए स्क्रिप्ट का उपयोग कर सकते हैं :

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql

3
तुम सही हो। इसका कारण यह नहीं है कि किसी अन्य उपयोगकर्ता को निर्दिष्ट करने के रूप में DEFINERजब लॉग-इन उपयोगकर्ता के पास SUPERविशेषाधिकार नहीं है (जो कि स्वयं आरडीएस में अनुमति नहीं है), मनमाने ढंग से विशेषाधिकार वृद्धि की अनुमति देगा - संग्रहीत कार्यक्रम क्रेडेंशियल और विशेषाधिकार के साथ चलते हैं DEFINER(जैसा कि कॉलिंग उपयोगकर्ता - उनके INVOKER) के विपरीत , डिफ़ॉल्ट रूप से। सर्वर फाल्ट पर भी ।
माइकल - sqlbot

यार तुम एक जीवन रक्षक हो जब मेरी होस्टिंग कंपनी ने मुझे भ्रष्ट डेटाबेस बताया तो निर्यात किया और बहाल करने के लिए कुछ भी नहीं किया जा सकता था। सही समाधान।
वुडी

4
किसी कारण से मुझे + के बजाय * का उपयोग करना पड़ा:sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
बेरेन्ड डी बोअर

धन्यवाद @BerenddeBoer
अवलोक हुसैन

1
@OnderLand आप कोशिश कर सकते हैं awkजो कि थोड़ी तेज हो सकती हैsed
hjpotter92

35

यदि आपकी डंप फ़ाइल नहीं है DEFINER, तो सुनिश्चित करें कि नीचे दी गई लाइनें भी यदि वे वहां हैं, तो हटा दी जाए या साथ टिप्पणी की जाए --:

शुरू में:

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';

अतं मै:

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

12
आप --set-gtid-purged=OFFअपने mysqldumpआदेश में जोड़कर इन्हें रोक सकते हैं । यहाँ मिला: stackoverflow.com/a/56251925
Illya Moskvin

13

एक अन्य उपयोगी चाल mysqldump को विकल्प के साथ आमंत्रित करना है --सेट-gtid-purged = OFF जो निम्न पंक्तियों को आउटपुट फ़ाइल में नहीं लिखता है:

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

DEFINER एक के बारे में निश्चित नहीं है।


धन्यवाद! आरडीएस के मामले में इसने मेरी मदद की
विक्टर

धन्यवाद। मेरे मामले में मैं SET @@GLOBAL.GTID_MODE = OFF;स्रोत डेटाबेस से निर्यात पक्ष में MySql कार्यक्षेत्र में भाग गया
बायरन वोंग

8

Hjpotter92 जवाब के लिए बस एक मैकओएस अतिरिक्त अपडेट।

sedMacOS में पैटर्न को पहचानने के लिए, आपको =साइन से पहले एक बैकस्लैश जोड़ना होगा , जैसे:

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql

2020 तक काम करता है, macOS कैटालिना पर MariaDB 10.4 का उपयोग करते हुए
वेन

4

समस्या : आप अपने mysql डेटाबेस में डेटा (mysqldump फ़ाइल का उपयोग करके) आयात करने की कोशिश कर रहे हैं, लेकिन ऐसा लगता है कि आपको उस ऑपरेशन को करने की अनुमति नहीं है।

समाधान : मान लें कि डेटा माइग्रेट, सीड और आपके mysql डेटाबेस में अपडेट किया गया है, mysqldump का उपयोग करके स्नैपशॉट लें और इसे फ़ाइल में निर्यात करें

mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql

Mysql प्रलेखन से:

GTID - एक वैश्विक लेनदेन पहचानकर्ता (GTID) एक अद्वितीय पहचानकर्ता है जो मूल (मास्टर) के सर्वर पर किए गए प्रत्येक लेनदेन के साथ बनाया और जुड़ा हुआ है। यह पहचानकर्ता न केवल उस सर्वर पर अद्वितीय है, जिस पर यह उत्पन्न हुआ था, लेकिन किसी प्रतिकृति प्रतिकृति में सभी सर्वरों के लिए अद्वितीय है। सभी लेनदेन और सभी GTID के बीच 1 से 1 मैपिंग है।

--set-gtid-purged = OFF SET @@ GLOBAL.gtid_purged आउटपुट में नहीं जोड़ा गया है, और SET @@ SESSION.sql_log_bin = 0 आउटपुट में नहीं जोड़ा गया है। एक सर्वर के लिए जहां GTID उपयोग में नहीं हैं, इस विकल्प या AUTO का उपयोग करें। इस विकल्प का उपयोग केवल उस सर्वर के लिए करें जहां GTID उपयोग में हैं यदि आप सुनिश्चित हैं कि आवश्यक GTID सेट पहले से ही gtid_purged में लक्ष्य सर्वर पर मौजूद है और इसे बदला नहीं जाना चाहिए, या यदि आप मैन्युअल रूप से किसी भी लापता GTID को पहचानने और जोड़ने की योजना बनाते हैं।

बाद में उपयोगकर्ता रूट के साथ अपने mysql से कनेक्ट करें, अनुमति दें, उन्हें फ्लश करें और सत्यापित करें कि आपके उपयोगकर्ता विशेषाधिकार सही तरीके से अपडेट किए गए थे।

mysql -u root -p
UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%';
FLUSH PRIVILEGES;
mysql> SHOW GRANTS FOR 'johnDoe';
+------------------------------------------------------------------+
| Grants for johnDoe                                               |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `johnDoe`                                  |
| GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe`                     |
+------------------------------------------------------------------+

अब डेटा पुनः लोड करें और ऑपरेशन की अनुमति दी जानी चाहिए

mysql -h [host] -u [user] -p[pass] [db_name] < [mysql_dump_name].sql

3

.sql.gzप्रारूप में डेटाबेस फ़ाइल आयात करने के लिए , नीचे दिए गए आदेश का उपयोग करके निश्चित निकालें और आयात करें

zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_name
  1. इससे पहले, नीचे कमांड का उपयोग करके .sql.gz प्रारूप में डेटाबेस निर्यात करें।

    mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;

  2. आयात कि डेटाबेस निर्यात और कमांड के नीचे का उपयोग कर हटाने,

    zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db


2

जब आप बैकअप को पुनर्स्थापित करते हैं, तो पुराने और नए के लिए एक ही उपयोगकर्ता नाम के साथ प्रयास करना सुनिश्चित करें।


2

पूर्ण समाधान

उपरोक्त सभी उपाय ठीक हैं। और यहां मैं सभी समाधानों को संयोजित करने जा रहा हूं ताकि यह सभी स्थितियों के लिए काम करे।

  1. निश्चित DEFINER

लिनक्स और मैक के लिए

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql

Windows
डाउनलोड परमाणु या नोटपैड ++ के लिए, परमाणु या नोटपैड ++ के साथ अपनी डंप एसक्यूएल फ़ाइल खोलें, Ctrl + F
शब्द को DEFINER खोजें और हर जगह DEFINER = admin@% (या आपके लिए थोड़ा अलग हो सकता है) शब्द हटाएं और फ़ाइल को सहेजें। उस लाइन को हटाने से पहले
उदाहरण के लिए
: उस लाइन को हटाने के बाद DEFINER = admin@ %प्रक्रिया बनाएंMyProcedure
: क्रीक प्रक्रियाMyProcedure

  1. 3 पंक्तियाँ निकालें इन सभी 3 पंक्तियों को डंप फ़ाइल से निकालें। आप sed कमांड का उपयोग कर सकते हैं या एटम एडिटर में फाइल खोल सकते हैं और प्रत्येक लाइन को खोज सकते हैं और फिर लाइन को हटा सकते हैं।
    उदाहरण: एटम में Dump2020.sql खोलें, ctrl + F दबाएं, SET @@ SESSION.SQL_LOG_BIN = 0 खोजें , उस लाइन को हटा दें।
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
  1. आपकी जनरेट की गई फ़ाइल के साथ कोई समस्या है यदि आपकी जनरेट की गई डंप .sql फ़ाइल उचित नहीं है तो आपको कुछ समस्या का सामना करना पड़ सकता है। लेकिन यहाँ, मैं समझा नहीं रहा हूँ कि डंप फ़ाइल कैसे जनरेट करें। लेकिन आप मुझसे ( _ ) पूछ सकते हैं

0

मैंने टिप्पणी की कि सभी लाइनें फ़ाइल SETमें शुरू होती हैं *.sqlऔर यह काम करती हैं।


0

* उत्तर केवल MacOS पर लागू हो सकता है *

डॉक कंटेनर में .sql फ़ाइल आयात करने का प्रयास करते समय, मुझे त्रुटि संदेश का सामना करना पड़ा:

पहुंच अस्वीकृत; इस ऑपरेशन के लिए आपको (कम से कम एक) सुपर विशेषाधिकार की आवश्यकता है

फिर कुछ अन्य सुझावों की कोशिश करते हुए, मुझे अपने MacOS (osx) पर नीचे की त्रुटि मिली।

sed: RE त्रुटि: अवैध बाइट अनुक्रम

अंत में, इस संसाधन से निम्नलिखित कमांड ने मेरे "एक्सेस अस्वीकृत" मुद्दे को हल कर दिया।

LC_ALL=C sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' fileName.sql

इसलिए मैं डॉकर डेटाबेस में आयात कर सकता हूं:

docker exec -i dockerContainerName mysql -uuser -ppassword table < importFile.sql

उम्मीद है की यह मदद करेगा! :)


0

सर्वर साइड पर "सर्वर पैरामीटर" log_bin_trust_function_creators पर "सेट" करने की आवश्यकता है। यह एक आप आसानी से बाईं ओर ब्लेड पर पा सकते हैं अगर यह एज़्योर मारिया डीबी है।


-1

बयान

DEFINER = username@ `%

आपके बैकअप डंप में एक समस्या है।

समाधान जो आप चारों ओर काम कर सकते हैं, वह है सभी प्रविष्टि को sql डंप फ़ाइल से निकालना और GCP कंसोल से डेटा आयात करना।

cat DUMP_FILE_NAME.sql | sed -e 's / DEFINER = <username>@ %// g'> NEW-CLEANED-DUMP.sql

नई फ़ाइल आयात करने का प्रयास करें (NEW-CLEANED-DUMP.sql)।

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