前段时间安装Drupal 7的时候就遇到自动在MySQL中使用InnoDB的情况,而且好像是即使MySQL默认引擎为MyISAM也依旧使用InnoDB。虽然InnoDB有自己的特点,Drupal 7选用这个也正常,但对于我们来说,有多个子网站的时候,以前是将数据库分散到多块硬盘上的,就需要用MyISAM来让每个子网站有独立的目录比较方便,所以还是需要能使用MyISAM。
按照网上找到的一篇文章,修改includes/database/mysql/shema.inc这个文件可以解决,虽然修改drupal core文件不是一个很好的办法,先这样用。
83行:
'mysql_engine' => 'InnoDB',
改为:
'mysql_engine' => 'MyISAM',
后来在其它服务器上设置新的Drupal 7网站时忘记了修改,结果都自动生成了InnoDB的表,等以后可以用备份、恢复的办法来转为MyISAM。另外,还可以用SQL命令来逐个表alter为MyISAM(alter table merchant type=innodb;),也在网上找到一个批量修改一个库中各个表type的程序:http://forums.mysql.com/read.php?21,26193,49429#msg-49429 。
<?php
#This script will change all the table engine types for a given database!
#All the DB tools I have (GNU/freeware) will not change a list of database
# types, so this script saves time when a CMS or other populates a database
# with tables we cannot use! This can be migrated to InnoDB by changing line
# 23, col 46 from MyISAM to InnoDB (double check the capitals there!).
# Change these variables relative: serverName, userName, password, databaseName
# 20051410 JLynch
# myisamFixer.phpini_set('display_errors', 'On');
error_reporting(E_ALL);
$link = mysql_connect("serverName","userName","password")
or die("unable to connect to msql server: " . msql_error());mysql_select_db("databaseName", $link)
or die("unable to select database 'db': " . msql_error());
$result = mysql_query("show tables");
if (!$result) {
die('query failed: ');
}while ($row = mysql_fetch_array($result)){
mysql_query("ALTER TABLE ".$row[0]." ENGINE=MyISAM; ");
#Command Reference: ALTER TABLE tableName ENGINE=MyISAM
}
?>
评论1
补充:InnoDB直接转MyISAM
今天把前一阵子自动建立的InnoDB数据库转为MyISAM了,没有用备份、恢复的办法,而是用命令直接转:ALTER TABLE tablename ENGINE = MYISAM; 只是需要逐个库打开、逐个表转换,可以设法批量来做。据说可以on-the-fly转换,不过我还是先把网站暂停后进行了,花了几个小时。