一次就愛上MS SQL Server for Linux

一次就愛上MS SQL Server for Linux

MS SQL Server for Linux 是微軟重大的一步,它非常輕量但是使用相同和現有 SQL Server 資料庫引擎。以下介紹如何在 docker 下去建立並使用 mssql-server-linux,讓各位從入門到愛上它!

Let's go!

注意,讀者需要有 docker 基本概念。本篇不會太深入 docker 身上。

建立 mssql-server-linux container

從 Docker Hub 提取 SQL Server 2017 Linux image:

docker pull microsoft/mssql-server-linux:latest

這裡注意,我一開始是參考 Docker Hub 上的 mssql-server-linux 文件,但怎麼執行 mssql-server-linux 都會一啟動就入停用狀態,參數怎麼改都不行。後來參考 https://docs.microsoft.com 的文件重新執行一次,就能正常進行背景模式。原因是 Docker Hub 文件的密碼參數名稱是錯的,MSSQL_SA_PASSWORD 才是對的。

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
   -p 1401:1433 --name linsql `
   -d microsoft/mssql-server-linux:latest
  • ACCEPT_EULA 需同意授權合約。
  • MSSQL_SA_PASSWORD 需要是強式密碼並至少 8 個字元。強式密碼需包含:大寫小寫數字符號四者。
  • -p hostPort:containerPort
  • --name 指定 container 名稱
  • -d 背景執行

啟動後,確定一下 container 的狀態:

docker ps

如果列表 NAMES 顯示 linsql 並且 STATUS 顯示 UP 代表此已經在背景 1433 Port 等待。

使用 sqlcmd 連接並執行 T-SQL

我們先練習 sqlcmd 指令模式,等一下再介紹使用工具。

docker exec -it linsql bash

進入互動模式,執行登入:

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourNewStrong!Passw0rd>'
  • /opt/mssql-tools/bin/sqlcmdsqlcmd 所在路徑。如果看到 1> 代表已進入 sqlcmd 命令提示字元。

建立資料庫:

1> create database testDB
2> go
1> SELECT Name from sys.Databases
2> go

在 sqlcmd 指令模式下,輸入 go 之後才會執行。

Name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
testDB

(5 rows affected)

我們已經成功在 mssql-server-linux 內執行 T-SQL,其他 Insert、Update、Delete、Select 語法都能正常使用 sqlcmd 方式執行。離開 sqlcmd 執行 quit 即可。

使用外部工具 SSMS, sqlops 連接 mssql-server-linux

如果你的 mssql-server-linux contailer 和 host 是在同一台,可以直接使用 localhost 名稱進行連線,如果要查詢 IP Address 透過 docker inspect <name or id> 來取得 IPAddress 段落資訊。

SSMS 連接 mssql-server-linux

SSMS Login mssql-server-linux

唯一要注意的是,我們一開始在 docker run 指定的 -p, 我們主機設定為 1401 Port,所以只要指定為 localhost,1401 就能與 mssql-server-linux 進行連接,是不是有夠簡單。

SSMS mssql-server-linux DB List

我使用 SSMS 17.4。

sqlops 連接 mssql-server-linux

sqlops Login mssql-server-linux

有了正確 Server name 之後,其實用什麼工具來連線已經沒什麼差別了。sqlops 是一套輕量化與跨平台的資料庫管理工具,目前我們在單純寫 T-SQL 上用的還算喜歡。

sqlops mssql-server-linux DB list

移除 mssql-server-linux container

docker stop linsql
docker rm linsql

移除 linsql container 會刪除 container 內所有資料,例如我們剛剛建立的 testDB。我們應該把資料儲存在 container 之外,以備份或還原之用。

使用 Volume 儲存資料庫至外部主機

先確認你的 Docker for Windows 的 Shared DrivesC 能正確 Apply。

以下用 C 碟為範例,讀者可以修改為你想要磁碟。

我在 C:\ 建立以下階層的目錄:C:\Database\linux,然後重新建立 container:

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
   --name "linsql" -p 1401:1433 `
   -v C:\Database\linux:/var/opt/mssql `
   -d microsoft/mssql-server-linux:latest

與一開始的差異在多了 -v (Volume 技術)建立實體資料夾與 container 資料夾的對應關係。

PS C:\Database\linux> dir

    目錄: C:\Database\linux

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----     2017/12/19  下午 04:54                .system
d-----     2017/12/19  下午 04:55                data
d-----     2017/12/19  下午 04:54                log
d-----     2017/12/19  下午 04:54                secrets

可以發現,預設 /var/opt/mssql 的資料夾,出現我們本機的 C:\Database\linux 了。我們複製一個 AdventureWorks2012 範例資料庫到 data 目錄下:

PS C:\Database\linux\data> dir

    目錄: C:\Database\linux\data

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----      2012/8/28  下午 11:54      198180864 AdventureWorks2012_Data.mdf
-a----      2012/8/28  下午 11:54         516096 AdventureWorks2012_log.ldf
-a----     2017/12/19  下午 04:54        4194304 master.mdf
-a----     2017/12/19  下午 04:55        2097152 mastlog.ldf
-a----     2017/12/19  下午 04:54        8388608 model.mdf
-a----     2017/12/19  下午 04:54        8388608 modellog.ldf
-a----     2017/12/19  下午 04:54       13959168 msdbdata.mdf
-a----     2017/12/19  下午 04:54         524288 msdblog.ldf
-a----     2017/12/19  下午 04:55        8388608 tempdb.mdf
-a----     2017/12/19  下午 04:55        8388608 templog.ldf

這裡讓我們偷懶使用 SSMS 來作業:

SSMS Attach mssql-server-linux DB
SSMS Attach mssql-server-linux Location

這裡可以看到 SSMS 連線之後能正確列出 mssql-server-linux container 裡的資料庫,附加之後,*.mdf 在 mssql-server-linux container 裡的運作與一般 MS SQL Server 無差異。

SSMS Query mssql-server-linux DB

現在,你能用極快速的時間(一行指令)重建一個 mssql-server-linux container,而不需要 MS SQL Server 等級的安裝程式。

這裡也可以看出,SSMS 對 mssql-server-linux 的支援性不錯。

ASP.NET 網頁應用程式 - Entity Framework

基本上,你擁有資料庫 Server name 之後,mssql-server-linux 的使用實在與一般 MS SQL Server 無異差了。

VS connect mssql-server-linux

你以前怎麼連線,現在就怎麼連線,以前,怎麼使用資料庫,現在就怎麼使用 mssql-server-linux 資料庫。

VS MVC data from mssql-server-linux

小結

技術這條路上,不知道為了 Visual Studio 與 SQL Server/SSMS 出問題,重灌了幾次電腦。Visual Studio 2017 已經決解此問題,現在 MS SQL Server 透過 docker 的幫忙,Linux/Windows Container 都有提供 SQL Server Images 可使用,這是測試與開發人員之福。mssql-server-linux 本身相當輕量,只有數百 MB,又與原始 SQL Server 的相容,可用性非常高,非常建議測試與開發人員使用,而且 docker 可以確定是未來趨勢,早早入手此技能,可以放棄許多如安裝 MS SQL Server 這種行為了。 ;-)

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。