আমি কীভাবে মাইএসকিউএল থেকে সুবিধাগুলি রফতানি করব এবং তারপরে নতুন সার্ভারে আমদানি করব?


88

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

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

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

নতুন সার্ভার: 5.0.51a-24 + লেন্নি 1

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

আমি phpMyAdmin ব্যবহার করে সরাসরি 'আমদানি' চেষ্টা করেছি এবং একটি সদৃশ (যা আমি ইতিমধ্যে ম্যানুয়ালি স্থানান্তরিত করেছি) সম্পর্কিত একটি ত্রুটি দিয়ে শেষ করেছি with

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


1. আপনার কি পিএইচপিএমইএইডমিন ব্যবহার করা দরকার? যদি তা হয় তবে আমি আপনার জন্য কিছু পিএইচপিএমআইএডমিন নির্দিষ্ট নির্দেশাবলী লিখব। ২. পিএইচপিএমআইএডমিন থেকে যদি আপনি "মাইএসকিএল। ব্যবহারকারীর সীমা 1 থেকে নির্বাচন করুন" চেষ্টা করেন; আপনি ফলাফল বা একটি ত্রুটি পেতে
ব্রুনো ব্রোনোস্কি

1
যেমন আমি নীচে উল্লেখ করেছি, আমি মনে করি রিচার্ডের মাইগ্রান্টস স্ক্রিপ্টটি অনুদানের তথ্য পাওয়ার একটি ভাল উপায়। তবে ইতিমধ্যে বিদ্যমান ব্যবহারকারীদের জন্য ব্যবহারকারী সারণিতে INSERT গুলি মন্তব্য করার জন্য আপনি ডাম্প ফাইলটি সম্পাদনা করার চেষ্টা করতে পারেন। পুরানো সার্ভার থেকে পুনরুদ্ধার করা ডিবিএসের সুবিধাগুলি অনুলিপি করা হবে। আপনি যদি নতুন বাক্সে পুনরুদ্ধার করেছেন এমন কিছু ডিবিএসের জন্য যদি আপনি ইতিমধ্যে ম্যানুয়ালি বিশেষাধিকার অর্পণ করেছেন, তবে সুবিধাবঞ্চিত ফাইলগুলিতে এই টেবিলের নামগুলি সন্ধান করুন এবং এগুলিও মন্তব্য করুন। পরে কোনও ফ্লাশ_প্রাইভিলিজগুলি ভুলে যাবেন না। মাইএসকিএল
গিগা

উত্তর:


169

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

কমান্ডের $ @ আপনাকে এটিকে কল করার অনুমতি দেবে: মাইগ্র্যান্টস - হোস্ট = প্রোড-ডিবি 1 - ইউজার = অ্যাডমিন - পাসওয়ার্ড = গোপন

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

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

এটি ব্যবহারকারীদের সরানোর সঠিক উপায় to আপনার মাইএসকিউএল এসিএল খাঁটি এসকিউএল দিয়ে সংশোধিত হয়েছে।


এটি আসলে একটি দুর্দান্ত বাশ সহায়ক ফাংশন যা দুর্দান্ত কাজ করে। এটি থেকে আউটপুট নিন এবং নতুন সার্ভারে চালাতে সক্ষম হবেন এবং সুযোগগুলি সঠিকভাবে এবং নির্ভুলভাবে প্রবেশ করা হবে।
জেরেমি বাউস

1
আমি আপনার ফাংশন পছন্দ করি, আজ এটি আমাকে অনেক কাজ বাঁচিয়েছে। আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ, ধন্যবাদ ...
Fabio

2
এটি দুর্দান্ত তবে এর একটি বড় ত্রুটি রয়েছে। ডাটাবেসের নামগুলিতে আন্ডারস্কোরগুলিতে একটি অতিরিক্ত "\" যুক্ত করা হয়, সুতরাং আপনার যদি উদাহরণস্বরূপ foo_bar নামক একটি ডাটাবেসে নির্দিষ্ট সুযোগ সুবিধাযুক্ত ব্যবহারকারী থাকে তবে এটি foo_bar এর পরিবর্তে foo \ _bar হিসাবে রেন্ডার করা হবে, যাতে এটি সঠিকভাবে আমদানি করা হবে না । কমপক্ষে, আপনি যদি স্ক্রিপ্ট থেকে আউটপুটটি কোনও এসকিউএল ফাইলে সংরক্ষণ করেন এবং তারপরে এটি নতুন সার্ভারে আমদানি করেন তবে এটি ঘটে। আমি এক লাইনে রফতানি এবং আমদানির সরাসরি পাইপিং চেষ্টা করি নি।
মাত্তিও

1
এই আদেশ সতর্কতা অবলম্বন করুন। আপনার যদি userটেবিলে হোস্ট সহ কোনও ব্যবহারকারী থাকে %তবে dbটেবিলে আপনার প্রবেশিকা থাকে যেখানে hostএকটি স্পষ্ট মান থাকে, dbসারণিতে থাকা এন্ট্রিগুলি এই পদ্ধতিটি ব্যবহার করে পুনরুদ্ধার করা হবে না।
মিতার

1
@ ম্যাটটিও ফাংশনে -rদ্বিতীয় মাইএসকিএল কমান্ডে যুক্ত করুন এবং ডাবল পলায়নগুলি আউটপুট হবে না mysql। যেমন:mysql -r $@
লাইফো

45

একটি মাইএসকিউএল ইনস্ট্যান্স থেকে এসকিউএল অনুদান আহরণের জন্য দুটি পদ্ধতি রয়েছে

পদ্ধতি # 1

আপনি পারকোনা টুলকিট থেকে পিটি-শো-অনুদানগুলি ব্যবহার করতে পারেন

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 -uroot -p -A < MySQLUserGrants.sql

একবার চেষ্টা করে দেখো !!!


1
পিটি-শো-অনুদানগুলি হ'ল এটির জন্য আপনি যা চান, এটি দুর্দান্ত কাজ করে।
গ্লেন প্লাস

পারকোনা খাঁটি দুর্দান্ততা।
sjas

7
তবে উত্তর # 2 ঠিক তত ভাল এবং অতিরিক্ত সফ্টওয়্যার ছাড়াই কাজ করবে!
sjas

14

রিচার্ড ব্রোনোস্কির উত্তরটি আমার পক্ষে অত্যন্ত কার্যকর ছিল। অনেক ধন্যবাদ!!!

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

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
গ্রেপের

7

অথবা, পারকোনা-টুলকিট (প্রাক্তন ম্যাটকিট) ব্যবহার করুন এবং সেই উদ্দেশ্যে ব্যবহার করুন pt-show-grants(বা mk-show-grants)। জটিল স্ক্রিপ্ট এবং / অথবা সঞ্চিত পদ্ধতির প্রয়োজন নেই।


5

আপনি 'মাইএসকিএল' ডাটাবেসটি মাইএসকিএলডাম্প করতে পারেন এবং নতুনটিতে আমদানি করতে পারেন; একটি ফ্লাশ_প্রাইভিলিজ বা পুনঃসূচনা প্রয়োজন হবে এবং আপনি অবশ্যই বিদ্যমান ম্যাসকিউ ডিবি প্রথমে ব্যাক আপ করতে চাইবেন।

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


ধন্যবাদ @ আনডম বিরক্তিকর সিপ্যানেল সার্ভারের মতো দেখে মনে হচ্ছে আমি ডিবিএস বন্ধ করার চেষ্টা করছি ডিবি 'মাইএসকিএল' প্রদর্শন করে না। অন্যথায় আমি আপনার উত্তরটি পরীক্ষা করে নিশ্চিত করি একবার আমি বুঝতে পারি যে আমি আবার চেক করব। ধন্যবাদ।
গ্যারেথ

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

হ্যাঁ, 'মাইএসকিএল' অ্যাক্সেস না করে ব্যবহারকারী বা অনুমতি সম্পর্কিত কোনও কাজ করা কঠিন হবে। আপনার কি কমান্ড লাইন অ্যাক্সেস আছে? আপনি কি টার্মিনাল বা কমান্ড লাইন (মাইএসকিএল শেল থেকে নয়) থেকে মাইএসকিএলডাম্প চালাতে পারবেন? mysqldump -u ব্যবহারকারীর নাম -পাসওয়ার্ড mysql> mysqldump.sql
নেডম

আমি 'রুট' হিসাবে লগ ইন করলে ডিবি 'মাইএসকিএল' সিপানেল ডাব্লুএম থেকে অ্যাক্সেসযোগ্য ছিল। সেখান থেকে আমি phpmyadmin এর একটি সংস্করণ অ্যাক্সেস করতে পারি যার কাছে 'mysql' ডাটাবেস রয়েছে যার অনুমতি রয়েছে
গ্যারেথ

বিদ্যমান মাইএসকিএল স্কিমাতে মার্জ করা, মাইএসকিএলডাম্পের মাধ্যমে একটি মাইএসকিএল স্কিমা থেকে প্রাপ্ত ডেটা প্রায় সমস্যাযুক্ত বলে নিশ্চিত। আপনি বলপূর্বক সম্পর্ক ইত্যাদির সাথে একটি জটিল স্কিমা পরিচালনা করছেন This আপনার এক্সট্রাক্টটিতে কেবল ইনসার্ট স্টেটমেন্ট রয়েছে। আমি এখানে চরিত্রের বাইরে চলেছি। আমি কি চালিয়ে যেতে চাই?
ব্রুনো ব্রোনোস্কি

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টেবিলটিতে যা ছিল তার সবই প্রত্যাশা ছিলাম, তবে আমি অন্য কোনও ব্যবহারকারী হিসাবে লগ ইন করতে পারিনি এবং এই প্রশ্নটি অনুমান করে আমি পুনরায় করতে হবে to GRANTবিবৃতি জারি করুন

তবে, এটি দেখা যাচ্ছে যে mysql.*টেবিলগুলিতে কার্যকর হওয়া কার্যকর করার জন্য মাইএসকিএল সার্ভারটি কেবল পুনরায় চালু করা দরকার:

server2$ sudo restart mysql

আশা করি এটি অন্য কারও পক্ষে অর্জন করতে সহায়তা করে যা সাধারণ কাজটি হওয়া উচিত!


ওহ, এবং আমার পরিস্থিতি ওপি-র থেকে কিছুটা আলাদা ছিল, এটিতে আমি বিদ্যমান ডাটাবেস / ব্যবহারকারীদের সাথে একটি সার্ভারে একটি ডাম্প মার্জ করার চেষ্টা করছিলাম না।
টম

2
'সুবিধাগুলি আপডেট করতে' আপনাকে আসলে মাইএসকিউএলডি পুনরায় চালু করতে হবে না। এটি মাইএসকিউএল কমান্ড 'ফ্লাশ সুবিধাগুলি' দিয়ে করা যেতে পারে;
ক্লাউডওয়েভার্স 3'12

এই পদ্ধতির সমস্যাটি হ'ল এটি কেবল তখনই কাজ করে যখন উত্স এবং গন্তব্য মাইএসকিউএল সংস্করণ উভয়ই সমান হয়। অন্যথায় আপনার সমস্যা হতে পারে কারণ উত্স mysql.user টেবিলটিতে গন্তব্য mysql.user টেবিলের চেয়ে আলাদা কলাম রয়েছে।
মিতর

3

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

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

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

**** তারপরে এটি শেলটিতে এটি চালান: আপনাকে দুবার রুট পাসওয়ার্ড লিখতে বলা হবে এবং তারপরে গ্রান্টস এসকিউএল স্ক্রিনে প্রদর্শিত হবে * ****


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.