最近在對國内服務器進行硬盤的替換升級的時候,發現有一台服務器把數據庫遷移到新硬盤後,以前的老硬盤依然非常繁忙(用iostat檢查),仔細查看後,發現有一些MySQL數據庫用的InnoDB格式,即使把數據庫目錄搬遷後,實際數據依然放置在以前的硬盤上。
Drupal 7默認是采用InnoDB數據庫引擎以利用其一些獨特的特性,但我們的系列網站數據量很大,需要分散放置各子網站的數據庫才好,所以我們都是改為使用MyISAM數據庫,以前曾經修改過Drupal的Core文件來實現數據庫引擎的變更,但這在Drupal系統升級的時候就丢失了,這樣導緻一些新建網站的數據庫表,以及一些老網站中部分升級新産生的數據表,都采用了InnoDB引擎。
以前發現上面這樣的情況,我們都是單獨修改引擎或者用程序批量修改,這在我以前的一篇博客文章《将Drupal 7默認的MySQL引擎從InnoDB改為MyISAM》中有記錄,現在依然采用這個辦法來批量修改。
不過為了徹底解決這個問題而又不每次修改升級的Drupal核心文件,就需要将MySQL的所有現有InnoDB引擎表全部改為MyISAM,然後修改/etc/my.cnf文件,完全關閉InnoDB引擎。這就涉及到尋找有哪些表是使用的InnoDB引擎的問題,可以用mysql命令來逐個庫查看,但在庫本身就很多的情況下還是比較麻煩,我在網上找了一些資料,然後自己嘗試編寫了一個PHP程序來循環讀取各個庫、各個表的引擎屬性。
這個程序是臨時找了些資料拼湊起來的,适合快速搞了自己用,程序本身就寫得亂、不講究、也懶得加注釋了,不過在這裡還是公開出來,希望對一些感興趣的朋友有幫助:
<?php
/*
* show_all_tables.php
*/
$mysql_host='localhost';
$mysql_user='root';
$mysql_password='your_password';
$con=mysql_connect($mysql_host, $mysql_user, $mysql_password);
if (!$con) {
print 'Could not connect to mysql';
exit;
}
$db_list = mysql_list_dbs($con);
while ($db = mysql_fetch_object($db_list))
{
$db_name=$db->Database;
echo "--- $db_name ---\n";
$tables=list_tables($db_name);
//print_r($tables);
foreach ($tables as $table) {
$rs=mysql_query("SHOW TABLE STATUS from $db_name where Name='$table'");
$tables1 = array();
while ($row = mysql_fetch_row($rs)) {
$tables1[] = $row[0];
$tables1[] = $row[1];
}
mysql_free_result($rs);
print $db_name.'.'.$tables1[0].' - '.$tables1[1]."\n";
}
}
mysql_close($con);
function list_tables($database)
{
$rs = mysql_query("SHOW TABLES FROM $database");
$tables = array();
while ($row = mysql_fetch_row($rs)) {
$tables[] = $row[0];
}
mysql_free_result($rs);
return $tables;
}
?>
這個程序稍微改一下也可以讀取一台數據庫服務器上的所有數據庫,或者一個數據庫中的所有表及屬性,如果有必要還可以改為讀取數據庫引擎以外的其它屬性。
评论