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

หลังจาก Blog ในปีก่อนโน้นนนนนนน ผมได้ลองใช้ MSSQL on Linux 2016 ไปแล้ว มาปีนี้ ในงานเล็กของเด็กฝึกงาน มาในปีนี้ พอดีกำลังเริ่ม Project ใหม่ ที่มีระยะเวลาทำระมาณ 3 เดือนครับ แม้จะ รู้ว่าเสี่ยง แต่คงต้องขอลอง โดยเอาตัว MSSQL on Linux 2017 มาใช้เป็น Dev-Enviroment สำหรับทำให้ทีมลองบ้างครับ สำหรับใน Blog ตอนนี้เขียนตั้งแต่

  • ช่วงลง Database บน Ubuntu
  • ลอง Restore DB
  • ทดสอบทำงานง่ายๆ
  • เรื่องอื่นๆ

ช่วงลง Database บน Ubuntu

  • ขั้นตอนการติดตั้ง เขียนสั้นๆ และเน้นอะไรที่ผมไม่คุ้นใน 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
  • 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 เลยครับ

    This slideshow requires JavaScript.

  • ฺ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 to your email.