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的也就不用再费事儿重复操作了。
本文出自 “阿泰—开源寻径” 博客,请务必保留此出处