Discuz教程网

[二次开发] Discuz X2论坛数据库MyISAM转InnoDB的脚本

[复制链接]
authicon dly 发表于 2013-4-11 14:29:15 | 显示全部楼层 |阅读模式
forum_post)由于索引结构问题当时未完成转换。09月28日,看过 NetSeek@LinuxTone 的帖子,自己写了个脚本,完成了这三个表的转换。

为了便于一次性操作,我重写了整个脚本,或许其他人有用。在我的实例中,这三个表的实际名字是有pre_前缀的。所以还请根据实际情况做库名和表明的更改。

  1. #!/bin/bash
  2. #dx2_myisam2innodb.sh
  3. USER="root"
  4. PASS="chang.me.please"
  5. FILE_SQL="sql.myisam2innodb"
  6. NAME_DB="discuzX2"

  7. cat > "${FILE_SQL}" << EOF
  8. USE ${NAME_DB};
  9. ALTER TABLE pre_forum_postposition DROP PRIMARY KEY,ADD PRIMARY KEY(position,tid);
  10. ALTER TABLE pre_common_member_grouppm DROP PRIMARY KEY,ADD PRIMARY KEY(gpmid,uid);
  11. ALTER TABLE pre_forum_post DROP PRIMARY KEY,ADD PRIMARY KEY(position,tid);
  12.    
  13. EOF
  14.    
  15. 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}"
  16. 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 的操作,也就是说建议使用如下脚本:

  1. #!/bin/bash
  2. #dx2_myisam2innodb.sh
  3. USER="root"
  4. PASS="chang.me.please"
  5. FILE_SQL="sql.myisam2innodb"
  6. NAME_DB="discuzX2"

  7. cat > "${FILE_SQL}" << EOF
  8. USE ${NAME_DB};
  9. EOF
  10.          
  11. 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}"
  12. mysql -u"${USER}" -p"${PASS}" < "${FILE_SQL}"
复制代码

以下链接由康盛公司技术人员提供,谢谢他们的大力支持:
游客,如果您要查看本帖隐藏内容请回复






上一篇:Discuz X论坛二次开发教程之$discuz_action的用处
下一篇:用Discuz/UCenter账号实现Wifi登录认证
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 01:33

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表