PHP เปลี่ยน DB Engine

สำหรับฐานข้อมูลที่มีตารางเยอะๆ และ Engine ของตารางไม่เหมือนกัน หรือต้องการจะเปลี่ยนกลับไปกลับมา ระหว่าง MyISAM และ InnoDB สามารถทำได้ด้วยการใช้ PHP เข้ามาช่วย โดยคำสั่งนี้

<?php
// connect your database here first
//
$db_host = "localhost";
$db_user = "user";
$db_pass = "pass";
$db_name = "dbname";
mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name);
 
// Actual code starts here
 
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{$db_name}'
AND ENGINE = 'MyISAM'";
 
$rs = mysql_query($sql);
 
while($row = mysql_fetch_array($rs))
{
$tbl = $row[0];
$sql = "ALTER TABLE `$tbl` ENGINE=InnoDB;";
echo $sql, '<br>';
mysql_query($sql);
}
?>

จากด้านบน จะเป็นการ Query ตาราง InnoDBแล้วแก้ไขเป็น MyISAM หากต้องการทำกลับกัน ให้สลับตำแหน่งของ InnoDB และ MyISAM นะครับ

Update: เวอร์ชั่นที่ต้องการเปลี่ยน DB Engine ทุก Database ครับ

<?php
// connect your database here first
$skip = array('sys', 'mysql', 'information_schema', 'performance_schema', 'da_roundcube');
//
$db_host = "localhost";
$db_user = "db_user";
$db_pass = "db_pass";
//$db_name = "dbname";
$db = new mysqli($db_host, $db_user, $db_pass);
 
// Check connection
if ($db -> connect_errno) {
echo "Failed to connect to MySQL: " . $db -> connect_error;
exit();
}
 
$Query_DB = $db->query("SHOW DATABASES");
while($db_single = $Query_DB->fetch_object()){
 
// Skip for none user _
if(in_array($db_single->Database, $skip) ) continue;
 
echo "# " . $db_single->Database . "<br>";
$db->select_db($db_single->Database);
 
// Actual code starts here
 
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{$db_single->Database}'
AND ENGINE = 'MyISAM'";
 
$rs = $db->query($sql);
 
while($row = $rs->fetch_array())
{
$tbl = $row[0];
$sql = "ALTER TABLE `$tbl` ENGINE=InnoDB;";
echo $sql, '<br>';
$db->query($sql);
}
 
echo "<br><br>";
 
}
?>

สำหรับ mysqli

<?php
// connect your database here first
$skip = array('sys', 'mysql', 'information_schema', 'performance_schema', 'da_roundcube');
//
$db_host = "localhost";
$db_user = "db_user";
$db_pass = "db_pass";
//$db_name = "dbname";
$db = new mysqli($db_host, $db_user, $db_pass);
 
// Check connection
if ($db -> connect_errno) {
echo "Failed to connect to MySQL: " . $db -> connect_error;
exit();
}
 
$Query_DB = $db->query("SHOW DATABASES");
while($db_single = $Query_DB->fetch_object()){
 
// Skip for none user _
if(in_array($db_single->Database, $skip) ) continue;
 
echo "# " . $db_single->Database . "<br>";
$db->select_db($db_single->Database);
 
// Actual code starts here
 
$sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '{$db_single->Database}'
AND ENGINE = 'MyISAM'";
 
$rs = $db->query($sql);
 
while($row = $rs->fetch_array())
{
$tbl = $row[0];
$sql = "ALTER TABLE `$tbl` ENGINE=InnoDB;";
echo $sql, '<br>';
$db->query($sql);
}
 
echo "<br><br>";
 
}
?>

ในส่วนของตัวแปร $skip ก็ใส่ DB ที่ไม่ต้องการเปลี่ยน เช่น DB ของระบบ เป็นต้นครับ