最近在对国内服务器进行硬盘的替换升级的时候,发现有一台服务器把数据库迁移到新硬盘后,以前的老硬盘依然非常繁忙(用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; } ?>
这个程序稍微改一下也可以读取一台数据库服务器上的所有数据库,或者一个数据库中的所有表及属性,如果有必要还可以改为读取数据库引擎以外的其它属性。
评论