SQL Server trên Linux bị treo khi khởi động ban đầu, không có lỗi và không có tệp ErrorLog mới / cập nhật


11

Tôi đang sử dụng SQL Server 2017, Ứng viên phát hành 2 (RC2) trên Linux (Ubuntu 16.04).

Khi máy chủ khởi động, SQL Server cũng thường khởi động. Nhưng vì một số lý do, SQL Server sẽ không bắt đầu nữa. Ít nhất tôi không thể kết nối với nó bằng sqlcmd . Tôi gặp lỗi hết thời gian ODBC ( "Sqlcmd: Lỗi: Microsoft ODBC Driver 13 cho SQL Server ") mỗi lần:

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

Tuy nhiên, khi tôi chạy:

ps aux | grep mssql

Tôi nhận được hai mục trả về cho thấy rằng mssqlngười dùng đang chạy sqlservrquá trình.

Ngoài ra, tệp errorlog trong / var / opt / mssql / log / không có dấu thời gian khớp khi tôi khởi động VM (hoặc khởi động lại dịch vụ), cũng không có mục mới nào trong tệp đó.

VÀ, trong / var / log / message , tất cả những gì hiển thị là:

Đây là một phiên bản đánh giá. Có [141] ngày còn lại trong giai đoạn đánh giá.

Nếu tôi chạy systemctl status mssql-server, sau đó tôi nhận được như sau:

● mssql-server.service - Công cụ cơ sở dữ liệu Microsoft SQL Server được
tải: đã tải (/lib/systemd/system/mssql-server.service; đã bật; nhà cung cấp cài sẵn: đã bật)
Hoạt động: thất bại (Kết quả: mã thoát) từ Mon 2017- 09-04 20:01:56 BST; 36s trước
Tài liệu: https://docs.microsoft.com/en-us/sql/linux
Quá trình: 8009 ExecStart = / opt / mssql / bin / sqlservr (code = exited, status = 255)
Chính PID: 8009 (code = đã thoát, trạng thái = 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'.  

Câu trả lời:


15

Điều này đã kết thúc như một trường hợp không cẩn thận khi làm việc như root.

Tôi đã nghiên cứu xem SQLCLR trên Linux có quyền truy cập vào tệp app.Config giống như trong Windows không (đáng buồn thay, SQL Server 2017 trên Linux bỏ qua tệp cấu hình ứng dụng nếu nó tồn tại hoặc đôi khi bị khóa nếu không 't (SQLCLR) ) và trong một số trường hợp nhất định, SQL Server sẽ khóa hoàn toàn. Khi điều đó xảy ra, cách duy nhất để ngăn chặn nó là tiếp kill -9tục sqlservr. Một trong những lần tôi bắt đầu lại dịch vụ, tôi đã làm như vậy bằng cách trực tiếp thực hiện / opt / mssql / bin / sqlservr trong khi tôi đang làm việc root(do đó chính quá trình này đã được sở hữu root).

Không có lỗi ngay lập tức hoặc hành vi kỳ quặc do chạy sqlservrnhư root, NHƯNG khi VM khởi động lại và SQL Server đã cố khởi động đúng cách (tức là chạy như mssqlngười dùng), đó là khi nó bị kẹt ngay từ đầu.

Tôi thấy rằng hậu quả trực tiếp của việc chạy sqlservrnhư rootlà tệp / var / opt / mssql / log / errorlog (và một số khác được tạo khi SQL Server khởi động) được sở hữu bởi root(có ý nghĩa).

Và, hậu quả trực tiếp của những tệp được sở hữu rootlà khi quá trình được bắt đầu đúng (như mssql), thì mssqlngười dùng không có quyền đổi tên tệp để kết thúc bằng .1 (và bất kỳ điều gì khác cần phải xảy ra với bất kỳ ai khác các tập tin, chẳng hạn như theo dõi mặc định, vv). Tuy nhiên, thay vì nhận được một lỗi quyền, nó chỉ bị treo mãi mãi.

Cách khắc phục chính là chỉ đơn giản là chạy như sau root(Tôi chưa thử chạy nó như mssql). Đối với cả hai lệnh sau, sudochỉ cần thiết khi hiện không đóng vai trò như rootlà nó sẽ chạy các lệnh sau nó như root (hoặc một số người dùng khác nếu bạn chỉ định -u username), sau khi được nhắc nhở để nhập rootmật khẩu.

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

Khắc phục thứ cấp (để đảm bảo rằng điều này không xảy ra lần nữa), là khởi động SQL Server đúng cách ;-):

sudo systemctl start mssql-server

1

Để có được perms đúng và để có được lỗi thông minh, bạn cần ít nhất ...

# 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.