SQL Server unter Linux hängt beim ersten Start, keine Fehler und keine neue / aktualisierte ErrorLog-Datei


11

Ich verwende SQL Server 2017, Release Candidate 2 (RC2) unter Linux (Ubuntu 16.04).

Wenn der Server gestartet wird, wird normalerweise auch SQL Server gestartet. Aus irgendeinem Grund wird SQL Server jedoch nicht mehr gestartet. Zumindest kann ich mit sqlcmd keine Verbindung herstellen . Ich erhalte jetzt jedes Mal ein ODBC-Zeitlimit ( "Sqlcmd: Fehler: Microsoft ODBC-Treiber 13 für 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..

Wenn ich jedoch renne:

ps aux | grep mssql

Ich erhalte zwei Einträge zurück, die zeigen, dass der mssqlBenutzer den sqlservrProzess ausführt.

Außerdem weist die Fehlerprotokolldatei in / var / opt / mssql / log / keinen Zeitstempel auf, der beim Starten der VM (oder beim Neustart des Dienstes) übereinstimmt, und es gibt auch keine neuen Einträge in dieser Datei.

UND in / var / log / messages wird nur Folgendes angezeigt:

Dies ist eine Evaluierungsversion. Im Bewertungszeitraum verbleiben [141] Tage.

Wenn ich renne systemctl status mssql-server, bekomme ich folgendes:

● mssql-server.service - Microsoft SQL Server-Datenbankmodul
Geladen: geladen (/lib/systemd/system/mssql-server.service; aktiviert; Herstellervoreinstellung: aktiviert)
Aktiv: fehlgeschlagen (Ergebnis: Exit-Code) seit Montag 2017- 09-04 20:01:56 BST; Vor 36 Jahren
Docs: https://docs.microsoft.com/en-us/sql/linux
Prozess: 8009 ExecStart = / opt / mssql / bin / sqlservr (Code = beendet, Status = 255)
Haupt-PID: 8009 (Code = beendet, Status = 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'.  

Antworten:


15

Dies endete damit, dass man bei der Arbeit als nicht vorsichtig war root.

Ich hatte untersucht, ob SQLCLR unter Linux Zugriff auf die Datei app.Config haben würde, wie dies unter Windows der Fall ist (leider nicht: SQL Server 2017 unter Linux ignoriert die Konfigurationsdatei der App, falls vorhanden, oder sperrt manchmal, wenn dies nicht der Fall ist 't (SQLCLR) ) und unter bestimmten Umständen würde SQL Server vollständig . Wenn das passiert, ist der einzige Weg zu stoppen , es war ein zu tun kill -9auf sqlservr. Eines der Male, als ich den Dienst erneut startete, führte ich / opt / mssql / bin / sqlservr direkt aus und während ich arbeitete als root(daher gehörte der Prozess selbst root).

Es gab keine unmittelbaren Fehler oder merkwürdigen Verhaltensweisen, die sich aus der Ausführung sqlservrals ergaben root, ABER als die VM neu gestartet wurde und SQL Server versuchte, ordnungsgemäß zu starten (dh als mssqlBenutzer ausgeführt zu werden), dh als sie am Anfang feststeckte.

Ich fand das eine direkte Folge des Laufens sqlservr wie rootwar , dass das Verzeichnis / var / opt / mssql / log / errorlog - Datei (und einige andere , die auf SQL Server Start erstellt werden) wurden im Besitz von root(sinnvoll).

Und eine direkte Folge davon, dass diese Dateien Eigentum von sind root ist, dass mssqlder mssqlBenutzer beim ordnungsgemäßen Starten des Prozesses (as ) keine Berechtigung hat, die Datei so umzubenennen , dass sie mit .1 endet (und was auch immer mit anderen Dateien geschehen muss) Dateien wie Standard-Trace usw.). Anstatt einen Berechtigungsfehler zu erhalten, bleibt er jedoch für immer hängen.

Die primäre Lösung besteht darin, einfach Folgendes auszuführen root(ich habe nicht versucht, es als auszuführen mssql). Für die beiden folgenden Befehle ein , sudonur , wenn es nicht zur Zeit benötigt , die als rootda sie den Befehl ausführen, der es folgt als root (oder einem anderen Benutzer , wenn Sie angeben -u username), nach der Eingabe aufgefordert werden , das rootKennwort ein .

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

Die sekundäre Lösung (um sicherzustellen, dass dies nicht erneut geschieht) besteht darin, SQL Server ordnungsgemäß zu starten ;-):

sudo systemctl start mssql-server

1

Um die Dauerwellen richtig zu machen und intelligente Fehler zu erhalten, benötigen Sie mindestens Folgendes ...

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.