【发布时间】:2022-01-19 06:42:37
【问题描述】:
使用 docker compose(和 ACI 集成),我启动要在 Azure 容器实例中运行的服务。其中一项服务是 SQL Server 2019 docker 容器。让容器启动并运行需要一点时间。但是,即使 SQL Server 容器处于运行状态并且日志显示它已成功启动,SQL Server 也需要很长时间(几分钟)才能接受连接。
有人知道为什么需要这么长时间吗?
因此,当尝试使用 sqlcmd 连接到服务器时,在服务器启动后几分钟后,我不断收到以下响应:
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x102.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
更新 [2021/12/22]:
我还想知道为什么从 DB 容器中执行的“top”命令会显示以下内容。 mssql 进程使用几乎 100% 的 CPU。但是,CPU 的整体状态(请参阅“%Cpu(s):”行)显示 CPU 空闲率为 66%。 有人知道为什么吗?
【问题讨论】:
-
你试过自己研究这个吗?你试过什么有帮助/没有帮助?最早的谷歌搜索结果之一:github.com/microsoft/mssql-docker/issues/644
-
你运行
docker logs <container_id> | less了吗?您可能会观察到 SQL Server 需要一些时间来加载每个系统和用户数据库,其中包括回滚不完整的事务、验证页面以及将文件升级到最新的文件格式版本。只有在那之后,它才会打开一个服务器套接字来接受客户端连接。有人会假设您的 Docker/k8s 健康检查应该测试 mssql 进程是否正在接受连接,而不仅仅是该进程本身正在运行。 -
@Alex 是的,我已经做了一些研究,但还没有找到答案。感谢您在 github 上向我指出该问题。
-
@AlwaysLearning 是的,我总是先检查容器日志。从日志中可以看出,服务器已准备就绪。没有用户数据库,它只是一个空服务器(带有主数据库等)。日志显示“服务器正在侦听任何地址..”,它最后还包含以下消息,通常表明(我从本地运行 ????♀️ 它知道)数据库已启动。
Recovery is complete. This is an informational message only. No user action is required.但是,服务器通常会在几分钟后不接受任何远程连接。 -
可能是,公网DNS地址未设置,MSSQL服务尚未启动,首次尝试连接的容器未绑定。
标签: sql-server azure docker docker-compose azure-container-instances