查询字符串太长时数据库连接丢失
Database connection lost whenever query string is too long
我最近从单个 VM 上的 运行 my Rails app 切换到单独 (Debian Buster) VM 上的 运行 数据库 — MariaDB 10.3。现在数据库位于单独的服务器上,每当 Rails 试图在 SQL 本身很长的地方进行查询时,它会立即抛出 Mysql2::Error::ConnectionError: MySQL server has gone away
。 (他们查询本身不一定会给系统带来很大的负载。)
导致问题的示例查询如下所示:
SELECT `articles`.`id` FROM `articles` WHERE `articles`.`namespace` = 0 AND `articles`.`wiki_id` = 1 AND `articles`.`title` IN ('Abortion', 'American_Civil_Liberties_Union', 'Auschwitz_concentration_camp', 'Agent_Orange', 'Ahimsa')
...除了标题数组长约 5000 项,完整的查询字符串约为 158kB。
在数据库端,这对应于这样的警告:
2021-03-25 15:47:13 10 [Warning] Aborted connection 10 to db: 'dashboard' user: 'outreachdashboard' host: 'programs-and-events-dashboard.globaleducation.eqiad1.wikimed' (Got an error reading communication packets)
问题好像出在网络层,但我一直没法追根究底。我试过调整许多 MariaDB 配置变量(max_allowed_packet
、innodb_log_buffer_size
、innodb_log_file_size
、innodb_buffer_pool_size
),但其中 none 有所不同。问题似乎是连接在尝试将长 SQL 查询字符串从应用程序服务器传输到数据库服务器时中止。 (从数据库接收大查询结果没有相应的问题。)
将它发布到 dba.stackexchange.com 后不久,我想通了!
问题已通过在 Rails 应用程序服务器上升级 libmariadb-dev 并重建 mysql2
gem.
解决
以前,系统 运行 在具有 mariadb-10.1 数据库的单个服务器上。切换到单独的数据库服务器后,数据库在 mariadb-10.3 上,但它仍然从与以前相同的 Rails 环境连接,mysql2
gem 是针对 10.1 构建的。
我最近从单个 VM 上的 运行 my Rails app 切换到单独 (Debian Buster) VM 上的 运行 数据库 — MariaDB 10.3。现在数据库位于单独的服务器上,每当 Rails 试图在 SQL 本身很长的地方进行查询时,它会立即抛出 Mysql2::Error::ConnectionError: MySQL server has gone away
。 (他们查询本身不一定会给系统带来很大的负载。)
导致问题的示例查询如下所示:
SELECT `articles`.`id` FROM `articles` WHERE `articles`.`namespace` = 0 AND `articles`.`wiki_id` = 1 AND `articles`.`title` IN ('Abortion', 'American_Civil_Liberties_Union', 'Auschwitz_concentration_camp', 'Agent_Orange', 'Ahimsa')
...除了标题数组长约 5000 项,完整的查询字符串约为 158kB。
在数据库端,这对应于这样的警告:
2021-03-25 15:47:13 10 [Warning] Aborted connection 10 to db: 'dashboard' user: 'outreachdashboard' host: 'programs-and-events-dashboard.globaleducation.eqiad1.wikimed' (Got an error reading communication packets)
问题好像出在网络层,但我一直没法追根究底。我试过调整许多 MariaDB 配置变量(max_allowed_packet
、innodb_log_buffer_size
、innodb_log_file_size
、innodb_buffer_pool_size
),但其中 none 有所不同。问题似乎是连接在尝试将长 SQL 查询字符串从应用程序服务器传输到数据库服务器时中止。 (从数据库接收大查询结果没有相应的问题。)
将它发布到 dba.stackexchange.com 后不久,我想通了!
问题已通过在 Rails 应用程序服务器上升级 libmariadb-dev 并重建 mysql2
gem.
以前,系统 运行 在具有 mariadb-10.1 数据库的单个服务器上。切换到单独的数据库服务器后,数据库在 mariadb-10.3 上,但它仍然从与以前相同的 Rails 环境连接,mysql2
gem 是针对 10.1 构建的。