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的也就不用再费事儿重复操作了。
本文出自 “阿泰—开源寻径” 博客,请务必保留此出处http://floss.blog.51cto.com/683157/1010150
紧急通告:关于《Discuz X2论坛数据库MyISAM转InnoDB的脚本》
经过这段时间的运行,发现会出现楼层消失问题。经和 Comsenz 公司技术人员探讨,知晓了原因,因此建议暂时不要对 form_postposition、common_member_grouppm、forum_post 做更改 PRIMARAY KEY 的操作,也就是说建议使用如下脚本:
- #!/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};
- 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' and table_name NOT in ('pre_forum_postposition', 'pre_common_member_grouppm', 'pre_forum_post') order by TABLE_ROWS;" >> "${FILE_SQL}"
- mysql -u"${USER}" -p"${PASS}" < "${FILE_SQL}"
复制代码
以下链接由康盛公司技术人员提供,谢谢他们的大力支持:
|