Linux 上的 SQL Server 在初始启动时挂起,没有错误,也没有新的/更新的 ErrorLog 文件

Sol*_*zky 11 sql-server linux errors

我在 Linux (Ubuntu 16.04) 上使用 SQL Server 2017, Release Candidate 2 (RC2)。

当服务器启动时,SQL Server 通常也会启动。但出于某种原因,SQL Server 将无法再启动。至少我无法使用sqlcmd连接到它。我现在每次都收到 ODBC 超时(“Sqlcmd:错误:Microsoft ODBC Driver 13 for SQL Server ”)错误:

Login timeout expired.  
TCP Provider: Error code 0x2749.  
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..
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时:

ps aux | grep mssql
Run Code Online (Sandbox Code Playgroud)

我得到两个返回的条目,表明mssql用户正在运行该sqlservr进程。

此外,当我启动 VM(或重新启动服务)时,/var/opt/mssql/log/中的错误日志文件没有匹配的时间戳,该文件中也没有任何新条目。

并且,在/var/log/messages 中,所有显示的是:

这是一个评估版本。评估期还剩 [141] 天。

如果我运行systemctl status mssql-server,那么我得到以下信息:

? mssql-server.service - Microsoft SQL Server 数据库引擎
已加载:已加载(/lib/systemd/system/mssql-server.service;已启用;供应商预设:已启用)
活动:自 2017 年 9 月以来失败(结果:退出代码) -04 20:01:56 英国夏令时;36 年代前的
文档:https
://docs.microsoft.com/en-us/sql/linux 进程:8009 ExecStart=/opt/mssql/bin/sqlservr(代码=退出,状态=255)
主 PID:8009(代码=退出,状态 = 255)

Started Microsoft SQL Server Database Engine.  
This is an evaluation version.  There are [141] days left in the evaluation period.  
Stopping Microsoft SQL Server Database Engine...  
mssql-server.service: Main process exited, code=exited, status=255/n/a  
Stopped Microsoft SQL Server Database Engine.  
mssql-server.service: Unit entered failed state.  
mssql-server.service: Failed with result 'exit-code'.  
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 15

这最终导致作为root.

我一直在研究 Linux 上的 SQLCLR 是否可以像在 Windows 中那样访问 app.Config 文件(遗憾的是,它没有:Linux 上的 SQL Server 2017 忽略应用配置文件(如果它存在),或者有时会锁定如果它不存在't (SQLCLR) ) 并且在某些情况下 SQL Server 会完全锁定。发生这种情况时,阻止它的唯一方法是执行kill -9on sqlservr。有一次我再次启动服务,我通过直接执行/opt/mssql/bin/sqlservr 在我工作时这样做root(因此进程本身由 拥有root)。

sqlservrroot,身份运行没有立即出现错误或奇怪的行为,但是当 VM 重新启动并且 SQL Server 尝试正确启动(即以mssql用户身份运行)时,也就是它一开始就卡住了。

我发现运行sqlservras的直接后果root/var/opt/mssql/log/errorlog文件(以及在 SQL Server 启动时创建的其他一些文件)归root(有道理)所有。

而且,这些文件归其所有的一个直接后果root是,当进程正确启动(如mssql)时,mssql用户无权将文件重命名为以.1结尾(以及任何其他需要发生的文件,例如默认跟踪等)。但是,它不会收到权限错误,而是永远挂起。

主要的解决方法是简单地运行以下内容root(我没有尝试将其运行为mssql)。对于这两个下面的命令,sudo如果目前不作为时,才需要root,因为它会运行它的下一个命令 root(如果指定或其他一些用户-u username),被提示输入后root的密码。

sudo chown -R  mssql:mssql /var/opt/mssql
Run Code Online (Sandbox Code Playgroud)

二级修复(以确保这不会再次发生)是正确启动 SQL Server ;-):

sudo systemctl start mssql-server
Run Code Online (Sandbox Code Playgroud)