一、为什么要转 InnoDB?
简单来说,如果网站数据库不是读取远远大于写入,都应该使用 InnoDB 引擎。
二、需要注意什么?👵👒🔍😷🤛
1. 第一个事情是
备份数据库,在命令行运行(备份期间最好停止论坛访问)
- mysqldump -u 用户名 -p 数据库名 > /文件路径
复制代码
2. pre_forum_post 和 pre_common_member_grouppm 数据表的改造
👩✈️👠🔭😡👎
在数据库管理界面执行(这语句是官方给出的,不用担心)
- ALTER TABLE pre_forum_post CHANGE position position int(8) unsigned NOT NULL;
- ALTER TABLE pre_common_member_grouppm ADD INDEX gpmid(gpmid);
复制代码
🧓👙🖌🤤🤌
3. 替换 3 个新文件,请自行备份原来的文件
具体可看官方 Git:
forum_post表最终方案、
table_forum_post.php、
discuz_database.php、
db_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 加上
- $_config['db']['common']['engine'] = 'innodb';
复制代码
👮♂️💍💰🙃🤌
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:
🤌🗺🦞®🐝
- ALTER TABLE pre_ucenter_tags ENGINE=InnoDB;
复制代码
上述语法可以适用任何存储引擎。
👩🧣🛒😷🦷
但有一个问题:数据太多的话需要执行很长时间。MySQL 会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上会加上读锁。所以,在繁忙的表上执行此操作要特别小心。
2. 导出与导入
为了更好地控制转换的过程,可以使用 mysqldump 工具将数据导出到文件,然后修改文件中 CREATE TABLE 语句的存储引擎选项,最后导入数据库。
✍🛩🥚♻🐙
四、替换工作
这里一定要注意,Discuz 中并不是所有的数据表都是 MyISAM,有一些数据表是 HEAP(MEMORY)。Memory 的数据是存储在内存中的,速度比InnDB 快很多,如果进行转换,则反而会使论坛的性能下降。
我使用的是第一种方案。
🙌⛪🍍🆒🐻
1. 查询数据库中哪些表是 MyISAM
- SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Engine='MyISAM' AND TABLE_SCHEMA='数据库名' ;
复制代码
只需要把查询到的表转换,大概有 200 多个,因为如果使用了插件,可能会生成数据表,也要转换。
🙌🦼🍪✔🦟
因此我不提供具体的表名,请自行查看自己 select 出来的表名然后进行下一步。这里说说我怎么做的吧,毕竟 200 多张表,手动是不可能是事情
写一个 php 脚本,放到网站根目录下:
全屏查看- <?php👨⚕️👓🖲🤬🦴
- include_once('./config/config_global.php');
- $servername = $_config['db']['1']['dbhost'];
- $username = $_config['db']['1']['dbuser'];
- $password = $_config['db']['1']['dbpw'];
- $dbname = $_config['db']['1']['dbname'];
👁🗼🍍⁉🕊
- $mysqli = mysqli_connect($servername, $username, $password, $dbname) ;
- $dbname = '\''.$dbname.'\'';
- $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Engine='MyISAM' AND TABLE_SCHEMA=$dbname";
👈🌡🍟🆒🐠
- //执行查询
- $result = $mysqli->query($sql);
- if($result === false){ //执行失败
- echo $mysqli->error;
🧠🪐🎂♻🐝 - echo $mysqli->errno;
- }
- //输出结果
- while($row = $result->fetch_assoc()) {
- echo 'ALTER TABLE '.$row['TABLE_NAME'].' ENGINE=InnoDB;' .'<br>';
👈🗺🥄🚭🦚
- }
- // 销毁变量
- $servername = '';
🦴🚠🍓♑🐝 - $username = '';
- $password = '';
- $dbname = '';
- ?>
复制代码
🖕🌞🍽©🐒
dz.zip
(650 Bytes , 售价: 10 个金币)