প্রশ্ন আমি কিভাবে MySQL থেকে বিশেষাধিকার এক্সপোর্ট করতে এবং তারপরে একটি নতুন সার্ভারে আমদানি করতে পারি?


আমি mysqldump ব্যবহার করে ডাটাবেসগুলি রপ্তানি / আমদানি করতে জানি এবং এটি ঠিক আছে তবে নতুন সার্ভারে আমি কীভাবে সুবিধাগুলি পেতে পারি।

অতিরিক্ত পয়েন্টের জন্য, নতুন একটিতে ইতিমধ্যে কয়েকটি বিদ্যমান ডেটাবেস রয়েছে, আমি কীভাবে বর্তমানের দম্পতিকে ছাড়াই পুরানো সার্ভারের সুবিধাগুলি আমদানি করব।

পুরানো সার্ভার: 5.0.67-সম্প্রদায়

নতুন সার্ভার: 5.0.51a-24 + lenny1

সম্পাদন করুন: আমি পুরানো সার্ভার থেকে ডিবি 'মাইএসএলএল' এর একটি ডাম্প পেয়েছি এবং এখন নতুন সার্ভারে 'মাইস্কুল' ডিবিতে মার্জ করার সঠিক উপায় জানতে চাই।

আমি phpMyAdmin ব্যবহার করে একটি সরাসরি 'আমদানি' চেষ্টা করেছি এবং একটি অনুরূপ সম্পর্কিত একটি ত্রুটি নিয়ে শেষ হয়ে গেছি (যেটি আমি নিজে থেকেই স্থানান্তরিত করেছি)।

কেউ কি 'মাইএসকিউএল' ডাটাবেসের মার্জ করার একটি মার্জিত উপায় পেয়েছে?


80
2018-05-16 06:08


উত্স


পিএইচপিএমআইএডমিন ব্যবহার করার জন্য এটি কি আপনার প্রয়োজন? এটি যদি আমি আপনার জন্য কিছু PHPMyAdmin নির্দিষ্ট নির্দেশাবলী লিখতে হবে। 2. পিএইচপিএমআইএডমিন থেকে যদি আপনি "mysql.user সীমা থেকে 1 টি" বেছে নেওয়ার চেষ্টা করেন; " আপনি ফলাফল বা একটি ত্রুটি পেতে। - Bruno Bronosky
আমি নীচের উল্লেখ হিসাবে, আমি মনে করি রিচার্ড এর mygrants স্ক্রিপ্ট অনুদান তথ্য পেতে একটি ভাল উপায়। যাইহোক, আপনি ইতিমধ্যে উপস্থিত থাকা ব্যবহারকারীদের জন্য ব্যবহারকারী সারণিতে INSERTs মন্তব্য করতে ডাম্প ফাইল সম্পাদনা করার চেষ্টা করতে পারেন। পুরানো সার্ভার থেকে পুনঃস্থাপিত dbs জন্য বিশেষাধিকার তারপর কপি করা হবে। আপনি যদি নতুন বক্সে পুনঃস্থাপিত কিছু ডিবিএসের জন্য নিজে থেকেই সংস্থানগুলি হস্তান্তর করেছেন তবে বিশেষাধিকার ফাইলগুলির মধ্যে এই টেবিলের নামগুলি সন্ধান করুন এবং এগুলিও মন্তব্য করুন। পরে flush_privileges ভুলবেন না। মাইএসকিউএল ডিবি এর ভাল বর্ণনা এখানে: grahamwideman.com/gw/tech/mysql/perms/index.htm - nedm
যে লিঙ্ক মহান তথ্য, ধন্যবাদ। ভুক্ত। - Bruno Bronosky


উত্তর:


MySQL ডিবি সঙ্গে জগাখিচুড়ি না। শুধু ব্যবহারকারী টেবিল চেয়ে আরো অনেক কিছু যাচ্ছে। আপনার সেরা বাজি "গ্রান্ট দেখান "কমান্ডের জন্য। আমার অনেকগুলি CLI রক্ষণাবেক্ষণ উপনাম এবং আমার .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 ব্যবহার করে। আউটপুট তারপর বেশ মন্তব্য যোগ করতে sed ​​মাধ্যমে পাইপ করা হয়।

$ @ কমান্ডটি আপনাকে এটিকে কল করার অনুমতি দেবে: mygrants --host = prod-db1 --user = অ্যাডমিন - পাসওয়ার্ড = গোপন

আপনি এভাবে আপনার সম্পূর্ণ ইউনিক্স সরঞ্জাম কিট ব্যবহার করতে পারেন:

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

এটি ব্যবহারকারীদের সরানোর সঠিক উপায়। আপনার MySQL ACL বিশুদ্ধ এসকিউএল সঙ্গে সংশোধন করা হয়।


165
2018-05-27 15:51



এই আসলে একটি চমৎকার bash সাহায্যকারী ফাংশন যে মহান কাজ করে। তার থেকে আউটপুট নিন এবং নতুন সার্ভারে চালানোর জন্য সক্ষম হবেন এবং সুবিধা সঠিকভাবে এবং সঠিকভাবে প্রবেশ করা হবে। - Jeremy Bouse
আমি আপনার ফাংশন ভালোবাসি, আজ এটি আমাকে অনেক কাজ বাঁচিয়েছে। আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ... - Fabio
এই মহান কিন্তু এটি একটি বড় ত্রুটি আছে। একটি অতিরিক্ত "\" ডাটাবেসের নামগুলিতে আন্ডারস্কোরগুলিতে যুক্ত করা হয়, তাই উদাহরণস্বরূপ, যদি আপনার কোনও ব্যবহারকারীর বিশেষাধিকার থাকে foo_bar নামক ডাটাবেসের উপর, তবে এটি foo_bar এর পরিবর্তে foo \ _bar হিসাবে উপস্থাপিত হবে, যাতে এটি সঠিকভাবে আমদানি করা হবে না । অন্তত, এটি যদি আপনি স্ক্রিপ্ট থেকে আউটপুটটি একটি SQL ফাইলে সংরক্ষণ করেন এবং তারপরে নতুন সার্ভারে এটি আমদানি করেন। আমি একক লাইনের রপ্তানি ও আমদানি সরাসরি পাইপিংয়ের চেষ্টা করিনি। - matteo
এই কমান্ড সঙ্গে সতর্ক থাকুন। যদি আপনি আছে user হোস্ট সঙ্গে একটি ব্যবহারকারী টেবিল %, কিন্তু তারপর db টেবিল আপনি যেখানে এন্ট্রি আছে host একটি স্পষ্ট মান, যারা এন্ট্রি dbটেবিল এই পদ্ধতি ব্যবহার করে পুনরুদ্ধার করা হয় না। - Mitar
@ ম্যাটটোও যোগ করুন -r ফাংশনে দ্বিতীয় MySQL কমান্ড এবং দ্বিগুণ escapes দ্বারা আউটপুট হবে না mysql। উদাহরণ: mysql -r $@ - lifo


একটি MySQL ইনস্ট্যান্স থেকে এসকিউএল অনুদান নিষ্কাশন জন্য দুটি পদ্ধতি আছে

পদ্ধতি # 1

তুমি ব্যবহার করতে পার Pt-প্রদর্শনী-অনুদান Percona টুলকিট থেকে

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
Percona শুধু বিশুদ্ধ মহিমান্বিত হয়। - sjas
কিন্তু উত্তর # 2 ঠিক যেমন ভাল এবং অতিরিক্ত সফ্টওয়্যার ছাড়া কাজ করবে! - sjas


রিচার্ড Bronosky এর উত্তর আমার জন্য অত্যন্ত দরকারী ছিল। অনেক ধন্যবাদ!!!

এখানে একটি ছোট পরিবর্তন যা আমার জন্য দরকারী ছিল। এটি ব্যবহারকারীদের স্থানান্তর করার জন্য সহায়ক। দুই উবুন্টু ইনস্টলেশনের মধ্যে phpmyadmin চলমান। রুট, phpmyadmin এবং ডেবিয়ান-সিএসএস-রক্ষণাবেক্ষণ ব্যতীত সমস্ত ব্যবহারকারীদের জন্য শুধু ডাম্প সুবিধাগুলি। তারপর কোড

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



এই "কোন brainer" উন্নতির জন্য ধন্যবাদ। :) - ThorstenS
যদি আপনি আমার উদাহরণ তাকান যেখানে আমি grep rails_admin আপনি প্রতিটি প্রান্ত ক্ষেত্রে জন্য একটি বিশেষ ফাংশন না করে এটি করতে কিভাবে অনুমান করতে পারেন। Grep এর "invert-match" বিকল্পটি ব্যবহার করুন: 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- টুলকিট (প্রাক্তন maatkit) ব্যবহার এবং ব্যবহার pt-show-grants (অথবা mk-show-grants) যে উদ্দেশ্যে. কষ্টকর স্ক্রিপ্ট এবং / বা সংরক্ষিত পদ্ধতির জন্য কোন প্রয়োজন নেই।


6
2018-05-01 12:08





আপনি 'mysql' ডাটাবেস MySQLldump এবং নতুন এক থেকে আমদানি করতে পারেন; একটি flush_privileges বা পুনঃসূচনা প্রয়োজন হবে এবং আপনি স্পষ্টভাবে বিদ্যমান MySQL ডিবি প্রথম ব্যাক আপ করতে চান।

আপনার বিদ্যমান বিশেষাধিকারগুলি এড়াতে এড়াতে বিশেষাধিকার টেবিলের সারিগুলি প্রতিস্থাপনের পরিবর্তে যোগ করা নিশ্চিত করুন (ডিবি, কলাম_প্রিভ, হোস্ট, func, ইত্যাদি)।


5
2018-05-16 06:24



ধন্যবাদ @nedm। বিরক্তিকর cPanel সার্ভারের মত মনে হচ্ছে আমি ডিবি বন্ধ করার চেষ্টা করছি ডিবি 'mysql' দেখানো হয় না। অন্যথায় আমি পরীক্ষা এবং আপনার উত্তর নিশ্চিত করব। একবার আমি চিন্তা যে আমি ফিরে চেক করব। ধন্যবাদ। - Gareth
এটি দুর্ভাগ্যজনক কিন্তু বোধগম্য, সম্ভবত আপনি কোন ডেটাবেস অ্যাক্সেস করা থেকে বিরত থাকবেন তবে সরাসরি ভাগ করা ডিবিতে আপনার ব্যবহারকারীর মালিকানাধীন। - Dave Cheney
ওহ, হ্যাঁ, 'mysql' অ্যাক্সেস ছাড়া ব্যবহারকারীদের বা অনুমতি সম্পর্কিত কিছু করা কঠিন হবে। আপনি কমান্ড লাইন অ্যাক্সেস আছে? আপনি কি mysqldump টার্মিনাল বা কমান্ড লাইন থেকে (মাইএসকিউএল শেল থেকে নয়) চালাতে পারেন? mysqldump -u ব্যবহারকারীর নাম -ppassword mysql> mysqldump.sql - nedm
আমি 'root' হিসাবে লগ ইন করলে ডিপি 'মাইস্কএল' সিপ্যানেল হুইলএম থেকে অ্যাক্সেসযোগ্য ছিল। সেখানে থেকে আমি phpmyadmin একটি সংস্করণ অ্যাক্সেস করতে পারেন যার অনুমতি আছে 'MySQL' ডাটাবেস - Gareth
একটি বিদ্যমান MySQL স্কিমাতে মার্জ করা, mysqldump এর মাধ্যমে একটি mysql স্কিমা থেকে প্রাপ্ত তথ্য প্রায় সমস্যাযুক্ত হতে প্রায় নিশ্চিত। আপনি জোরপূর্বক সম্পর্ক সহ একটি জটিল স্কিমা ম্যানিপুলিউটিং করছেন ইত্যাদি। এই স্কিমাটি এত জটিল, আসলে, তারা এটির সাথে মোকাবিলা করার জন্য ডেডিকেটেড SQL সিনট্যাক্স (গ্রান্ট, রিভোক, ড্রপ ব্যবহারকারী, ইত্যাদি) তৈরি করেছে। আপনার নিষ্কাশন, তবে, শুধুমাত্র 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

তারপরে বিশেষাধিকারগুলির ব্যাকআপ পেতে রিচার্ডস কমান্ডের মাধ্যমে আউটপুট পাইপ করুন।


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.* টেবিল কার্যকর করা:

server2$ sudo restart mysql

আশা করি যে কেউ সহজ কাজ করা উচিত অন্য কেউ সাহায্য!


3
2017-09-03 01:16



ওহ, এবং আমার পরিস্থিতি অপেক্ষাকৃত ছোট ছিল, অপারেটিং সিস্টেমের সাথে আমি সার্ভারে একটি ডাম্প মার্জ করার চেষ্টা করিনি। - Tom
আপনি 'মাইক্রোসফট আপডেট' করার জন্য MySQLd পুনরায় চালু করতে হবে না। এটি মাইএসকিউএল কমান্ডের 'ফ্লাশ সুবিধাগুলির সাথে সম্পন্ন করা যেতে পারে;' - CloudWeavers
এই পদ্ধতির সাথে সমস্যাটি কেবল তখনই কাজ করে যখন উভয় উত্স এবং গন্তব্য মাইএসকিউএল সংস্করণ একই। অন্যথায় আপনার সমস্যা থাকতে পারে কারণ উৎস mysql.user টেবিলে গন্তব্য mysql.user টেবিলের চেয়ে বিভিন্ন কলাম রয়েছে, উদাহরণস্বরূপ। - Mitar


কিভাবে একটি পিএইচপি স্ক্রিপ্ট সম্পর্কে? :)

এই স্ক্রিপ্টটিতে উৎসটি দেখুন এবং আপনার সমস্ত তালিকা তালিকাভুক্ত থাকবে:

//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





এক liner চমত্কার হিসাবে বেশ অনেক একই করছেন 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'

ইউনিক্স সরঞ্জাম শুধুমাত্র উপর ভিত্তি করে, কোন অতিরিক্ত সফটওয়্যার প্রয়োজন।

একটি bash শেল মধ্যে থেকে সঞ্চালিত, আপনি একটি কাজ আছে অনুমিত .my.cnf যেখানে আপনার পাসওয়ার্ড mysql root ব্যবহারকারী পড়তে পারেন।


0
2018-04-13 18:33



আমি অর্ধেক বছর পরে ফিরে আসার পর @ রালআল্যান্ডিস্কাল্লাব্বার পোস্টের অর্ধেক সদৃশ, আমি বুঝতে পেরেছি। - sjas