当前位置

列出MySQL数据库服务器上所有库和表及引擎属性

James Qi 在 2014年5月2日 - 23:30 提交

  最近在对国内服务器进行硬盘的替换升级的时候,发现有一台服务器把数据库迁移到新硬盘后,以前的老硬盘依然非常繁忙(用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;
}

?>

  这个程序稍微改一下也可以读取一台数据库服务器上的所有数据库,或者一个数据库中的所有表及属性,如果有必要还可以改为读取数据库引擎以外的其它属性。

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。