最近在對國内服務器進行硬盤的替換升級的時候,發現有一台服務器把數據庫遷移到新硬盤後,以前的老硬盤依然非常繁忙(用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; } ?>
這個程序稍微改一下也可以讀取一台數據庫服務器上的所有數據庫,或者一個數據庫中的所有表及屬性,如果有必要還可以改為讀取數據庫引擎以外的其它屬性。
评论