หลังจาก Blog ในปีก่อนโน้นนนนนนน ผมได้ลองใช้ MSSQL on Linux 2016 ไปแล้ว มาปีนี้ ในงานเล็กๆ ของเด็กฝึกงาน มาในปีนี้ พอดีกำลังเริ่ม Project ใหม่ ที่มีระยะเวลาทำระมาณ 3 เดือนครับ แม้จะ รู้ว่าเสี่ยง แต่คงต้องขอลอง โดยเอาตัว MSSQL on Linux 2017 มาใช้เป็น Dev-Enviroment สำหรับทำให้ทีมลองบ้างครับ สำหรับใน Blog ตอนนี้เขียนตั้งแต่
- ช่วงลง Database บน Ubuntu
- ลอง Restore DB
- ทดสอบทำงานง่ายๆ
- เรื่องอื่นๆ
ช่วงลง 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 DฺB โดยใช้ 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.