SQL Server в Linux зависает при первоначальном запуске, без ошибок и без нового / обновленного файла ErrorLog

11

Я использую SQL Server 2017, Release Candidate 2 (RC2) в Linux (Ubuntu 16.04).

Когда сервер запускается, обычно запускается и SQL Server. Но по какой-то причине SQL Server больше не запускается. По крайней мере, я не могу подключиться к нему с помощью sqlcmd . Я получаю сообщение об ошибке тайм-аута ODBC ( «Sqlcmd: Ошибка: драйвер Microsoft ODBC 13 для 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..

Тем не менее, когда я бегу:

ps aux | grep mssql

Я получил две записи, возвращающие, показывающие, что mssqlпользователь запускает sqlservrпроцесс.

Кроме того , ErrorLog файл в / вар / Opt / MSSQL / Журнал / не имеет соответствия меток , когда я начал VM (или перезапуске службы), и нет никаких новых записей в этом файле.

И, в / var / log / messages , все, что появляется, это:

Это ознакомительная версия. В оценочном периоде осталось [141] дней.

Если я бегу systemctl status mssql-server, то получаю следующее:

● mssql-server.service - ядро ​​СУБД Microsoft SQL Server
Загружен: загружен (/lib/systemd/system/mssql-server.service; включен; предустановка поставщика: включен)
Активен: не выполнен (Результат: код выхода) с понедельника 2017 г. 09-04 20:01:56 BST; 36s ago
Документы: https://docs.microsoft.com/en-us/sql/linux
Процесс: 8009 ExecStart = / opt / mssql / bin / sqlservr (code = exited, status = 255)
Основной PID: 8009 (code = выход, статус = 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'.  
Соломон Руцкий
источник

Ответы:

15

Это закончилось как случай не быть осторожным, работая как root.

Я исследовал, будет ли SQLCLR в Linux иметь доступ к файлу app.Config, как это делается в Windows (к сожалению, это не так: SQL Server 2017 в Linux игнорирует файл конфигурации приложения, если он существует, или иногда блокируется, если он не работает. 't (SQLCLR) ) и при определенных обстоятельствах SQL Server будет полностью заблокирован. Когда это произошло, единственный способ остановить это должно было сделать kill -9на sqlservr. Однажды, когда я снова запустил службу, я сделал это, выполнив / opt / mssql / bin / sqlservr, и, пока работал, root(следовательно, сам процесс принадлежал root).

Не было никаких непосредственных ошибок или странного поведения, возникающего при запуске sqlservrкак root, НО, когда виртуальная машина перезагружалась и SQL Server пытался запускаться должным образом (то есть работать как mssqlпользователь), то есть когда он застревал в самом начале.

Я обнаружил , что является прямым следствием работы sqlservrв rootтом , что / вар / Opt / MSSQL / Журнал / ERRORLOG файл (и некоторые другие, которые создаются при запуске SQL Server) принадлежали root(имеет смысл).

И прямым следствием того, что эти файлы принадлежат, rootявляется то, что, когда процесс запускается должным образом (как mssql), тогда у mssqlпользователя нет разрешения переименовывать файл, чтобы закончить в .1 (и все, что еще должно произойти с любым другим файлы, такие как трассировка по умолчанию и т. д.). Однако вместо того, чтобы получить ошибку прав доступа, он просто навсегда зависает.

Основное исправление состоит в том, чтобы просто выполнить следующее как root(я не пробовал запускать его как mssql). Для обоих из следующих команд, sudoнужен только тогда , когда в настоящее время не действует , как , rootкак это будет работать команда , которая следует за ней , как root (или какой - то другой пользователь , если вы укажете -u username), после того , как будет предложено ввести rootпароль.

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

Вторичное исправление (чтобы это больше не повторилось) - правильно запустить SQL Server ;-):

sudo systemctl start mssql-server
Соломон Руцкий
источник
1

Чтобы получить правильные разрешения и получить умные ошибки, вам нужно по крайней мере следующее ...

# 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
Эван Кэрролл
источник