หลังจาก Blog ในปีก่อนโน้นนนนนนน ผมได้ลองใช้ MSSQL on Linux 2016 ไปแล้ว มาปีนี้ ในงานเล็กๆ ของเด็กฝึกงาน มาในปีนี้ พอดีกำลังเริ่ม Project ใหม่ ที่มีระยะเวลาทำระมาณ 3 เดือนครับ แม้จะ รู้ว่าเสี่ยง แต่คงต้องขอลอง โดยเอาตัว MSSQL on Linux 2017 มาใช้เป็น Dev-Environment สำหรับทำให้ทีมลองบ้างครับ สำหรับใน Blog ตอนนี้เขียนตั้งแต่
ช่วงลง MSSQL Database บน Ubuntu
- Setup
ขั้นตอนการติดตั้ง เขียนสั้นๆ และเน้นอะไรที่ผมไม่คุ้นใน MSSQL 2016 ที่เคยใช้งานนะครับ
- ลง curl ด้วยคำสั่ง (ถ้ามีแล้วข้ามไปครับ)
- Import key
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
- Register repository ของ Microsoft SQL Server Ubuntu ครับ
sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list)" sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list)"
- ลง SQL Server ด้วยคำสั่ง
sudo apt-get update sudo apt-get install -y mssql-server
- ลงตัว SQLCMD ด้วยคำสั่ง
sudo apt-get update sudo apt-get install -y mssql-tools unixodbc-dev
- Add
"/opt/mssql-tools/bin/"เข้าไปใน PATH environment variable. เพื่อให้สามารถเรียกกใช้ sqlcmdได้เลย ด้วยคำสั่ง
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc
- Config
Step Config ตัว MSSQL Server 2017
- Run คำสั่ง
sudo /opt/mssql/bin/mssql-conf setup
- มี Set SA Password (ขั้นต่ำ 8 ตัว ต้องประกอบไปด้วยตัวอักษร ตัวเลข และอักขระพิเศษ) และ อื่นๆ
- อันนี้ผมเพิ่งเห็น มันมี Edition มาให้เลือกแล้ว สำหรับผมเลือกตัว Developer Edition ไปก่อน

- จากนั้นมี Count Down ด้วยครับ เดี๋ยวต้องรอดู ว่าถ้าครบอายุมันเหมือน DB2 ไหม Lock DB เลย

- ดูสถานะของตัว SQL Server ด้วยคำสั่ง
systemctl status mssql-server
- Connect DB โดยใช้ User SA ครับ
sqlcmd -S localhost -U SA -P '<YourPassword>'
Note: Step ทั้งหมด ผมสรุปมาจาก Reference ของทาง Microsoft นะครับ
ลอง Restore DB
- ผมได้ทำไฟล์ .bak เอาไว้แล้วนะครับ โดยโยนเข้าไปที่ VM ของ MSSQL ใน Path var/opt/mssql/data/
Note: ตอนนั้น ผมพยายามลองหลายท่ามาก ทั้งเลือกไฟล์จาก SSMS บน Host โดยเข้าไปที่ Guest Ubunt แต่มันไม่ Work เลย - SSMS - ทำเหมือน Windows เลยครับ แต่ Path ของไฟล์ .bak ต้องอยู่ที่ var/opt/mssql/data/ ไม่งั้นมันจะเอ๋อ หาไฟล์ไม่เจอครับ ขั้นตอนดูตาม Gallery เลยครับ
- ฺBash Command Line อันนี้ดีหน่อย ต่างจาก MSSQL2016 ไฟล์ .bak เอาไปวางที่ไหนก็ได้ครับ เวลา Restore ใช้คำสั่งตาม Pattern ดังนี้
USE [master] RESTORE DATABASE [SELICDB] FROM DISK = N’/home/sachit/SELICDB-Full.bak’ WITH FILE = 1, MOVE N’SELIC_Primary’ TO N’/var/opt/mssql/data/SELICDB.mdf’, MOVE N’SELIC_UserData’ TO N’/var/opt/mssql/data/SELICDB_UserData.ndf’, MOVE N’SELIC_Log’ TO N’/var/opt/mssql/data/SELICDB.ldf’, MOVE N’SELIC_InMemory_Data_1′ TO N’c:\var\opt\mssql\data\SELICDB_InMemory_Data_1′, - In-Memory OLTP database need to have the “C:\” notation when referred - ถ้าไม่ได้ใช้อันไหน ก็ตัดออกได้ครับ อย่าง DB ปกติ Restore กันแค่ mdf กับ ldf NOUNLOAD, STATS = 5 GO
Note: สำหรับ Bash Command Line Path ที่ Restore (ที่เป็นพวก MDF, LDF) ยังคง Lock ไว้ที่
var/opt/mssql/data/ครับ ไม่งั้นมันจะ Fail
ทดสอบทำงานง่ายๆ
- Query ดูภาพรวมของ Server ว่า Version อะไร ด้วยคำสั่ง SELECT @@VERSION ผลลัพธ์ที่ได้

- ลอง Restore DB User ผมใช้ Script จาก Blog นี้ โดยใช้ User SA แทน เพราะ SQL Server on Linux ไม่มีตัว Windows Authentication ครับ

- ลองทำ Custom Queryบ้าง ตามงานที่ต้องใช้ แต่ปรับให้สัั้นลง (ของจริง 1 หน้า A4 ครับ)
SELECT SECR.SECURITYID
, SECR.VALUEDATE
, SECR.INDIRECTRATINGID
, SECR.DIRECTRATINGID
, SECR.ISIMPORTED
, SECR.IMPORTEDTIME
, SECR.IMPORTID
, SECR.RATINGDETAILID
, CR.CREDITRATINGID
, CR.CREDITRATINGCODE
, CR.CREDITRATINGDESC
, CR.AGENCYTYPE
, CRD.GRADENAME
, CRD.GRADEVALUE
, CRD.RISKRATING
, CRD.STARTRANGE
, CRD.ENDRANGE
FROM INVEST.SECURITYRATING SECR
INNER JOIN (SELECT MAX(TSECR.VALUEDATE) AS VALUEDATE
, TSECR.SECURITYID
FROM INVEST.SECURITYRATING TSECR
WHERE TSECR.ACTIVEFLAG = 'A'
AND TSECR.VALUEDATE <= '2017-08-09'
AND TSECR.SECURITYID IN (454)
GROUP BY TSECR.SECURITYID) AS MAXRATE
ON SECR.VALUEDATE = MAXRATE.VALUEDATE
AND SECR.SECURITYID = MAXRATE.SECURITYID
AND SECR.ACTIVEFLAG = 'A'
LEFT OUTER JOIN INVEST.RATINGDETAIL CRD
ON SECR.RATINGDETAILID = CRD.RATINGDETAILID
AND CRD.ACTIVEFLAG = 'A'
LEFT OUTER JOIN INVEST.CREDITRATING CR
ON CRD.RATINGID = CR.CREDITRATINGID
AND CR.ACTIVEFLAG = 'A'
ORDER BY SECR.SECURITYID- ผลลัพธ์ของ Custom Query ครับ

เรื่องอื่นๆ
- หน้าจอ UI ในส่วนของการ Design Table ยังใช้งานไม่ได้ ถ้าอยากแก้ Schema ต้อง Command ล้วนๆครับ

หลังจากนี้ หากติดปัญหาอะไร เขียน Blog เรื่อยๆ และอาจจะมีการเขียน ฺBlog สรุปปิดท้ายครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.







