您在這裡

将Drupal 7默認的MySQL引擎從InnoDB改為MyISAM

James Qi 在 2012年3月22日 - 13:24 發表

  前段時間安裝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.php

ini_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
}

 

?>

 

回應

今天把前一陣子自動建立的InnoDB數據庫轉為MyISAM了,沒有用備份、恢複的辦法,而是用命令直接轉:ALTER TABLE tablename ENGINE = MYISAM; 隻是需要逐個庫打開、逐個表轉換,可以設法批量來做。據說可以on-the-fly轉換,不過我還是先把網站暫停後進行了,花了幾個小時。

James Qi / 祁勁松

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。