SQL Server en Linux se bloquea en el inicio inicial, sin errores y sin archivo ErrorLog nuevo / actualizado


11

Estoy usando SQL Server 2017, Release Candidate 2 (RC2) en Linux (Ubuntu 16.04).

Cuando se inicia el servidor, SQL Server generalmente también se inicia. Pero por alguna razón, SQL Server ya no se iniciará. Al menos no puedo conectarme a él usando sqlcmd . Ahora recibo un error de tiempo de espera ODBC ( "Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server ") cada vez:

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..

Sin embargo, cuando corro:

ps aux | grep mssql

Me devuelven dos entradas que muestran que el mssqlusuario está ejecutando el sqlservrproceso.

Además, el archivo de registro de errores en / var / opt / mssql / log / no tiene una coincidencia de marca de tiempo cuando inicié la VM (o reinicié el servicio), ni hay nuevas entradas en ese archivo.

Y, en / var / log / messages , todo lo que aparece es:

Esta es una versión de evaluación. Quedan [141] días en el período de evaluación.

Si corro systemctl status mssql-server, obtengo lo siguiente:

● mssql-server.service: motor de base de datos de Microsoft SQL Server
cargado: cargado (/lib/systemd/system/mssql-server.service; habilitado; proveedor preestablecido: habilitado)
Activo: fallido (Resultado: código de salida) desde lunes 2017- 09-04 20:01:56 BST; Hace 36s
Documentos: https://docs.microsoft.com/en-us/sql/linux
Proceso: 8009 ExecStart = / opt / mssql / bin / sqlservr (código = salido, estado = 255)
PID principal: 8009 (código = salido, estado = 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'.  

Respuestas:


15

Esto terminó como un caso de no tener cuidado al trabajar como root.

Había estado investigando si SQLCLR en Linux tendría acceso a la aplicación. Archivo de configuración como lo hace en Windows (lamentablemente, no lo hace: SQL Server 2017 en Linux ignora el archivo de configuración de la aplicación si existe, o a veces se bloquea si no lo hace) 't (SQLCLR) ) y, en determinadas circunstancias, SQL Server se bloquearía por completo. Cuando eso sucedió, la única manera de detenerlo era hacer un kill -9sobre sqlservr. Una de las veces que estaba iniciando el servicio nuevamente, lo hice ejecutando directamente / opt / mssql / bin / sqlservr y mientras trabajaba como root(de ahí que el proceso en sí fuera propiedad de root).

No hubo errores inmediatos o comportamiento extraño que resulta de funcionamiento sqlservrcomo root, pero cuando la máquina virtual reinicia y SQL Server intentaron iniciar correctamente (es decir, funcionando como el mssqlusuario), que es cuando se quedó atascado en el mismo principio.

He descubierto que una consecuencia directa del funcionamiento sqlservrcomo rootfue que el directorio / var / opt / mssql / log / log de errores de archivo (y algunos otros que se crean al iniciar SQL Server) eran propiedad de root(tiene sentido).

Y, una consecuencia directa de la propiedad de esos archivos rootes que cuando el proceso se inicia correctamente (como mssql), el mssqlusuario no tiene permiso para cambiar el nombre del archivo para terminar en .1 (y cualquier otra cosa que deba ocurrir con cualquier otro archivos, como rastreo predeterminado, etc.). Sin embargo, en lugar de obtener un error de permisos, simplemente se bloquea para siempre.

La solución principal es simplemente ejecutar lo siguiente como root(no he intentado ejecutarlo como mssql). Para los dos comandos siguientes, sudosolo es necesario cuando no está actuando actualmente, rootya que ejecutará el comando que lo sigue como root (o algún otro usuario si lo especifica -u username), después de que se le solicite ingresar la rootcontraseña.

sudo chown -R  mssql:mssql /var/opt/mssql

La solución secundaria (para asegurarse de que esto no vuelva a ocurrir) es iniciar SQL Server correctamente ;-):

sudo systemctl start mssql-server

1

Para obtener los permisos correctos y obtener errores inteligentes, necesita al menos lo siguiente ...

# make sure needed directories exist
sudo mkdir /var/opt/mssql /var/opt/mssql/.system /var/opt/mssql/data /var/opt/mssql/log

# this should be owned by mssql
sudo chown -R  mssql:mssql /var/opt/mssql
sudo chmod 770 /var/opt/mssql

# this should be owned by root
sudo chown -R root:root /opt/mssql
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.