উত্তর:
<?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);
}
?>
mysql_*
ইন্টারফেসটি ver নম্বর ভার্সন থেকে অবচিত ও সরানো হয়েছে। এই কোডটি যেমন ব্যবহার করবেন না।
আপনার ডাটাবেসে সমস্ত মাইআইএসএএম টেবিলগুলি পুনরুদ্ধার করতে এই এসকিউএল স্টেটমেন্টটি (মাইএসকিউএল ক্লায়েন্ট, পিএইচপিএমইএডমিন বা অন্য যে কোনও জায়গায়) চালান।
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;
তারপরে, আউটপুটটি অনুলিপি করুন এবং একটি নতুন এসকিউএল কোয়েরি হিসাবে চালান।
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
করতেCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
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
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';
একটি যাদুমন্ত্র মত কাজ করে.
এটি আপনাকে একটি ব্যাচে চালাতে পারে এমন পরিবর্তনের প্রশ্নের সাথে সমস্ত সারণীর তালিকা দেবে
নীচের স্ক্রিপ্টগুলিতে <ব্যবহারকারীর নাম, <পাসওয়ার্ড> এবং <সীমা> আপনার নির্দিষ্ট ডেটা দিয়ে প্রতিস্থাপন করুন।
আপনি কোনও মাইএসকিএল ক্লায়েন্ট সেশনে কপি-পেস্ট করতে পারেন এমন বিবৃতিগুলি দেখানোর জন্য নিম্নলিখিতগুলি টাইপ করুন:
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>
ক্রেডিট: এটি এই নিবন্ধে বর্ণিত ছিল একটি ভিন্নতা ।
এক লাইন:
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"`
কি আমার উত্তর আছে অনুরূপ।
আপনার পিএইচপিএমআইএডমিনে এটি একটি বর্গ কোয়েরি হিসাবে ব্যবহার করুন
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
আপনি 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
উপরের বিবৃতি এবং কমান্ড লাইনে "নাম-ডাটাবেস" প্রতিস্থাপন করুন।
-bash: ,TABLE_NAME,: command not found
এটি কেবলমাত্র দুটি পদক্ষেপ কেবল অনুলিপি এবং পেস্ট করুন খুব সহজ:
ধাপ 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_files
ENGINE = InnoDB;
কমিট;
সমস্ত নন-সিস্টেম স্কিমায় সমস্ত টেবিলের জন্য 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;
তারপরে, পরিবর্তনটি সম্পাদন করতে ক্লায়েন্টের মাধ্যমে এই প্রশ্নগুলি চালান।
এটি এখনও উল্লেখ করা হয়নি, তাই আমি এটি উত্তরসূরির জন্য লিখব:
আপনি যদি ডিবি সার্ভারের মধ্যে স্থানান্তরিত হন (বা আপনার ডিটিএটি ডাম্প করে পুনরায় লোড করানোর অন্য কোনও কারণ রয়েছে) তবে আপনি কেবল আউটপুটটি এখান থেকে পরিবর্তন করতে পারবেন 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 এটি সম্ভবত ডেটা এবং সূচির প্রকারের উপর নির্ভর করে))
জ্যাঙ্গো ব্যবহারকারীদের জন্য এটি করার একটি উপায় এখানে রয়েছে:
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
মাইএসকিএল এর ভিতরে থেকে, আপনি পাঠ্য সম্পাদক ব্যবহার করে অনুসন্ধান / প্রতিস্থাপন ব্যবহার করতে পারেন:
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;"
একটি সরল মাইএসকিউএল সংস্করণ।
আপনি কেবল মাইএসকিএল এক্সিকিউটেবল শুরু করতে পারেন, ডাটাবেস ব্যবহার করতে পারেন এবং কোয়েরিটি অনুলিপি করুন।
এটি বর্তমান ডাটাবেসের সমস্ত মাইআইএসএএম টেবিলগুলিকে আইএনএনওডিবি টেবিলগুলিতে রূপান্তর করবে।
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;
আমি একজন নবাগত এবং আমার নিজের সমাধানটি খুঁজে বের করতে হয়েছিল কারণ ওয়েবে মাইএসকিএল কমান্ডগুলি সাধারণত ভুল বানান দ্বারা ছাঁটাই হয়ে থাকে কেবল মানুষের জন্য একটি বাস্তব জীবনের দুঃস্বপ্ন তৈরি করে। এই আমার সমাধান ....
প্রতি টেবিলে 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 টি রূপান্তর করবে। আমি লক্ষ্য করেছি যদি আমি এটির চেয়ে একবার আরও কিছু করি তবে কমান্ডগুলি ব্যর্থ হবে।
আমার ক্ষেত্রে, আমি একটি মাইএসকিউএল উদাহরণ থেকে মাইআইএসএএম-এর একটি ডিফল্ট, ইনোইডিবি-র একটি ডিফল্টের সাথে একটি মারিয়াডিবি ইভেন্টে স্থানান্তরিত হয়েছিল।
প্রতি মারিয়াডিবি মাইগ্রেশন ডকের।
পুরানো সার্ভার রান:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
--স্কিপ-তৈরি-বিকল্পগুলি নিশ্চিত করে যে মাইআইএসএএম এর পরিবর্তে ডেটাবেস সার্ভার ডেটা লোড করার সময় ডিফল্ট স্টোরেজ ইঞ্জিন ব্যবহার করে।
mysql -u root -p < migration.sql
এটি mysql.db তৈরি করার ক্ষেত্রে একটি ত্রুটি ফেলেছিল তবে এখন সবকিছু দুর্দান্ত কাজ করছে :)
সবেমাত্র (সহজ?) উপায় পরীক্ষা করে দেখেছি এবং আমার পক্ষে কাজ করেছি worked
কেবলমাত্র আপনার ডিবি। এসকিউএল ফাইল হিসাবে রফতানি করুন, এটিকে সম্পাদনা করুন জিডিট বা নোটপ্যাড দিয়ে;
প্রতিস্থাপন ENGINE=MyISAM
সঙ্গে ENGINE=INNODB
এবং সংরক্ষণ ফাইল সম্পাদিত
সংখ্যা বা প্রতিস্থাপনটি করা আপনার টেবিলের সংখ্যা হওয়া উচিত
এটি মাইএসকিউএল (phpMyAdmin বা কমান্ড লাইন) এ আমদানি করুন
ও ভোইলা!
এই শেল স্ক্রিপ্ট চেষ্টা করুন
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
এই ব্যবহারকারীর স্ক্রিপ্টে কিছু সমাধান
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;
<?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");
}
}
এটি একটি সাধারণ পিএইচপি স্ক্রিপ্ট।
<?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>';
}
<?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();
?>
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);
} ?>
তবুও অন্য একটি বিকল্প ... জবাবদিহি করতে কিভাবে এটি এখানে। এটি ধরে নেওয়া হয় যে আপনার ডাটাবেসের নাম রয়েছে 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 }}"