মাইআইএসএএম থেকে সমস্ত টেবিলকে ইনোডিবিতে কীভাবে রূপান্তর করবেন?


264

আমি জানি আমি মাইআইএসএএম থেকে ইনোডিবিতে টেবিল স্টোরেজটি পরিবর্তন করতে স্বতন্ত্রভাবে একটি পরিবর্তনের টেবিল জারি করতে পারি।

আমি ভাবছি যে তাদের সমস্তকেই দ্রুত InnoDB এ পরিবর্তন করার কোনও উপায় আছে কি?


1
রূপান্তর সম্পর্কিত টিপস
রিক জেমস

উত্তর:


173
<?php
    // connect your database here first 
    // 

    // Actual code starts here 

    $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'your_database_name' 
        AND ENGINE = 'MyISAM'";

    $rs = mysql_query($sql);

    while($row = mysql_fetch_array($rs))
    {
        $tbl = $row[0];
        $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
        mysql_query($sql);
    }
?>

5
আপনি যে ডাটাবেসে ফোকাস করছেন সেটি সীমাবদ্ধ করা সম্ভবত ভাল। একটি "এবং টেবিলেএসএইচএমইএ = 'ডিবি নাম' যুক্ত করুন, অন্যথায় এটি সমস্ত ইন্টারনেট মাইএসকিউএল টেবিলগুলিকেও ইনডোডে বদলে দিতে পারে (যখন তাদের কয়েকটি স্মৃতি হওয়া উচিত)
নুডলস

7
পিএইচপি-র mysql_*ইন্টারফেসটি ver নম্বর ভার্সন থেকে অবচিত ও সরানো হয়েছে। এই কোডটি যেমন ব্যবহার করবেন না।
রিক জেমস

4
@ গজেন্দ্রবাং - হ্যাঁ, উত্তরটি যখন উপস্থাপন করা হবে তখন বৈধ হিসাবে। তবে নতুনদের ক্ষেত্রে এটি আর বৈধ নয়। আমার উদ্দেশ্যটি হ'ল এটি ব্যবহারের বিরুদ্ধে সতর্ক করা
রিক জেমস

1
প্রশ্নটিতে পিএইচপি-র কোনও উল্লেখ নেই
phil294

1
সাম্প্রতিকতম সম্পাদনাটি কীভাবে পতাকাঙ্কিত হয় না? মাইএসকিউএল অংশটি উইল জোনসের উত্তরের সরাসরি অনুলিপি। প্রতিটি সম্পাদনার ইতিহাস দেখুন এটি উইলের উত্তরটি ২০১৩ সালে প্রকাশিত হয়েছিল এবং এই উত্তরটি ২০১২ সালে প্রকাশিত হয়েছিল a ফলস্বরূপ, এই প্রশ্নের নিখরচায়তা আপস করা হয়েছে।
rmutalik

549

আপনার ডাটাবেসে সমস্ত মাইআইএসএএম টেবিলগুলি পুনরুদ্ধার করতে এই এসকিউএল স্টেটমেন্টটি (মাইএসকিউএল ক্লায়েন্ট, পিএইচপিএমইএডমিন বা অন্য যে কোনও জায়গায়) চালান।

name_of_your_dbআপনার ডাটাবেসের নামের সাথে ভেরিয়েবলের মান প্রতিস্থাপন করুন ।

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

তারপরে, আউটপুটটি অনুলিপি করুন এবং একটি নতুন এসকিউএল কোয়েরি হিসাবে চালান।


4
যে দুর্দান্ত কাজ! আমি এখানে এটি একটি উদাহরণ শেল স্ক্রিপ্টে রেখেছি: shrubbery.mynetgear.net/c/display/W/…
জোশুয়া ডেভিস

4
"# 1267 অবৈধ মিশ্রণের মিশ্রণ ..." আমি এই ত্রুটিটি পাচ্ছি, এটি কাজ করে না
রাপলি অ্যান্ড্রেস

1
কৌতূহলের বাইরে, সুস্পষ্ট অবতরণ অর্ডারের মূল বক্তব্য কী? ( ORDER BY table_name DESC)
রিনোগো

12
একাধিক ডাটাবেস সাথে এবং আপনার ডিলিং ডাটাবেসের সব পরিবর্তন করতে, পরিবর্তন না চান তাহলে CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')করতেCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r

1
আপনি যদি সমস্ত ডাটাবেসের জন্য বিবৃতি পেতে চান (মাইএসকিউএল সিস্টেম ডাটাবেসগুলি বাদে): SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
ডু ফু ফুঞ্চু

61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

একটি যাদুমন্ত্র মত কাজ করে.

এটি আপনাকে একটি ব্যাচে চালাতে পারে এমন পরিবর্তনের প্রশ্নের সাথে সমস্ত সারণীর তালিকা দেবে


5
এটি চালানোর পরে আপনাকে প্রথমে নিম্নলিখিত কোয়েরিটি সম্পাদন করতে হবে: ইউএসই ডাটাবেসনাম; তারপরে আপনি উপরের স্ক্রিপ্টটি যে প্রশ্নগুলি দিয়েছেন তা ব্যবহার করতে পারেন।
gijs007

আপনি কিভাবে ব্যাচ চালাবেন?
মার্ক আলেকজান্ডার

উপরের ক্যোয়ারী আপনাকে টেবিলের প্রশ্নের পরিবর্তন করতে দেবে। শুধু তাদের সমস্ত নির্বাচন করুন এবং তাদের একসাথে চালিত। বা এগুলিকে 50 টি প্রশ্নের বিভক্ত করুন এবং ফলাফলের ফলাফলের মধ্যে অনেকগুলি টেবিল থাকলে চালনা করুন
ওমকার কুলকার্নি

2
এটি 2018 এবং পারকোনা ক্লাস্টারে এমনকি কাজ করছে। যদি এটি পিএইচপিএমআইএডমিন থেকে ব্যবহার করে থাকেন তবে আপনি কেবল 20 বা তার বেশি নাম পাবেন, তারপরে "..." বা একটি পৃষ্ঠাগুলি >> প্রতীক পাবেন। এর অর্থ আপনাকে পরবর্তী পৃষ্ঠাগুলিতে ক্লিক করতে হবে এবং অনুলিপি করতে হবে যাতে আপনি কোনও সারণী মিস করবেন না। যদি আপনি এটি ভুলে যান তবে আপনি উপরের ক্যোয়ারিকে নিরাপদে পুনরায় প্রয়োগ করতে পারেন এবং এটি আপনাকে রূপান্তর করতে পরবর্তী মাইআইএসএএম টেবিলগুলি দেবে।
দারিও ফুমাগল্লি

23

নীচের স্ক্রিপ্টগুলিতে <ব্যবহারকারীর নাম, <পাসওয়ার্ড> এবং <সীমা> আপনার নির্দিষ্ট ডেটা দিয়ে প্রতিস্থাপন করুন।

আপনি কোনও মাইএসকিএল ক্লায়েন্ট সেশনে কপি-পেস্ট করতে পারেন এমন বিবৃতিগুলি দেখানোর জন্য নিম্নলিখিতগুলি টাইপ করুন:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \

কেবল পরিবর্তনটি কার্যকর করতে, এটি ব্যবহার করুন:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -u <username> --password=<password> -D <schema>

ক্রেডিট: এটি এই নিবন্ধে বর্ণিত ছিল একটি ভিন্নতা ।


23

এক লাইন:

 mysql -u root -p dbName -e 
 "show table status where Engine='MyISAM';" | awk 
 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
  mysql -u root -p dbName

1
সেরা এবং সবচেয়ে ব্যক্তিগত উত্তর!
বিনিয়াম

আমি যখন এটি কোনও ব্যাশ স্ক্রিপ্টে চালিত করি তখন এটি এনআর সংজ্ঞাটি ওভাররাইট করে ব্যাশ স্ক্রিপ্ট ভেরিয়েবল হিসাবে $ 1 কে ব্যাখ্যা করে। কোন উপায় এই কাছাকাছি?
লিভিংয়ের জন্য কাজ করে

ঘিরা @WorksforaLiving "$1": এই মত ব্যাকটিক মধ্যে `"$1"`কি আমার উত্তর আছে অনুরূপ।
বিজয় বর্ধন

20

আপনার পিএইচপিএমআইএডমিনে এটি একটি বর্গ কোয়েরি হিসাবে ব্যবহার করুন

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';

3
এটি টেবিলগুলি আসলে InnoDB তে রূপান্তর করবে বলে মনে হয় না।
চার্লি শ্লিয়েসার

3
এটি এমন কোনও স্ক্রিপ্ট আউটপুট করে যা আপনি তারপরে টেবিলগুলি রূপান্তর করতে চালিত হন - এটি দুটি পদক্ষেপ। এটি INFORMATION_SCHEMA টেবিলগুলিকে রূপান্তরিত করার চেষ্টা করে, যদিও - এটি একটি খারাপ জিনিস। এটি সঠিক ডাটাবেসে সীমাবদ্ধ করা দরকার।
ব্রিলিয়ান্ড

1
আপনাকে আমাদের অভ্যন্তরীণ মাইএসকিএল টেবিলগুলি ফিল্টার করতে হবে - ডকস অনুসারে "মাইএসকিউএল ডাটাবেজে মাইএসকিউএল সিস্টেম টেবিলগুলিকে (যেমন ব্যবহারকারী বা হোস্ট) ইনোডিবি টাইপে রূপান্তর করবেন না This এটি একটি অসমর্থিত অপারেশন The সিস্টেমের টেবিলগুলি সর্বদা থাকতে হবে মাইআইএসএএম টাইপের। " লিংক
eug

এই উত্তরটিতে @ ইউগের মন্তব্য অন্তর্ভুক্ত করার জন্য সম্পাদনা না করে, আমি মনে করি এটি একটি ডাউন-ভোটের উপযুক্ত, যদিও এটি অন্য কোনওভাবে এই পৃষ্ঠার বৈকল্পিকের মতো মার্জিত।
mc0e

হুম। @ চার্লি-এসও সঠিক, এবং এটি কার্যকর এসকিউএল তৈরি করে না। একটি ডাউন-ভোট আমার কাছে ন্যায়সঙ্গত বলে মনে হচ্ছে।
mc0e

18

আপনি mysql কমান্ড লাইন সরঞ্জামে এই বিবৃতিটি কার্যকর করতে পারেন:

echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES 
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE' 
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql

আপনাকে ব্যবহার করে ব্যবহারকারীর নাম এবং পাসওয়ার্ড নির্দিষ্ট করতে হবে: mysql -u ব্যবহারকারীর নাম -p ফলাফলটি একটি স্কোর স্ক্রিপ্ট যা আপনি মাইএসকিএলে ফিরে যেতে পারেন:

mysql name-of-database < convert.sql

উপরের বিবৃতি এবং কমান্ড লাইনে "নাম-ডাটাবেস" প্রতিস্থাপন করুন।


@itsraja, "ইকো" হ'ল লিনাক্স / ইউনিক্স এবং মাইক্রোসফ্ট সিস্টেমে সিএমডি উভয় দ্বারা সমর্থিত একটি কমান্ড, ফলাফলটি মাইএসকিএল সরঞ্জামে ইনপুট হিসাবে পাইপ করা হয়।
হেন্ডরিক ব্রুমারম্যান

2
সেটা ঠিক. তবে আপনি "
মাইএসকিএল

1
এছাড়াও, "নির্বাচন করুন কনক্যাট (কনটাক্ট ('ALTER TRABLE', TABLE_NAME)), 'ENGINE = InnoDB;') যেখান থেকে ইঞ্জিন! = 'InnoDB' এবং ট্যাবলেট_ইপি = 'বেস টেবিলে' এবং ট্যাবলেট_সচেমি '' টেস্টিনো '" প্রতিধ্বনিত করুন mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> রূপান্তর.সকিএল এরর 1146 (42S02) লাইন 1 এ: টেবিল 'টেস্টিননো। টেবিল' বিদ্যমান নেই
itraja

আমি এটি এখানে উদাহরণস্বরূপ শেল স্ক্রিপ্টে রেখেছি: shrubbery.mynetgear.net/c/display/W/…
জোশুয়া ডেভিস

1
আমরা কীভাবে সঠিকভাবে স্ক্রিং স্টেটমেন্টটিকে স্ট্রিং হিসাবে এড়িয়ে যেতে পারি? যেমনটি এখন, আমি পেয়েছি-bash: ,TABLE_NAME,: command not found
আরজান

10

এটি কেবলমাত্র দুটি পদক্ষেপ কেবল অনুলিপি এবং পেস্ট করুন খুব সহজ:

ধাপ 1.

  SET @DATABASE_NAME = 'name_of_your_db';
  SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS  sql_statements FROM information_schema.tables AS tb WHERE   table_schema = @DATABASE_NAME AND `ENGINE` = 'MyISAM' AND `TABLE_TYPE` = 'BASE TABLE' ORDER BY table_name DESC;

(সমস্ত ফলাফল সিকিএল ট্যাবে কপি এবং পেস্ট করুন)

পদক্ষেপ 2: (সমস্ত ফলাফল স্কয়ার ট্যাবে অনুলিপি করুন) এবং লাইনে নীচে আটকান

শুরু লেনদেন;

কমিট;

যেমন। শুরু লেনদেন;

ALTER TABLE admin_filesENGINE = InnoDB;

কমিট;


10

সমস্ত নন-সিস্টেম স্কিমায় সমস্ত টেবিলের জন্য ALTER স্টেটমেন্ট জেনারেট করতে, সেই স্কিমাগুলি / সারণী দ্বারা আদেশিত নিম্নলিখিতটি চালান:

SELECT  CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables
WHERE   TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;

তারপরে, পরিবর্তনটি সম্পাদন করতে ক্লায়েন্টের মাধ্যমে এই প্রশ্নগুলি চালান।

  • উত্তর উপরের উত্তরের ভিত্তিতে, তবে স্কিমা হ্যান্ডলিংয়ের উন্নতি করে।

8

এটি এখনও উল্লেখ করা হয়নি, তাই আমি এটি উত্তরসূরির জন্য লিখব:

আপনি যদি ডিবি সার্ভারের মধ্যে স্থানান্তরিত হন (বা আপনার ডিটিএটি ডাম্প করে পুনরায় লোড করানোর অন্য কোনও কারণ রয়েছে) তবে আপনি কেবল আউটপুটটি এখান থেকে পরিবর্তন করতে পারবেন mysqldump:

mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;

তারপরে এটি আবার লোড করুন:

mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql

(এছাড়াও, আমার সীমিত অভিজ্ঞতায়, 'লাইভ' সারণীগুলির পরিবর্তনের চেয়ে এটি আরও দ্রুত প্রক্রিয়া হতে পারে It এটি সম্ভবত ডেটা এবং সূচির প্রকারের উপর নির্ভর করে))


TY! ঠিক আমি খুঁজছেন ছিল কি. এটি কয়েক দিনের মধ্যে পরীক্ষা করবে।
রেনার

7

জ্যাঙ্গো ব্যবহারকারীদের জন্য এটি করার একটি উপায় এখানে রয়েছে:

from django.core.management.base import BaseCommand
from django.db import connections


class Command(BaseCommand):

    def handle(self, database="default", *args, **options):

        cursor = connections[database].cursor()

        cursor.execute("SHOW TABLE STATUS");

        for row in cursor.fetchall():
            if row[1] != "InnoDB":
                print "Converting %s" % row[0],
                result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
                print result

ফোল্ডার পরিচালনা / কমান্ডগুলির আওতায় আপনার অ্যাপ্লিকেশনটিতে এটি যুক্ত করুন / তারপরে আপনি একটি পরিচালনা.py কমান্ড দিয়ে আপনার সমস্ত টেবিল রূপান্তর করতে পারেন:

python manage.py convert_to_innodb

5

মাইএসকিএল এর ভিতরে থেকে, আপনি পাঠ্য সম্পাদক ব্যবহার করে অনুসন্ধান / প্রতিস্থাপন ব্যবহার করতে পারেন:

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

দ্রষ্টব্য: আপনার সম্ভবত তথ্য_সেমিমা এবং মাইএসকিএল উপেক্ষা করা উচিত কারণ "মাইএসকিএল এবং তথ্য_স্কেমা ডাটাবেসগুলি, যেগুলি কিছু মাইএসকিউএল ইন্টার্নাল প্রয়োগ করে, এখনও মাইআইএসএএম ব্যবহার করে। বিশেষত, আপনি ইনোডিবি ব্যবহারের জন্য অনুদানের টেবিলগুলিতে স্যুইচ করতে পারবেন না।" ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

যাই হোক না কেন, উপেক্ষা এবং চালানোর জন্য টেবিলগুলি নোট করুন:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

এখন কেবল সেই তালিকাটি আপনার পাঠ্য সম্পাদককে অনুলিপি করুন / আটকান এবং "|" অনুসন্ধান / প্রতিস্থাপন করুন "ALTER TABLE" ইত্যাদি সহ

তারপরে আপনার এর মতো একটি তালিকা থাকবে যা আপনি কেবল আপনার মাইএসকিএল টার্মিনালে পেস্ট করতে পারেন:

ALTER TABLE arth_commentmeta           ENGINE=Innodb;
ALTER TABLE arth_comments              ENGINE=Innodb;
ALTER TABLE arth_links                 ENGINE=Innodb;
ALTER TABLE arth_options               ENGINE=Innodb;
ALTER TABLE arth_postmeta              ENGINE=Innodb;
ALTER TABLE arth_posts                 ENGINE=Innodb;
ALTER TABLE arth_term_relationships    ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy         ENGINE=Innodb;
ALTER TABLE arth_terms                 ENGINE=Innodb;
ALTER TABLE arth_usermeta              ENGINE=Innodb;

যদি আপনার পাঠ্য সম্পাদক সহজেই এটি না করতে পারেন তবে লিনাক্স টার্মিনাল থেকে আপনার ডাটাবেসের কেবলমাত্র একটি উপসর্গের জন্য অনুরূপ তালিকা (যা আপনি মাইএসকিএল এ পেস্ট করতে পারেন) পাওয়ার জন্য এখানে আরও একটি সমাধান রয়েছে:

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"

5

একটি সরল মাইএসকিউএল সংস্করণ।

আপনি কেবল মাইএসকিএল এক্সিকিউটেবল শুরু করতে পারেন, ডাটাবেস ব্যবহার করতে পারেন এবং কোয়েরিটি অনুলিপি করুন।

এটি বর্তমান ডাটাবেসের সমস্ত মাইআইএসএএম টেবিলগুলিকে আইএনএনওডিবি টেবিলগুলিতে রূপান্তর করবে।

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;

END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;

আমি অবাক হয়েছি যে প্রক্রিয়া-ভিত্তিক সমাধানের চেয়ে বেশি সঞ্চয় করা হয়নি!
হতাশ

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

3

একক টেবিলের জন্য ডাটাবেস ইঞ্জিনটি পরিবর্তন করতে এই লাইনটি ব্যবহার করুন।

  ALTER TABLE table_name ENGINE = INNODB;

3

আমি একজন নবাগত এবং আমার নিজের সমাধানটি খুঁজে বের করতে হয়েছিল কারণ ওয়েবে মাইএসকিএল কমান্ডগুলি সাধারণত ভুল বানান দ্বারা ছাঁটাই হয়ে থাকে কেবল মানুষের জন্য একটি বাস্তব জীবনের দুঃস্বপ্ন তৈরি করে। এই আমার সমাধান ....

প্রতি টেবিলে 1 কমান্ডের পরিবর্তে, আমি এক্সেল ব্যবহারের সাথে সাথে কয়েক ডজন কমান্ড (অনুলিপি এবং অনুলিপি প্রস্তুত) প্রস্তুত করেছি।

কিভাবে? আপনার পুটি উইন্ডোটি প্রসারিত করুন এবং মাইএসকিএল প্রবেশ করুন এবং তারপরে "টেবিল পরিস্থিতি দেখান" কমান্ডটি চালান; এবং আউটপুটটিকে মাইক্রোসফ্ট এক্সেলে কপি / পেস্ট করুন। ডেটা ট্যাবে যান এবং "কলামগুলিতে পাঠ্য" ব্যবহার করুন স্পেস কী দ্বারা কলামগুলিকে সীমাবদ্ধ করুন। তারপরে যে কোনও কলামে আপনার টেবিলের প্রকারগুলি দেখায় কলামগুলি বাছাই করুন এবং টেবিলগুলি ইতিমধ্যে InnoDb ফর্ম্যাটে রয়েছে এমন সমস্ত সারি মুছুন (কারণ তাদের বিরুদ্ধে কমান্ড চালানোর দরকার নেই, সেগুলি ইতিমধ্যে সম্পন্ন হয়ে গেছে)। তারপরে টেবিলগুলির কলামের বামে 2 টি কলাম এবং ডানদিকে 2 টি কলাম যুক্ত করুন। তারপরে কমান্ডের প্রথম অংশটি কলাম -১ এ পেস্ট করুন (নীচে দেখুন)। কলাম 2 এ কেবল একটি স্থান থাকা উচিত। 3 কলামটি আপনার টেবিলগুলির কলাম। কলাম 4 এ কেবল একটি স্থান থাকা উচিত। 5 কলামটি আপনার আদেশের শেষ অংশ। এটিকে ঐটির মত দেখতে হবে:

column-1        column-2            column-3         column-4     column-5
ALTER TABLE     t_lade_tr           ENGINE=InnoDB;
ALTER TABLE     t_foro_detail_ms    ENGINE=InnoDB;
ALTER TABLE     t_ljk_ms            ENGINE=InnoDB;

তারপরে একবারে প্রায় 5 টি সারিকে মাইএসকিএল-এ অনুলিপি করুন এবং আটকান। এটি একবারে প্রায় 5 টি রূপান্তর করবে। আমি লক্ষ্য করেছি যদি আমি এটির চেয়ে একবার আরও কিছু করি তবে কমান্ডগুলি ব্যর্থ হবে।


3

আমার ক্ষেত্রে, আমি একটি মাইএসকিউএল উদাহরণ থেকে মাইআইএসএএম-এর একটি ডিফল্ট, ইনোইডিবি-র একটি ডিফল্টের সাথে একটি মারিয়াডিবি ইভেন্টে স্থানান্তরিত হয়েছিল।

প্রতি মারিয়াডিবি মাইগ্রেশন ডকের।

পুরানো সার্ভার রান:

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

--স্কিপ-তৈরি-বিকল্পগুলি নিশ্চিত করে যে মাইআইএসএএম এর পরিবর্তে ডেটাবেস সার্ভার ডেটা লোড করার সময় ডিফল্ট স্টোরেজ ইঞ্জিন ব্যবহার করে।

mysql -u root -p < migration.sql

এটি mysql.db তৈরি করার ক্ষেত্রে একটি ত্রুটি ফেলেছিল তবে এখন সবকিছু দুর্দান্ত কাজ করছে :)


3

সবেমাত্র (সহজ?) উপায় পরীক্ষা করে দেখেছি এবং আমার পক্ষে কাজ করেছি worked

কেবলমাত্র আপনার ডিবি। এসকিউএল ফাইল হিসাবে রফতানি করুন, এটিকে সম্পাদনা করুন জিডিট বা নোটপ্যাড দিয়ে;

প্রতিস্থাপন ENGINE=MyISAMসঙ্গে ENGINE=INNODBএবং সংরক্ষণ ফাইল সম্পাদিত

সংখ্যা বা প্রতিস্থাপনটি করা আপনার টেবিলের সংখ্যা হওয়া উচিত

এটি মাইএসকিউএল (phpMyAdmin বা কমান্ড লাইন) এ আমদানি করুন

ও ভোইলা!


2

আপনি এটি আপনার প্রিয় স্ক্রিপ্টিং ভাষায় করতে স্ক্রিপ্ট লিখতে পারেন। লিপিটি নিম্নলিখিতটি করবে:

  1. ইস্যু SHOW FULL TABLES
  2. ফিরে আসা প্রতিটি সারির জন্য, দ্বিতীয় কলামটি বলছে কি 'BASE TABLE'না তা পরীক্ষা করে দেখুন 'VIEW'
  3. যদি তা না হয় 'VIEW'তবে উপযুক্ত ALTER TABLEকমান্ডটি প্রেরণ করুন।

2

এই শেল স্ক্রিপ্ট চেষ্টা করুন

DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done

2

এই ব্যবহারকারীর স্ক্রিপ্টে কিছু সমাধান

SET @DATABASE_NAME = 'Integradb';

SELECT  CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;

1
<?php

  // connect your database here first

  mysql_connect('host', 'user', 'pass');

  $databases = mysql_query('SHOW databases');

  while($db = mysql_fetch_array($databases)) {
    echo "database => {$db[0]}\n";
    mysql_select_db($db[0]);

    $tables = mysql_query('SHOW tables');

    while($tbl = mysql_fetch_array($tables)) {
      echo "table => {$tbl[0]}\n";
      mysql_query("ALTER TABLE {$tbl[0]} ENGINE=MyISAM");
    }
  }

1

এটি একটি সাধারণ পিএইচপি স্ক্রিপ্ট।

<?php
    @error_reporting(E_ALL | E_STRICT);
    @ini_set('display_errors', '1');


    $con = mysql_connect('server', 'user', 'pass');
    $dbName = 'moodle2014';

    $sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$dbName."';";
    $rs = mysql_query($sql, $con);

    $count = 0;
    $ok = 0;
    while($row = mysql_fetch_array($rs)){
            $count ++;
            $tbl = $row[0];
            $sql = "ALTER TABLE ".$dbName.".".$tbl." ENGINE=INNODB;";
            $resultado = mysql_query($sql);
            if ($resultado){
                    $ok ++;
                    echo $sql."<hr/>";
            }
    }
    if ($count == $ok){
            echo '<div style="color: green"><b>ALL OK</b></div>';
    }else{
            echo '<div style="color: red"><b>ERRORS</b>Total tables: '.$count.', updated tables:'.$ok.'</div>';
    }

1
<?php

// Convert all MyISAM tables to INNODB tables in all non-special databases.
// Note: With MySQL less than 5.6, tables with a fulltext search index cannot be converted to INNODB and will be skipped.

if($argc < 4)
    exit("Usage: {$argv[0]} <host> <username> <password>\n");
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];

// Connect to the database.
if(!mysql_connect($host, $username, $password))
    exit("Error opening database. " . mysql_error() . "\n");

// Get all databases except special ones that shouldn't be converted.
$databases = mysql_query("SHOW databases WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema')");
if($databases === false)
    exit("Error showing databases. " . mysql_error() . "\n");

while($db = mysql_fetch_array($databases))
{
    // Select the database.
    if(!mysql_select_db($db[0]))
        exit("Error selecting database: {$db[0]}. " . mysql_error() . "\n");
    printf("Database: %s\n", $db[0]);

    // Get all MyISAM tables in the database.
    $tables = mysql_query("SHOW table status WHERE Engine = 'MyISAM'");
    if($tables === false)
        exit("Error showing tables. " . mysql_error() . "\n");

    while($tbl = mysql_fetch_array($tables))
    {
        // Convert the table to INNODB.
        printf("--- Converting %s\n", $tbl[0]);
        if(mysql_query("ALTER TABLE `{$tbl[0]}` ENGINE = INNODB") === false)
            printf("--- --- Error altering table: {$tbl[0]}. " . mysql_error() . "\n");
    }
}

mysql_close();

?>

1

mysqli সংযোগের জন্য;

<?php

$host       = "host";
$user       = "user";
$pass       = "pss";
$database   = "db_name";


$connect = new mysqli($host, $user, $pass, $database);  

// Actual code starts here Dont forget to change db_name !!
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA = 'db_name' 
    AND ENGINE = 'MyISAM'";

$rs = $connect->query($sql);

while($row = $rs->fetch_array())
{
    $tbl = $row[0];
    $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
    $connect->query($sql);
} ?>

0

তবুও অন্য একটি বিকল্প ... জবাবদিহি করতে কিভাবে এটি এখানে। এটি ধরে নেওয়া হয় যে আপনার ডাটাবেসের নাম রয়েছে dbnameএবং আপনি ইতিমধ্যে অ্যাক্সেসটি কনফিগার করেছেন।

- name: Get list of DB tables that need converting to InnoDB
  command: >
    mysql --batch --skip-column-names --execute="SELECT TABLE_NAME
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = '{{ dbname }}' AND ENGINE = 'MyISAM';"
  register: converttables
  check_mode: no
  changed_when: False

- name: Convert any unconverted tables
  command: >
    mysql --batch --skip-column-names --execute="ALTER TABLE `{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
  with_items: "{{ converttables.stdout_lines }}"

-1

সিডি / ভার / লিব / মাইএসকিএল / ডিবিএনএম

ls | grep ".frm" | কাটা-ডি "।" -ফ 1 | xargs -I {} -n1 mysql -D DBNAME -e "টেবিল পরিবর্তন করুন G G ENGINE = INNODB;" -রুট -পিএক্সএক্সএক্সএক্সএক্সএক্স

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