欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Discuz X2论坛数据库MyISAM转InnoDB的脚本

程序员文章站 2022-06-06 18:25:01
...

2012年09月27日凌晨三点做了一个DiscuzX2的myisam2innodb。最后遗留下来三个表(forum_postposition,common_member_grouppm,forum_post)由于索引结构问题当时未完

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


原始的 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的也就不用再费事儿重复操作了。

本文出自 “阿泰—开源寻径” 博客,请务必保留此出处