मैं MySQL से विशेषाधिकार कैसे निर्यात कर सकता हूं और फिर एक नए सर्वर पर आयात कर सकता हूं?


88

मुझे पता है कि mysqldump का उपयोग करके डेटाबेस को कैसे निर्यात / आयात किया जाता है और यह ठीक है लेकिन मुझे नए सर्वर में विशेषाधिकार कैसे मिलते हैं।

अतिरिक्त बिंदुओं के लिए, नए पर पहले से मौजूद डेटाबेस के एक जोड़े हैं, मैं कैसे पुराने सर्वर के विशेषाधिकार को आयात करता हूं, जो कि मौजूदा जोड़े को बिना किसी को बताए।

पुराना सर्वर: 5.0.67-समुदाय

नया सर्वर: 5.0.51a-24 + lenny1

संपादित करें: मुझे पुराने सर्वर से db 'mysql' का डंप मिला है और अब नए सर्वर पर 'mysql' db के साथ विलय करने का उचित तरीका जानना चाहता हूं।

मैंने phpMyAdmin का उपयोग करके एक सीधे 'आयात' की कोशिश की और एक डुप्लिकेट के बारे में एक त्रुटि के साथ समाप्त हुआ (एक जिसे मैंने पहले ही मैन्युअल रूप से माइग्रेट किया है)।

किसी को भी दो 'mysql' डेटाबेस के विलय का एक सुंदर तरीका मिला?


1. क्या आपके लिए PHPMyAdmin का उपयोग करना आवश्यक है? अगर यह है तो मैं आपके लिए कुछ PHPMyAdmin विशिष्ट निर्देश लिखूंगा। 2. PHPMyAdmin से अगर आप "mysql.user सीमा 1 से" का चयन करने का प्रयास करते हैं; क्या आपको परिणाम या कोई त्रुटि मिलती है
ब्रूनो ब्रोंस्की

1
जैसा कि मैंने नीचे उल्लेख किया है, मुझे लगता है कि रिचर्ड की मेरीग्रेंट्स स्क्रिप्ट अनुदान जानकारी प्राप्त करने का एक अच्छा तरीका है। हालाँकि, आप पहले से मौजूद उपयोगकर्ताओं के लिए उपयोगकर्ता तालिका के लिए INSERTs पर टिप्पणी करने के लिए डंप फ़ाइल को संपादित करने का भी प्रयास कर सकते हैं। पुराने सर्वर से पुनर्स्थापित dbs के लिए विशेषाधिकार तब कॉपी किया जाएगा। यदि आपने पहले से ही नए बॉक्स में बहाल किए गए कुछ डीबी के लिए विशेषाधिकारों को मैन्युअल रूप से सौंपा है, तो विशेषाधिकार फ़ाइलों में इन तालिका नामों को देखें और इन पर टिप्पणी करें। एक flush_privileges को बाद में मत भूलना। Mysql db का अच्छा विवरण: grahamwideman.com/gw/tech/mysql/perms/index.htm
nedm

जवाबों:


169

Mysql db के साथ खिलवाड़ न करें। वहाँ सिर्फ उपयोगकर्ता तालिका की तुलना में बहुत अधिक चल रहा है। आपकी सर्वश्रेष्ठ शर्त " SHOW GRANTS FOR" कमांड है। मेरे पास मेरे .bashrc (वास्तव में मेरे .bash_aliases जो स्रोत मेरे .bashrc में हैं) में बहुत सीएलआई रखरखाव उपनाम और फ़ंक्शन हैं। यह समारोह:

mygrants()
{
  mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
    ) AS query FROM mysql.user" | \
  mysql $@ | \
  sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

पहला mysql कमांड वैध SQL उत्पन्न करने के लिए SQL का उपयोग करता है जो कि दूसरी mysql कमांड पर लगाया जाता है। तब आउटपुट को सुंदर टिप्पणियों को जोड़ने के लिए sed के माध्यम से पाइप किया जाता है।

$ @ कमांड में आपको इसे कॉल करने की अनुमति मिलेगी: mygrants --host = prod-db1 --user = admin --password = secret

आप इस तरह से अपने पूर्ण यूनिक्स टूल किट का उपयोग कर सकते हैं:

mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret

यह उपयोगकर्ताओं को स्थानांतरित करने का सही तरीका है। आपका MySQL ACL शुद्ध SQL के साथ संशोधित है।


यह वास्तव में एक अच्छा बैश हेल्पर फ़ंक्शन है जो महान काम करता है। उससे आउटपुट लें और नए सर्वर पर चलने में सक्षम हों और विशेषाधिकार ठीक से और सही तरीके से दर्ज किए जाएं।
जेरेमी बोस

1
मुझे आपके फंक्शन से प्यार है, आज इसने मुझे बहुत काम दिया। शुक्रिया, शुक्रिया, शुक्रिया ...
Fabio

2
यह बहुत अच्छा है लेकिन इसका एक बड़ा दोष है। डेटाबेस नामों में एक अतिरिक्त "\" जोड़ा जाता है, इसलिए यदि आपके पास उदाहरण के लिए एक उपयोगकर्ता है, जो foo_bar नामक डेटाबेस पर विशिष्ट विशेषाधिकारों के साथ है, तो इसे foo_bar के बजाय foo \ _bar के रूप में प्रदान किया जाएगा, ताकि इसे सही तरीके से आयात न किया जाए । कम से कम, ऐसा होता है यदि आप स्क्रिप्ट से आउटपुट को SQL फ़ाइल में सहेजते हैं और फिर इसे नए सर्वर में आयात करते हैं। मैंने एक ही लाइन में निर्यात और आयात के प्रत्यक्ष पाइपिंग की कोशिश नहीं की है।
मैटियो

1
इस आज्ञा से सावधान रहें। यदि आपके पास userमेजबान के साथ एक उपयोगकर्ता तालिका है %, लेकिन तब dbतालिका में आपके पास प्रविष्टियां हैं जहां hostएक स्पष्ट मूल्य है, dbतालिका में उन प्रविष्टियों को इस पद्धति का उपयोग करके पुनर्प्राप्त नहीं किया जाता है।
मितर

1
@matteo -rफ़ंक्शन में 2 के mysql कमांड में जोड़ें और डबल एस्केप द्वारा आउटपुट नहीं होगा mysql। उदहारण:mysql -r $@
lifo

45

MySQL Instance से SQL Grants निकालने के लिए दो तरीके हैं

विधि # 1

आप Percona Toolkit से pt-show-grants का उपयोग कर सकते हैं

MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql

विधि # 2

आप pt-show-grantsनिम्नलिखित के साथ अनुकरण कर सकते हैं

MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

या तो विधि MySQL अनुदान का शुद्ध SQL डंप का उत्पादन करेगी। नया सर्वर पर स्क्रिप्ट निष्पादित करने के लिए सभी कुछ करना बाकी है:

mysql -uroot -p -A < MySQLUserGrants.sql

कोशिश करो !!!


1
pt-show-grants वही है जो आप इसके लिए चाहते हैं, यह बहुत अच्छा काम करता है।
ग्लेन प्लास

पर्कोना सिर्फ शुद्ध अजीब है।
साजास

7
लेकिन उत्तर # 2 बस के रूप में अच्छा है और अतिरिक्त सॉफ्टवेयर के बिना काम करेगा!
एसजेड

14

रिचर्ड ब्रोंस्की का जवाब मेरे लिए बेहद उपयोगी था। बहुत धन्यवाद!!!

यहाँ एक छोटी विविधता है जो मेरे लिए उपयोगी थी। यह उपयोगकर्ताओं को स्थानांतरित करने के लिए सहायक है, जैसे कि दो उबंटू इंस्टॉलेशन के बीच phpmyadmin चल रहा है। बस रूट, phpmyadmin और debian-sys-maint के अलावा सभी उपयोगकर्ताओं के लिए विशेषाधिकारों को डंप करें। कोड तो है

mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

2
यदि आप मेरे उदाहरण को देखते हैं, जहां मैं grep rails_adminयह जान सकता हूं कि हर बढ़त मामले के लिए एक विशेष कार्य किए बिना यह कैसे किया जा सकता है। mygrants --host=prod-db1 --user=admin --password=secret | grep -Ev 'root|phpmyadmin|debian-sys-maint' | mysql --host=staging-db1 --user=admin --password=secret
Grep के

7

या, percona-toolkit (पूर्व maatkit) का उपयोग करें और उस उद्देश्य के लिए pt-show-grants(या mk-show-grants) का उपयोग करें । बोझिल लिपियों और / या संग्रहीत प्रक्रियाओं की कोई आवश्यकता नहीं है।


5

आप 'mysql' डेटाबेस को mysqldump कर सकते हैं और नए पर आयात कर सकते हैं; एक flush_privileges या पुनरारंभ की आवश्यकता होगी और आप निश्चित रूप से पहले मौजूदा mysq db का बैकअप लेना चाहेंगे।

अपने मौजूदा विशेषाधिकारों को हटाने से बचने के लिए, विशेषाधिकार तालिकाओं (db, column_priv, host, func, आदि) में पंक्तियों को बदलने के बजाय जोड़ना सुनिश्चित करें।


साभार @nedm कष्टप्रद cPanel सर्वर की तरह लगता है मैं dbs बंद करने की कोशिश कर रहा हूँ db 'mysql' नहीं दिखाता है। अन्यथा मैं आपके उत्तर की जांच और पुष्टि करता। एक बार जब मुझे पता चलता है कि मैं वापस जाँच करूँगा। धन्यवाद।
गारेथ

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

आउच, हाँ, 'mysql' तक पहुंच के बिना उपयोगकर्ताओं या अनुमतियों से संबंधित कुछ भी करना मुश्किल होगा। क्या आपके पास कमांड लाइन एक्सेस है? क्या आप टर्मिनल या कमांड लाइन से mysqldump चला सकते हैं (mysql शेल से नहीं)? mysqldump -u उपयोगकर्ता नाम -ppassword mysql> mysqldump.sql
nedm

अगर मैं 'रूट' के रूप में लॉग इन करता हूं तो db 'mysql' Cpanel WHM से एक्सेस होता है। वहां से मैं phpmyadmin के एक संस्करण का उपयोग कर सकता हूं जिसमें 'mysql' डेटाबेस है जिसमें अनुमतियां हैं
Gareth

मौजूदा mysql स्कीमा में विलय, mysqldump के माध्यम से mysql स्कीमा से निकाला गया डेटा लगभग समस्याग्रस्त होना निश्चित है। आप लागू संबंधों के साथ एक जटिल स्कीमा में हेरफेर कर रहे हैं, आदि यह स्कीमा बहुत जटिल है, वास्तव में, उन्होंने इससे निपटने के लिए समर्पित SQL सिंटैक्स (GRANT, REVOKE, DROP USER, आदि) बनाए हैं। हालाँकि, आपका उद्धरण केवल INSERT विवरणों से युक्त है। मैं यहां पात्रों से बाहर चल रहा हूं। मुझे जारी रखने की आवश्यकता है?
ब्रूनो ब्रोंस्की जू

4

आप इसे एक संग्रहीत प्रक्रिया के रूप में भी कर सकते हैं:

CREATE PROCEDURE spShowGrants()
    READS SQL DATA
    COMMENT 'Show GRANT statements for users'
BEGIN
    DECLARE v VARCHAR(64) CHARACTER SET utf8;
    DECLARE c CURSOR FOR
    SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR ', user, '@', host, ';'
    ) AS query FROM mysql.user;
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
    OPEN c;
    WHILE TRUE DO
        FETCH c INTO v;
        SET @v = v;
        PREPARE stmt FROM @v;
        EXECUTE stmt;
    END WHILE;
    CLOSE c;
END

और इसके साथ बुलाओ

$ mysql -p -e "CALL spShowGrants" mysql

फिर विशेषाधिकार का बैकअप पाने के लिए रिचर्ड्स सेड कमांड के माध्यम से आउटपुट को पाइप करें।


3

जबकि यह प्रतीत होता है कि @ रिचर्ड ब्रोंस्की का उत्तर सही है, मैं एक सर्वर से दूसरे सर्वर पर डेटाबेस के एक सेट को स्थानांतरित करने की कोशिश करने के बाद इस सवाल पर आया था और समाधान बहुत सरल था:

server1$ mysqldump -u root -p --all-databases > dbdump.sql

server2$ mysql -u root -p < dbdump.sql

इस बिंदु पर, मेरा सभी डेटा दिखाई दे रहा था यदि मैं लॉग इन करता हूं root, तो mysql.userतालिका में वह सब कुछ था जो मैं उम्मीद कर रहा था, लेकिन मैं किसी भी अन्य उपयोगकर्ता के रूप में लॉग इन नहीं कर सका और यह प्रश्न पाया कि मुझे फिर से करना होगा- GRANTबयान जारी करें ।

हालाँकि, यह पता चला है कि mysql सर्वर mysql.*को प्रभावी करने के लिए तालिकाओं में अपडेट किए गए विशेषाधिकारों को फिर से शुरू करने की आवश्यकता है :

server2$ sudo restart mysql

उम्मीद है कि किसी और को प्राप्त करने में मदद करता है जो एक सरल कार्य होना चाहिए!


ओ.पी.
टॉम

2
आपको वास्तव में 'विशेषाधिकारों को अद्यतन' करने के लिए MySQLd को पुनरारंभ करने की आवश्यकता नहीं है। यह MySQL कमांड 'फ्लश विशेषाधिकारों के साथ किया जा सकता है?'
मेघवाहिनी

इस दृष्टिकोण के साथ मुद्दा यह है कि यह केवल तभी काम करता है जब स्रोत और गंतव्य MySQL संस्करण दोनों समान हों। अन्यथा आपके पास समस्याएँ हो सकती हैं क्योंकि स्रोत mysql.user तालिका में गंतव्य mysql.user तालिका की तुलना में अलग कॉलम हैं, उदाहरण के लिए।
Mitar

3

PHP स्क्रिप्ट के बारे में कैसे? :)

इस स्क्रिप्ट पर स्रोत देखें और आपके पास सूचीबद्ध सभी विशेषाधिकार होंगे:

//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";\n\n";
    }
}

2

निम्नलिखित कोड के साथ एक शेल स्क्रिप्ट फ़ाइल बनाएं:

############################################## 3
echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", host, \"';\") AS query FROM mysql.user; " >   script.sql    
echo "*** You will be asked to enter the root password twice ******"    
mysql -u root -p  < script.sql > output.sql ;    
cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
mysql -u root -p  < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"    
cat  output.sql ; rm  output.sql   output1.sql -f    
echo "-------------------------"
rm  script.sql -f
#

**** फिर इसे इस तरह शेल पर चलाएँ: आपको दो बार रूट पासवर्ड दर्ज करने के लिए कहा जाएगा और फिर स्क्रीन पर GRANTS SQL प्रदर्शित होगा। ***


0

एक-लाइनर कमाल के रूप में बहुत ज्यादा कर रहा है pt-show-grants:

mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'

केवल यूनिक्स उपकरणों के आधार पर, किसी अतिरिक्त सॉफ़्टवेयर की आवश्यकता नहीं है।

बैश शेल के भीतर से निष्पादित करें, मान लें कि आपके पास एक ऐसा काम है .my.cnfजहां आपके mysql rootउपयोगकर्ता का पासवर्ड पढ़ा जा सकता है।


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