红茶的温度和女人心在任何时代都是难以琢磨呢。 收藏本站
登陆 / 注册 搜索

阅读: 292   回复: 1

[# 其他] Discuz数据库引擎 MyISAM 转InnoDB 记录

推荐
回复 发新帖
小执念古黑浩劫 论坛大牛 2019-12-31 17:42 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
一、为什么要转 InnoDB?

简单来说,如果网站数据库不是读取远远大于写入,都应该使用 InnoDB 引擎。

二、需要注意什么?

1. 第一个事情是备份数据库,在命令行运行(备份期间最好停止论坛访问)
全屏查看
  1. mysqldump -u 用户名 -p 数据库名 > /文件路径
复制代码


2. pre_forum_post 和 pre_common_member_grouppm 数据表的改造

在数据库管理界面执行(这语句是官方给出的,不用担心)
全屏查看
  1. ALTER TABLE pre_forum_post CHANGE position position int(8) unsigned NOT NULL;
  2. ALTER TABLE pre_common_member_grouppm ADD INDEX gpmid(gpmid);
复制代码

Discuz数据库引擎 MyISAM 转InnoDB 记录 TIM截图20191231173748.png

3. 替换 3 个新文件,请自行备份原来的文件

source/class/db/db_driver_mysqli.php
https://gitee.com/ComsenzDiscuz/DiscuzX/blob/master/upload/source/class/db/db_driver_mysql.php

source/class/discuz/discuz_database.php
https://gitee.com/ComsenzDiscuz/DiscuzX/blob/v3.5/upload/source/class/discuz/discuz_database.php

source/class/table/table_forum_post.php
https://gitee.com/ComsenzDiscuz/DiscuzX/blob/v3.5/upload/source/class/table/table_forum_post.php

4. 不再支持 php mysql 驱动,需要用 mysqli

三、转换的方法有哪些?

1. ALTER TABLE 语句

将表从一个引擎修改为另一个引擎最简单的办法是使用 ALTER TABLE 语句。下面的语句将 pre_ucenter_tags 表的引擎修改为 InnoDB:
全屏查看
  1. ALTER TABLE pre_ucenter_tags ENGINE=InnoDB;
复制代码


上述语法可以适用任何存储引擎。

但有一个问题:数据太多的话需要执行很长时间。MySQL 会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。所以,在繁忙的表上执行此操作要特别小心。

2. 导出与导入

为了更好地控制转换的过程,可以使用 mysqldump 工具将数据导出到文件,然后修改文件中 CREATE TABLE 语句的存储引擎选项,最后导入数据库。

四、替换工作

这里一定要注意,Discuz 中并不是所有的数据表都是 MyISAM,有一些数据表是 HEAP(MEMORY)。Memory 的数据是存储在内存中的,速度比InnDB 快很多,如果进行转换,则反而会使论坛的性能下降。
我使用的是第一种方案。

1. 查询数据库中哪些表是 MyISAM
全屏查看
  1. SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Engine='MyISAM' AND TABLE_SCHEMA='数据库名' ;
复制代码


只需要把查询到的表转换,大概有 200 多个,因为如果使用了插件,可能会生成数据表,也要转换。

因此我不提供具体的表名,请自行查看自己 select 出来的表名然后进行下一步。这里说说我怎么做的吧,毕竟 200 多张表,手动是不可能是事情

写一个 php 脚本,放到网站根目录下:
全屏查看
  1. <?php
  2. include_once('./config/config_global.php');
  3. $servername = $_config['db']['1']['dbhost'];
  4. $username = $_config['db']['1']['dbuser'];
  5. $password = $_config['db']['1']['dbpw'];
  6. $dbname = $_config['db']['1']['dbname'];

  7. $mysqli = mysqli_connect($servername, $username, $password, $dbname) ;

  8. $dbname = '\''.$dbname.'\'';
  9. $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Engine='MyISAM' AND TABLE_SCHEMA=$dbname";

  10. //执行查询
  11. $result = $mysqli->query($sql);
  12. if($result === false){ //执行失败
  13.     echo $mysqli->error;
  14.     echo $mysqli->errno;
  15. }
  16. //输出结果
  17. while($row = $result->fetch_assoc()) {
  18. echo 'ALTER TABLE '.$row['TABLE_NAME'].' ENGINE=InnoDB;' .'<br>';

  19. }

  20. // 销毁变量
  21. $servername = '';
  22. $username = '';
  23. $password = '';
  24. $dbname = '';

  25. ?>
复制代码


dz.zip (650 Bytes, 下载次数: 0, 售价: 10 个金币)


小蕊285「初入古黑」 2019-12-31 17:42 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

哈哈富贾,可为吾友乎?
您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

关于本站|小黑屋|古黑论 网站统计

GMT+8, 2020-4-1 00:58 , Processed in 0.089698 second(s), 24 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表