
封面:https://x.com/womiriguramu/status/1972206621821702398
1. 问题现象
今天发布《PyTorch学习笔记 2》后,后台发布文章时,页面弹出了Database Query Error,并没有显示发不成功。但奇怪的是:文章实际上已经发布。
2. 尝试上网搜索/AI
经过Google搜索关键词以及AI帮助,列出了以下可能发生的问题:
- 数据库编码/字符集问题:MySQL默认utf8编码最多支持3字节,而emoji这类字符占4自己,会导致写入失败,触发“Database Query Error”。
- 数据表结构或属性不准确:这类问题常常发生在从其他数据库迁移或手动修改数据库表结构后。
- 插件或主题出错
- 文章长度过长,超出数据库字段限制
3. 排查问题
首先我自己先简单分析了以下问题:我的文章中几乎从来不含emoji符号,因此不可能是1。 由于我不懂相关技术,我肯定是不敢轻易动任何网络后台的数据库的,所以大概率不是2。 插件和主题已经用了很长时间了,所以也不太可能是3。
接下来根据ChatGPT的指示,在config.inc.php中添加
define('__TYPECHO_DEBUG__', true);
打开debug模式,这样就能看到详细的错误信息,而不仅仅是typecho database query error了。
然后我就得到了这个(核心问题):
SQLSTATE[42000]: Syntax error or access violation: 1118
The size of BLOB/TEXT data inserted in one transaction is greater than 10% of redo log size.
Increase the redo log size using innodb_log_file_size.
经过分析,我的问题是第四个:文章太长,而InnoDB为了防止一次写太多内容,限制了单条TEXT/BLOB字段不能超过innodblogfile_size 的 10%
4. 解决问题
接下来的解决思路就很明确了:提升innodb_log_file_size这个变量的大小!
首先我们确认一下当前这个变量的大小,在myphpadmin中的SQL中输入:
SHOW VARIABLES LIKE 'innodb_log_file_size';
返回值为:5242880,说明我的这个变量仅仅有5MB。
接下来的ChatGPT指导我做以下几步:
- 在根目录中找到
my.cnf文件,这个文件通常在mysql文件夹中。 - 在这个文件中添加代码:
ini innodb_log_file_size = 256M - 删除日志文件:
nginx ib_logfile0 ib_logfile1将其删除/重命名。 - 重启MySQL服务:在宝塔面板中,需要到软件商店找到“MySQL”然后点击设置,重启。
- 验证是否生效:同样在myphpadmin中输入上面的SQL并执行,发现变量的大小已经变成了268435456,也就是256MB,说明已经生效了。
这时候重新发布文章,就大概不会出现问题了。
5. 总结
我自己是一点都不懂这些技术,但通过ChatGPT和网上的各种搜索,也算是找到了问题并以一种不知道是否正确的方式进行了解决,最后从表面上来看似乎确实是解决了。 这里仅仅作为问题解决的记录,以免这个方案以后出现新的衍生问题后,忘记我干了什么。 在这里要特别鸣谢那些写博客记录这个错误的人,以及最重要的ChatGPT,如果没有这些的指导,作为一个完全不懂技术的人恐怕是永远解决不了这个问题了。