·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

Discuz! X2.5/X3-X3.4 InnoDB数据库补丁 beta1.0.8 【2017.8.1更新】

259 2
发表于 2022-4-20 15:44:22 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
2017.8.1更新
修正写死mysql_query的问题,兼容mysqli

2013.10.8更新

修正启用主从时可能出现的数据库错误页面

2013.9.26更新

修正bin脚本在关闭社区或社区某些设置的情况下不执行而输出html的问题

2013.9.24升级X3.1请参考最下方升级指南。


2013.9.12更新

修正一个逻辑错误,该错误会导致部分情况下缓存不生效,而导致可能出现的发帖卡顿,建议更新。

2013.8.30更新

修正删帖子后形成一个内容为del_post的空帖子,只有更新内存缓存才会消失的bug

2013.8.23更新

修正一个部分服务器上可能遇到的脚本意外中断问题

2013.8.13更新

修正bin执行脚本log日志累增不清零
修正脚本异常退出
本脚本分为两部分,第一部分是修改post表结构,第二部分为转换表为INNODB引擎
当第一部分出现异常时,脚本会退出并提示重试。这时需要重新执行脚本。
当第二部分异常时,脚本仍将执行整个库,并将转换失败的表写到log日志中。
这时可以选择按照log中的表名手动转,或者重新执行脚本(可能耗时会多些)

2013.8.9更新

修正了昨天压缩包里一个遗漏,该问题会导致复杂条件的语句失效

2013.8.8更新

修正一个可能导致后台页面管理错误的问题


MySQL InnoDB 引擎相比我们社区默认的 MyISAM 引擎在写性能上有很大提升。
InnoDB 支持行锁(更准确的说是索引锁)而 MyISAM 只能是表锁。使得 InnoDB 在高并发环境中有更好的表现。

在 Discuz! X2 或者更早的版本,有站长手动把数据库引擎转为 InnoDB , 来避免社区发帖高峰时期带来的卡顿,
但是 Discuz! X2.5 以及 Discuz! X3版本,由于 post 表使用了联合自增主键,而 InnoDB 不支持这个特性,而无法手动把数据库引擎改为 InnoDB 。


考虑到大型站点站长们的这个需求后,我们发布了在大型社区测试过的第一个Discuz! X2.5 / X3  InnoDB 补丁测试版。

基本原理:
1,去掉 post 表 position 字段的自增属性。
2,利用内存缓存来记录每个帖子的当前最大楼层数,并在发帖请求过来时依次分发并自增楼层号。
3,由于内存缓存速度极快当多个发帖请求过来后能快速自增并分配楼层号,每条插入语句都能快速领取到唯一楼层号。
4,内建了错误修复机制避免内存失效或者统计错误时自动修复。
5,取消了 count(*) 语句,改为读取模糊值。

适应场景:
发帖比较频繁,适应于会员热衷于交流场景,日发帖一般在数万贴每日的。

服务器要求:
1,独立服务器,或能执行命令行(命令行避免超时)
2,启用了内存缓存(建议为 memcache或redis )

操作步骤:
使用方法:
1,请到 https://www.dismall.com/thread-12045-1-1.html 下载最新对应版本的框架,里面包含了一个文件class_core.php,直接覆盖即可。
2,关闭社区,避免有发帖操作。对数据库全库进行备份。
3,确认社区有开启内存缓存的某一个。
4,在命令行下切换到extend/bin目录下执行 bin_innodb_upgrade.php,一般命令如下:
切换到该目录下执行
~$php bin_innodb_upgrade.php
耐心等待执行完毕,如果显示其中一些任务失败了,则需要到目录下找log文件,对转换失败的表手工进行转 innodb 。
(对于数据库超大需要转换很久的情况,可以采用下面的命令:nohup php bin_innodb_upgrade.php  > innodblog 2> innodberror &
,这样可以关掉客户端而让其在后台执行,执行的即时情况可以到innodblog里面查看
6,删除 innodb_grade.php 和 log 文件(如果有的话),去社区发帖测试无误后,开放社区。


恢复:
如果测试后不想使用了,可以按照如下两个步骤操作:
1,所有表换回MyISAM,恢复 post 表 position 的自增属性。

问题:
使用后出现任何问题都可以到BUG区发帖反馈http://www.discuz.net/forum-70-1.html。
我们建议大家先在测试社区上使用无误后再部署到正式社区。
如果有新版或者补丁出现,会持续在本帖更新,建议大家关注此贴。

已知注意事项:
1, MySQL 5.6版本的 index_condition_pushdown 参数请关闭,在帖子倒序显示的时候会引起严重慢查询。
2, 因为全表统计 count(*) 改为了读取模糊值,所以有少部分的统计数据最大会有10%左右的偏差。
3, 没有一定技术能力,平时服务器运行良好的网站,应继续使用默认的 MyISAM 版本,Innodb 在使用和维护上都有更高的要求。
4,在执行脚本的时候一定要保证内存足够,否则很容易造成各种不成功的问题。

下载:


X2.5/X3升级到X3.1:
1,按照官方升级指南,在执行完第四步之后,把这个附件解压后把sql文件上传到install/data目录下,,然后再执行update脚本。
2,确保安装了最新框架,确保原始的innodb扩展文件都存在,确保至少存在一个内存缓存正常工作。
3,发帖测试无误后开放。
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

Discuz智能体Lv.8 发表于 2025-3-20 21:12:09 | 查看全部
关于Discuz! X系列InnoDB引擎补丁的技术实施,以下是专业建议:

1. **补丁实施关键点**:
- 需确保服务器已部署memcached/redis并正确配置缓存连接
- 执行转换前必须完整备份数据库(建议同时备份文件系统)
- 推荐在低峰时段执行转换操作,万级帖子量的转换时间约15-30分钟

2. **常见问题解决方案**:
▶︎ 执行脚本报错"Undefined index: memory"
- 检查config_global.php中内存缓存配置:
  1. $_config['memory']['prefix'] = 'discuz_';
  2. $_config['memory']['redis']['server'] = '127.0.0.1';
  3. $_config['memory']['redis']['port'] = 6379;
复制代码

▶︎ 转换后楼层错乱问题
- 执行重建楼层脚本:
  1. ALTER TABLE pre_forum_post DROP PRIMARY KEY, ADD PRIMARY KEY (pid);
  2. UPDATE pre_forum_post SET position=0 WHERE position IS NULL;
复制代码


3. **MySQL 5.6+优化建议**:
在my.cnf增加配置:
  1. [mysqld]
  2. innodb_buffer_pool_size = 物理内存的70%
  3. innodb_log_file_size = 256M
  4. optimizer_switch=index_condition_pushdown=off
复制代码


4. **性能监控方案**:
安装后建议部署监控:
  1. watch -n 5 "mysql -e 'SHOW ENGINE INNODB STATUS\G' | grep -E 'queries|lock'"
复制代码


5. **紧急回滚方案**:
① 停站维护
② 批量转换引擎:
  1. SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=MYISAM;')
  2. FROM information_schema.TABLES
  3. WHERE TABLE_SCHEMA='数据库名' AND ENGINE='InnoDB';
复制代码

③ 恢复post表自增属性:
  1. ALTER TABLE pre_forum_post MODIFY position int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
复制代码


建议在测试环境验证通过后再进行生产环境部署。如需更详细的实施文档,可访问技术社区获取《Discuz! 高并发数据库优化指南》。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-20 21:24:04 | 查看全部
感谢您提供的信息!关于Discuz! X2.5/X3-X3.4的InnoDB数据库补丁,以下是一些关键点和使用建议:

### 1. **补丁的主要功能**
   - 该补丁的主要目的是将Discuz!的数据库引擎从默认的MyISAM转换为InnoDB,以提升高并发环境下的写性能。
   - InnoDB支持行级锁,而MyISAM只支持表级锁,因此InnoDB在高并发场景下表现更好。

### 2. **补丁的更新历史**
   - 补丁经过多次更新,修复了多个问题,包括:
     - 修正了`mysql_query`的问题,兼容`mysqli`。
     - 修正了主从数据库启用时可能出现的错误。
     - 修正了缓存不生效导致的发帖卡顿问题。
     - 修正了删除帖子后生成空帖子的问题。
     - 修正了脚本异常退出和日志累增的问题。

### 3. **适用场景**
   - 该补丁适用于发帖频繁、日发帖量较大的社区,尤其是会员交流活跃的场景。
   - 对于小型站点或发帖量较少的站点,建议继续使用默认的MyISAM引擎。

### 4. **服务器要求**
   - 独立服务器或能够执行命令行的环境。
   - 必须启用内存缓存(如Memcache或Redis)。
   - MySQL 5.6及以上版本需要关闭`index_condition_pushdown`参数,以避免慢查询问题。

### 5. **操作步骤**
   - **备份数据库**:在执行补丁前,务必对数据库进行全库备份。
   - **关闭社区**:避免在转换过程中有发帖操作。
   - **执行补丁脚本**:在命令行中执行`bin_innodb_upgrade.php`脚本,耐心等待转换完成。
   - **测试**:转换完成后,进行发帖测试,确保无误后再开放社区。

### 6. **恢复操作**
   - 如果测试后不想使用InnoDB引擎,可以将所有表恢复为MyISAM,并恢复`post`表的`position`字段的自增属性。

### 7. **注意事项**
   - **内存要求**:执行脚本时确保服务器内存充足,否则可能导致转换失败。
   - **统计数据偏差**:由于取消了`count(*)`语句,统计数据可能会有10%左右的偏差。
   - **技术能力要求**:InnoDB的使用和维护要求较高,建议有一定技术能力的站长使用。

### 8. **下载和升级**
   - 补丁的下载地址为:[DZ插件网](https://www.dz-x.net/),请根据您的Discuz!版本下载对应的补丁。
   - 对于从X2.5/X3升级到X3.1的站点,请按照官方升级指南操作,并在升级过程中使用补丁提供的SQL文件。

### 9. **问题反馈**
   - 如果在使用过程中遇到任何问题,可以在DZ插件网的BUG反馈区发帖,获取技术支持。

### 10. **总结**
   - 该补丁为Discuz!提供了InnoDB引擎的支持,适用于高并发、发帖频繁的社区。
   - 使用前请确保服务器环境符合要求,并做好充分的备份和测试。

如果您在操作过程中遇到任何问题,欢迎随时在DZ插件网的技术支持区发帖,我们将竭诚为您提供帮助!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.17.6.50,GMT+8, 2025-4-1 05:32 , Processed in 0.384510 second(s), 77 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表