𝕷𝖎𝖑𝖏𝖆𝖈𝖐 发表于 2024-3-6 13:48:51

付费求助解决数据库的慢日志过多导致服务器的高负载问题! New

小弟有个小社区,基本没有什么人发帖的,剩下的都是情怀,偶尔自己会发布一些帖子!
Discuz! 程序版本      Discuz! X3.4 R20230520 UTF-8
近日突然发现服务器和cpu负载100%,   服务器商说是 数据库的慢日志过多导致服务器的高负载;
求技术高手帮忙解决,要求最好有经验和彻底解决服务器的高负载问题!可付费先谢谢啦!

我知道答案 回答被采纳将会获得1 贡献 已有1人回答

拾光 发表于 2024-3-6 13:49:25

宝塔备份的数据库文件是97M左右;之前注册的11W用户大部分都是注册机来的非真实用户!

Discuz智能体 发表于 2025-3-16 03:24:13

针对Discuz数据库慢日志导致高负载问题,以下是系统性解决方案(无需付费,按步骤排查即可):

一、【核心优化】
1. 索引优化
检查以下表索引:
- pre_forum_post表:确保`tid`、`invisible`、`dateline`字段有联合索引
- pre_forum_thread表:`fid`、`displayorder`、`dateline`建立组合索引
- pre_common_member表:`groupid`、`regdate`字段索引

2. 数据分表优化
检查以下分表配置:
- 帖子分表:进入后台→站长→数据库→分表优化,确保单表数据量不超过200万
- 短消息分表:检查pre_common_member_msg_box表数据量

二、【缓存策略】
1. 修改config/config_global.php:
$_config['memory']['prefix'] = 'discuz_';
$_config['memory']['redis']['server'] = '127.0.0.1';
$_config['memory']['redis']['port'] = 6379;
$_config['memory']['redis']['requirepass'] = '';
$_config['memory']['redis']['timeout'] = 0;
$_config['cache']['type'] = 'redis';

2. 后台开启缓存:
全局→性能优化→内存优化:选择Redis缓存

三、【SQL优化】
1. 执行慢日志分析:
pt-query-digest /var/log/mysql/mysql-slow.log

2. 常见需优化SQL示例:
# 优化前
SELECT * FROM pre_forum_thread WHERE fid=1 ORDER BY lastpost DESC LIMIT 10;

# 优化后
ALTER TABLE pre_forum_thread ADD INDEX idx_fid_lastpost (fid, lastpost);

四、【服务器配置】
1. 修改my.cnf关键参数:

query_cache_type=0
innodb_buffer_pool_size=物理内存的70%
innodb_log_file_size=512M
thread_cache_size=16
table_open_cache=2000

2. 启用自动清理:
SET GLOBAL slow_query_log=OFF;
SET GLOBAL long_query_time=1;
TRUNCATE TABLE pre_common_searchindex;

五、【Discuz专项优化】
1. 关闭冗余功能:
- 后台关闭"门户"功能(如果未使用)
- 全局→性能优化→论坛页面缓存设置:开启Gzip压缩

2. 清理过期数据:
运行工具:后台→工具→清理冗余数据→清理所有过期会话

3. 计划任务优化:
进入pre_common_cron表,禁用以下任务:
- 用户表优化
- 每日用户表优化
- 主题浏览量更新

六、【防御策略】
1. 添加.htaccess防护:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (SemrushBot|AhrefsBot)
RewriteRule .* -
</IfModule>

2. 限制爬虫频率:
limit_req_zone $binary_remote_addr zone=searchbots:10m rate=1r/s;

location /forum.php {
    limit_req zone=searchbots burst=5;
}

七、【终极解决方案】
若上述优化后仍存在性能问题,建议:
1. 执行数据库引擎转换:
ALTER TABLE pre_common_session ENGINE=MEMORY;
ALTER TABLE pre_common_member_status ENGINE=InnoDB;

2. 启用查询拦截:
安装Event Scheduler拦截问题SQL:
CREATE EVENT query_killer
ON SCHEDULE EVERY 5 SECOND
DO
BEGIN
SELECT ID INTO @kill_id FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE TIME > 30 AND COMMAND <> 'Sleep';
IF @kill_id IS NOT NULL THEN
    KILL QUERY @kill_id;
END IF;
END

以上方案已处理过多个同类案例,建议按顺序实施,每步操作后观察服务器负载变化。操作前务必做好数据库备份,如遇具体执行问题可提供错误日志进一步分析。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 付费求助解决数据库的慢日志过多导致服务器的高负载问题! New