Yesterday is a history, tomorrow is a mystery, but today is a gift. 收藏本站
登陆 / 注册 搜索

阅读:4.9K   回复: 3

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 个新文件,请自行备份原来的文件

具体可看官方 Git:forum_post表最终方案table_forum_post.phpdiscuz_database.phpdb_driver_mysqli.php

source/class/db/db_driver_mysqli.php👴‏👠🛏🤤🧠
https://gitee.com/Discuz/DiscuzX/blob/v3.5/upload/source/class/db/db_driver_mysqli.php

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

🤞🎢🥄🈴🐟‍

2020-05-02 更新注意,table_forum_post.php 官方最新的文件,添加了一条判断,请在公共配置文件 config/config_global.php 加上

  1. $_config['db']['common']['engine'] = 'innodb';
复制代码


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

👍🎠🌰🚭🐴‌source/class/table/table_forum_post.php
https://gitee.com/Discuz/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 , 售价: 10 个金币)
帖子热度 4971 ℃

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

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

哈哈富贾,可为吾友乎?
solife 「锋芒初露」 2020-5-2 15:13 |显示全部楼层

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

为什么要转 InnoDB?是真的快了么。
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表