SQL Server di Linux hang pada startup awal, tidak ada kesalahan, dan tidak ada file ErrorLog baru / diperbarui

11

Saya menggunakan SQL Server 2017, Release Candidate 2 (RC2) di Linux (Ubuntu 16.04).

Ketika server mulai, SQL Server biasanya mulai juga. Tetapi untuk beberapa alasan, SQL Server tidak akan mulai lagi. Setidaknya saya tidak bisa terhubung menggunakan sqlcmd . Saya mendapatkan batas waktu ODBC ( "Sqlcmd: Kesalahan: Microsoft ODBC Driver 13 untuk SQL Server ") setiap saat sekarang:

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

Namun, ketika saya menjalankan:

ps aux | grep mssql

Saya mendapatkan dua entri kembali yang menunjukkan bahwa mssqlpengguna menjalankan sqlservrproses.

Juga, file errorlog di / var / opt / mssql / log / tidak memiliki timestamp yang cocok ketika saya memulai VM (atau me-restart layanan), juga tidak ada entri baru dalam file itu.

DAN, dalam / var / log / pesan , semua yang muncul adalah:

Ini adalah versi evaluasi. Ada [141] hari tersisa dalam periode evaluasi.

Jika saya berlari systemctl status mssql-server, maka saya mendapatkan yang berikut:

● mssql-server.service - Mesin Basis Data Microsoft SQL Server
Dimuat: dimuat (/lib/systemd/system/mssql-server.service; diaktifkan; preset vendor: diaktifkan)
Aktif: gagal (Hasil: kode-keluar) sejak Senin 2017- 09-04 20:01:56 BST; 36d lalu
Documents: https://docs.microsoft.com/en-us/sql/linux
Proses: 8009 ExecStart = / opt / mssql / bin / sqlservr (kode = keluar, status = 255)
PID Utama: 8009 (kode = keluar, 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'.  
Solomon Rutzky
sumber

Jawaban:

15

Ini berakhir sebagai kasus tidak berhati-hati ketika bekerja sebagai root.

Saya telah meneliti apakah SQLCLR di Linux akan memiliki akses ke aplikasi. File konfigurasi seperti di Windows (sayangnya, tidak: SQL Server 2017 di Linux mengabaikan file konfigurasi aplikasi jika ada, atau kadang-kadang terkunci jika tidak 't (SQLCLR) ) dan dalam kondisi tertentu SQL Server akan sepenuhnya terkunci. Ketika itu terjadi, satu-satunya cara untuk menghentikannya adalah dengan melakukan kill -9on sqlservr. Salah satu waktu saya memulai layanan lagi, saya melakukannya dengan langsung menjalankan / opt / mssql / bin / sqlservr dan ketika saya sedang bekerja sebagai root(maka proses itu sendiri dimiliki oleh root).

Tidak ada kesalahan langsung atau perilaku aneh yang dihasilkan dari menjalankan sqlservrsebagai root, TETAPI ketika VM restart dan SQL Server berusaha untuk memulai dengan benar (yaitu berjalan sebagai mssqlpengguna), yaitu ketika macet di awal.

Saya menemukan bahwa konsekuensi langsung dari menjalankan sqlservras rootadalah bahwa file / var / opt / mssql / log / errorlog (dan beberapa orang lain yang dibuat pada awal SQL Server) dimiliki oleh root(masuk akal).

Dan, konsekuensi langsung dari file-file yang dimiliki oleh rootadalah bahwa ketika proses dimulai dengan benar (as mssql), maka mssqlpengguna tidak memiliki izin untuk mengubah nama file untuk diakhiri dengan .1 (dan apa pun yang perlu terjadi dengan yang lain file, seperti jejak default, dll). Namun, alih-alih mendapatkan kesalahan izin, itu hanya hang selamanya.

Perbaikan utama adalah dengan hanya menjalankan sebagai berikut root(saya belum mencoba menjalankannya sebagai mssql). Untuk kedua dari perintah berikut, sudohanya diperlukan bila saat ini tidak bertindak sebagai rootkarena akan menjalankan perintah yang mengikutinya sebagai root (atau beberapa pengguna lain jika Anda tentukan -u username), setelah diminta untuk memasukkan rootpassword.

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

Perbaikan sekunder (untuk memastikan bahwa ini tidak terjadi lagi), adalah memulai SQL Server dengan benar ;-):

sudo systemctl start mssql-server
Solomon Rutzky
sumber
1

Untuk mendapatkan izin yang tepat dan untuk mendapatkan kesalahan pintar, Anda perlu setidaknya yang berikut ...

# 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
Evan Carroll
sumber