一、为什么要转 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 个金币)