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


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

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

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

नया सर्वर: 5.0.51 ए -24 + लेनी 1

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

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

किसी को भी 'mysql' डेटाबेस विलय करने का एक शानदार तरीका मिला है?


80
2018-05-16 06:08


मूल


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


जवाब:


MySQL डीबी के साथ गड़बड़ मत करो। केवल उपयोगकर्ता तालिका की तुलना में वहां बहुत कुछ चल रहा है। आपकी सबसे अच्छी शर्त है "अनुदान दिखाओ "कमांड के लिए। मेरे पास मेरे .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 एसीएल शुद्ध एसक्यूएल के साथ संशोधित है।


165
2018-05-27 15:51



यह वास्तव में एक अच्छा बाश सहायक समारोह है जो बहुत अच्छा काम करता है। उस से आउटपुट लें और नए सर्वर पर चलाने में सक्षम हो जाएं और विशेषाधिकार सही ढंग से और सटीक रूप से दर्ज किए जाएंगे। - Jeremy Bouse
मुझे आपके काम से प्यार है, आज उसने मुझे बहुत काम बचाया। धन्यवाद धन्यवाद धन्यवाद... - Fabio
यह बहुत अच्छा है लेकिन इसमें एक बड़ी गड़बड़ी है। डेटाबेस नामों में अंडरस्कोर में एक अतिरिक्त "\" जोड़ा जाता है, इसलिए यदि आपके पास उदाहरण के लिए foo_bar नामक डेटाबेस पर विशिष्ट विशेषाधिकार वाले उपयोगकर्ता हैं, तो इसे foo_bar के बजाय foo \ _bar के रूप में प्रस्तुत किया जाएगा, ताकि इसे सही तरीके से आयात नहीं किया जा सके । कम से कम, ऐसा होता है यदि आप आउटपुट को स्क्रिप्ट से SQL फ़ाइल में सहेजते हैं और फिर इसे नए सर्वर में आयात करते हैं। मैंने एक लाइन में निर्यात और आयात की प्रत्यक्ष पाइपिंग की कोशिश नहीं की है। - matteo
इस आदेश से सावधान रहें। यदि आपके पास है user मेजबान के साथ एक उपयोगकर्ता टेबल %, लेकिन फिर में db तालिका में आपके पास प्रविष्टियां हैं host एक स्पष्ट मूल्य है, उन प्रविष्टियों में db तालिका को इस विधि का उपयोग करके पुनर्प्राप्त नहीं किया गया है। - Mitar
@matteo जोड़ें -r समारोह में दूसरे mysql कमांड के लिए और डबल एस्केप आउटपुट नहीं होंगे mysql। उदाहरण के लिए: mysql -r $@ - lifo


एक MySQL इंस्टेंस से SQL अनुदान निकालने के लिए दो विधियां हैं

विधि # 1

आप उपयोग कर सकते हैं pt शो-अनुदान पेर्कोना टूलकिट से

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 अनुदान के एक शुद्ध एसक्यूएल डंप का उत्पादन करेगा। एक नए सर्वर पर स्क्रिप्ट निष्पादित करने के लिए बाकी सब कुछ है:

mysql -uroot -p -A < MySQLUserGrants.sql

कोशिश करो !!!


40
2018-06-18 18:24



पीटी-शो-अनुदान वास्तव में आप इसके लिए क्या चाहते हैं, यह बहुत अच्छा काम करता है। - Glenn Plas
पेर्कोना सिर्फ शुद्ध उत्कृष्टता है। - sjas
लेकिन उत्तर # 2 उतना ही अच्छा है और अतिरिक्त सॉफ्टवेयर के बिना काम करेगा! - sjas


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

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

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;}'
}

14
2017-09-02 20:27



इस "कोई ब्रेनर" सुधार के लिए धन्यवाद। :) - ThorstenS
यदि आप मेरा उदाहरण देखते हैं जहां मैं हूं grep rails_admin आप अनुमान लगा सकते हैं कि हर किनारे के मामले के लिए विशेष कार्य किए बिना इसे कैसे किया जाए। Grep के "इनवर्टर-मैच" विकल्प का उपयोग करें जैसे: mygrants --host=prod-db1 --user=admin --password=secret | grep -Ev 'root|phpmyadmin|debian-sys-maint' | mysql --host=staging-db1 --user=admin --password=secret - Bruno Bronosky


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


6
2018-05-01 12:08





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

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


5
2018-05-16 06:24



धन्यवाद @nedm। ऐसा लगता है कि कष्टप्रद सीपीनल सर्वर की तरह मैं डीबीएस बंद करने की कोशिश कर रहा हूं, डीबी 'mysql' नहीं दिखाता है। अन्यथा मैं आपके जवाब का परीक्षण और पुष्टि करूंगा। एक बार जब मैं इसे समझूं तो मैं वापस देखूंगा। धन्यवाद। - Gareth
यह दुर्भाग्यपूर्ण लेकिन समझा जा सकता है, आपको शायद किसी भी डेटाबेस तक पहुंचने से रोका जा सकता है, लेकिन सीधे आपके उपयोगकर्ता द्वारा साझा डीबी पर स्वामित्व वाले लोग। - Dave Cheney
ओह, हाँ, 'mysql' तक पहुंच के बिना उपयोगकर्ताओं या अनुमतियों से संबंधित कुछ भी करना मुश्किल होगा। क्या आपके पास कमांड लाइन एक्सेस है? क्या आप टर्मिनल या कमांड लाइन से mysqldump चला सकते हैं (MySQL शेल से नहीं)? mysqldump -u उपयोगकर्ता नाम-ppassword mysql> mysqldump.sql - nedm
अगर मैं 'रूट' के रूप में लॉग इन करता हूं तो डीबी 'mysql' सीपीएनल डब्लूएमएम से सुलभ था। वहां से मैं phpmyadmin के एक संस्करण तक पहुंच सकता हूं जिसमें 'mysql' डेटाबेस है जिसमें अनुमतियां हैं - Gareth
एक मौजूदा mysql स्कीमा में विलय, mysqldump के माध्यम से एक mysql स्कीमा से निकाला गया डेटा लगभग समस्याग्रस्त होने के लिए निश्चित है। आप लागू रिश्तों के साथ एक जटिल स्कीमा में हेरफेर कर रहे हैं, आदि। यह स्कीमा वास्तव में जटिल है, वास्तव में, उन्होंने इसे समर्पित करने के लिए समर्पित एसक्यूएल सिंटैक्स (अनुदान, रीवॉक, ड्रोप यूजर इत्यादि) बनाया है। हालांकि, आपके निकालने में केवल INSERT बयान शामिल हैं। मैं यहाँ पात्रों से बाहर चला रहा हूँ। मुझे जारी रखने की ज़रूरत है? - Bruno Bronosky


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

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

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


4
2018-05-09 22:05





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

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

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


3
2017-09-03 01:16



ओह, और मेरी स्थिति ओपी के लिए थोड़ा अलग थी, जिसमें मैं मौजूदा डेटाबेस / उपयोगकर्ताओं के साथ एक सर्वर में डंप मर्ज करने की कोशिश नहीं कर रहा था। - Tom
आपको वास्तव में 'विशेषाधिकार अपडेट करने' के लिए MySQLd को पुनरारंभ करना नहीं है। यह MySQL कमांड 'फ्लश विशेषाधिकारों' के साथ किया जा सकता है; - CloudWeavers
इस दृष्टिकोण के साथ मुद्दा यह है कि यह केवल तब काम करता है जब स्रोत और गंतव्य दोनों MySQL संस्करण समान होते हैं। अन्यथा आपको समस्या हो सकती है क्योंकि उदाहरण mysql.user तालिका में mysql.user तालिका गंतव्य से भिन्न कॉलम हैं, उदाहरण के लिए। - Mitar


एक 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";
    }
}

3
2018-05-03 18:11





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

############################################## 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 स्क्रीन पर प्रदर्शित किया जाएगा। ****


2
2017-09-06 23:03