运行 SQL 容器中的 运行 SQL 语句导致网络连接丢失
Lost network connection from long running SQL statement in MySQL Docker container
我有一个很长的 运行ning SQL 语句,当我 运行 它针对来自本地 Docker 容器内的 AWS RDS 实例时超时。
我有一个 .env
文件,它定义了 运行 命令所需的一些环境变量。
我进入 Docker 容器:
docker run -i -t --env-file .env mysql:8.0.20 /bin/bash
进入容器后,我 运行 一个很长的 运行ning SQL 命令在大约 5 分钟后一直超时。
mysql \
mydatabase \
--host=${MYSQL_RDS_HOST} \
--port=3306 \
--user=${MYSQL_USER} \
--password=${MYSQL_PASSWORD} << EOF
INSERT INTO copy_of_really_big_table (
id, columna, columnb, columnc
)
SELECT id, columna, columnb, columnc FROM really_big_table;
EOF
我收到的错误是 ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
。
我可以使用 show processlist
在 RDS 实例上看到查询 运行ning,所以我知道查询正在通过 RDS。一旦发生超时,查询将继续 运行 直至完成。
我试过:
- 在
mysql
命令行上提供 --reconnect
- 在 MySQL
中提高 net_read_timeout
- 在 MySQL
中提高 net_write_timeout
- 在 MySQL
中提高 connection_timeout
- 在 MySQL
中提高 wait_timeout
- 在 MySQL
中提高 interactive_timeout
虽然我怀疑这一切都是徒劳的,因为我可以从我的桌面(Docker 容器之外)运行 命令。大约需要一个小时,但 运行 完成没问题。
如果我 运行 来自本地 Docker 容器内的 SQL 语句针对另一个本地 MySQL Docker容器。
我已经在 Windows 和 Mac 上重复了这个问题。 MySQL RDS 版本为 8.0.20。 Docker容器MySQL也是8.0.20.
我真的希望我的本地容器配置不正确。是否有网络超时设置?或者也许我没有正确路由?或者可能有一个我没有看到的 RDS 设置?
任何帮助将不胜感激,尤其是关于如何实际调试此类问题的提示。谢谢!
调整 net.ipv4.tcp_keepalive_time
为我解决了这个问题。默认值为 7200 秒,但 Docker 中的 vpnKitMaxPortIdleTime
for Mac 默认为 300 秒,这允许端口超时。
docker run -i -t --env-file .env --sysctl net.ipv4.tcp_keepalive_time=150 mysql:8.0.20 /bin/bash
我用了 150 秒,但只要少于 300 秒就足够了。
我有一个很长的 运行ning SQL 语句,当我 运行 它针对来自本地 Docker 容器内的 AWS RDS 实例时超时。
我有一个 .env
文件,它定义了 运行 命令所需的一些环境变量。
我进入 Docker 容器:
docker run -i -t --env-file .env mysql:8.0.20 /bin/bash
进入容器后,我 运行 一个很长的 运行ning SQL 命令在大约 5 分钟后一直超时。
mysql \
mydatabase \
--host=${MYSQL_RDS_HOST} \
--port=3306 \
--user=${MYSQL_USER} \
--password=${MYSQL_PASSWORD} << EOF
INSERT INTO copy_of_really_big_table (
id, columna, columnb, columnc
)
SELECT id, columna, columnb, columnc FROM really_big_table;
EOF
我收到的错误是 ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
。
我可以使用 show processlist
在 RDS 实例上看到查询 运行ning,所以我知道查询正在通过 RDS。一旦发生超时,查询将继续 运行 直至完成。
我试过:
- 在
mysql
命令行上提供--reconnect
- 在 MySQL 中提高
- 在 MySQL 中提高
- 在 MySQL 中提高
- 在 MySQL 中提高
- 在 MySQL 中提高
net_read_timeout
net_write_timeout
connection_timeout
wait_timeout
interactive_timeout
虽然我怀疑这一切都是徒劳的,因为我可以从我的桌面(Docker 容器之外)运行 命令。大约需要一个小时,但 运行 完成没问题。
如果我 运行 来自本地 Docker 容器内的 SQL 语句针对另一个本地 MySQL Docker容器。
我已经在 Windows 和 Mac 上重复了这个问题。 MySQL RDS 版本为 8.0.20。 Docker容器MySQL也是8.0.20.
我真的希望我的本地容器配置不正确。是否有网络超时设置?或者也许我没有正确路由?或者可能有一个我没有看到的 RDS 设置?
任何帮助将不胜感激,尤其是关于如何实际调试此类问题的提示。谢谢!
调整 net.ipv4.tcp_keepalive_time
为我解决了这个问题。默认值为 7200 秒,但 Docker 中的 vpnKitMaxPortIdleTime
for Mac 默认为 300 秒,这允许端口超时。
docker run -i -t --env-file .env --sysctl net.ipv4.tcp_keepalive_time=150 mysql:8.0.20 /bin/bash
我用了 150 秒,但只要少于 300 秒就足够了。