AFAICT 当您从任何客户端向 MySQL 发送查询时,它总是阻塞并等待服务器响应成功或失败。
当执行缓慢的操作(例如在大型表上添加新索引)时,这可能是一个问题,因为它会使客户端处于空闲状态,等待很长时间才能响应。
就我而言,我特别想从 AWS Lambda 函数发送请求。
我在这里找到了一些关于如何分离客户端进程并将客户端进程置于后台的提示https://stackoverflow.com/a/41371255/202168mysql
,还有一些建议,如果客户端关闭连接,MySQL服务器可能会取消请求。但启动客户端的主机mysql
仍然必须保持运行。
感觉这还不是全部?
PostgreSQLCREATE INDEX CONCURRENTLY
为此目的,即查询快速返回并且索引构建在服务器上继续。
我知道MySQL不支持CREATE INDEX CONCURRENTLY
但感觉很奇怪,没有非阻塞的客户端方法?(好吧......有“异步”或“非阻塞”客户端,但它们仍然必须保持相同的连接打开)
我想做的是这样的:
- 发送
ALTER TABLE ... ADD KEY
查询 - 获取查询的服务器端进程 ID
- 注销 mysql 客户端(并结束我的 Lambda 执行)
- 继续
ADD KEY
在服务器上运行 - 从新进程中,定期轮询 DDL 查询的进程 ID,看看它是完成还是失败
有什么办法可以实现这一点吗?
相关或替代问题:如果我在发送查询后断开客户端连接,是否会ADD KEY
继续运行直至完成/失败而不是被取消?
服务器是AWS RDS上的MySQL 8.0.35,InnoDB表。
对,那是正确的。实际结果是您无法从 Lambda 运行长时间运行的查询(包括 DDL),因为 Lambda 有 15 分钟的时间限制。
您可以研究使用AWS Batch来运行长时间运行的任务。我对此没有任何经验,但我看到其他帖子推荐它用于 Lambda 太简短的情况。
除此之外,您最好从 EC2 实例上的客户端运行 DDL,这样就不会超时。您可以使用任何具有到 MySQL 实例的网络路由的 EC2 实例。它甚至可能位于另一个区域,因为运行单个 SQL 语句所需的带宽非常小。
我不这么认为。服务器可以检测到客户端已断开连接,并终止会话和任何正在进行的查询。也许不是每次,但我不会依赖它。
此外,您应该允许客户端运行完成,以防 DDL 操作在完成之前出现错误。你想要得到一个好的结果,这样你就可以知道它是否成功。