Discuz X2論壇數據庫MyISAM轉InnoDB的腳本

2012年09月27日凌晨三點做了一個DiscuzX2的myisam2innodb。最後遺留下來三個表(forum_postposition, common_member_grouppm, forum_post)由於索引結構問題當時未完成轉換。09月28日,看過 NetSeek@LinuxTone 的帖子,自己寫了個腳本,完成了這三個表的轉換。
  
爲了便於一次性操作,我重寫了整個腳本,或許其他人有用。在我的實例中,這三個表的實際名字是有pre_前綴的。所以還請根據實際情況做庫名和表明的更改。

#!/bin/bash
#dx2_myisam2innodb.sh
USER="root"
PASS="chang.me.please"
FILE_SQL="sql.myisam2innodb"
NAME_DB="discuzX2"

cat > "${FILE_SQL}" << EOF
USE ${NAME_DB};
ALTER TABLE pre_forum_postposition DROP PRIMARY KEY,ADD PRIMARY KEY(position,tid);
ALTER TABLE pre_common_member_grouppm DROP PRIMARY KEY,ADD PRIMARY KEY(gpmid,uid);
ALTER TABLE pre_forum_post DROP PRIMARY KEY,ADD PRIMARY KEY(position,tid);
    
EOF
    
mysql -u"${USER}" -p"${PASS}" -ANe "SELECT CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;') as ToSQL from information_schema.tables where TABLE_SCHEMA='${NAME_DB}' and ENGINE='MYISAM' order by TABLE_ROWS;" >> "${FILE_SQL}"
mysql -u"${USER}" -p"${PASS}" < "${FILE_SQL}"

原始的 Discuz X2 的表缺省使用的是 MyISAM 和 MEMORY 存儲引擎。而 MyISAM 經常發生鎖表的情況,一執行 show processlist 會看到N多的Locked,會引起腳本執行等待超時等錯誤。截至2012年09月27日凌晨03時,單 pre_forum_post 表中就有接近2200萬條記錄,導致論壇經常出現502現象。葉金榮@CYOU對Discuz一直缺省使用MyISAM頗有微詞,因此寫了系列文章論證使用InnoDB替代MyISAM,也在新浪微博上提出了批評。據可靠消息,Comsenz內部也使用InnoDB的。

雖說 ALTER TABLE tbl_name ENGINE=InnoDB 輸入和執行都很簡單,但是感覺有個統一的腳本可能方便一些。所以急就章寫下這個腳本。據聞 Discuz X2 有 PHP 腳本實現這個功能,應該比較可靠一些吧。

在 Discuz X2 的庫表設計中,缺省存儲引擎是 MyISAM 和 MEMORY 這兩種,儘量不要把 MEMORY 的轉換成 InnoDB,所以加了一個 ENGINE='MYISAM' 做篩選條件,而且已經是InnoDB的也就不用再費事兒重複操作了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章