[MSSQL] ขยับมาใช้ MSSQL ON LINUX 2017 กันดีกว่า

หลังจาก 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.