我有 2 台 Linux 服务器。1 台运行带有 PHP 应用程序的 apache2,另一台运行 mysql 5.7。(因此是到 DB 的远程连接)
PHP 应用程序尝试从文件 (90MB) 创建 BIGBLOB 并将其存储到 SQL 中。
但是我得到了这个错误:(这只发生在更大的BLOB上)PHP:
[PDOException] SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
MYSQL:
2022-03-24T14:22:41.443626Z 268701 [Note] Aborted connection 268701 to db: 'bug' user: 'user' host: 'subdomain.hostname.com' (Got an error reading communication packets)
我搜索了整个互联网。我做了以下更新:将 max_allowed_packet 设置为 1GB,我检查了:wait_timeout 和 interactive_timeout 都没有问题(28880 秒)我添加了 SWAP 内存。但没有任何效果。有什么想法吗?
附言:似乎 30 秒后某处连接被切断。但我不能确定,也不知道原因。
这是 MySQL 设置:
mysql> show global variables like "%timeout%";
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 120 |
| net_write_timeout | 120 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
max_allowed_packet | 1073741824 |
内存:
total used free shared buff/cache available
Mem: 7976 1056 256 1 6663 6630
Swap: 10239 8 10231
答案1
“消失”通常是由一些非常长的查询超出某些设置引起的。然而,这听起来像是另一个问题。读取一行的默认大小只有几 MB。此外,我认为硬性限制为 16MB。也就是说,提高“..._size”是不够的。
您将如何处理 90MB 的 BLOB?考虑将其放在文件,并将元信息放入数据库中。即使对于 MB 大小的 jpeg,这也比将其放入数据库更实用、更高效。
进一步讨论 BLOB,并提供SHOW CREATE TABLE
一些您计划使用的查询。然后我可能会有进一步的建议。