Category: SQL Server


SQL Audit Fail to Create

เมื่อเราสร้าง audit ใน SQL 2008 และ 2008 R2 จะพบว่าไม่สามารถสร้างได้ และจะมีข้อความแจ้งว่า Auditing is not available in this edition of SQL Server.

SQL-Audit-Fail-to-Create

ปัญหานี้เกิดจาก SQL 2008/2008 R2 Standard Edition ไม่สามารถเปิดใช้งาน audit ได้ ไม่มีวิธีแก้ อื่นใดนอกจากต้องเปลี่ยนเป็น SQL 2008/2008 R2 Enterprise Edition หรือ Datacenter Edition เท่านั้นครับ

Advertisements

คุณเคยเจอปัญหานี้หรือไม่
1) รู้แต่ SQL build number แต่อยากรู้ว่าเป็นเวอร์ชั่นไหน service pack อะไร
2) ต้องอัพเดต SQL cumulative update package แต่ไม่รู้ว่าอัพไปแล้วจะเป็น build อะไร เพราะต้องไปเช็คความเข้ากันได้กับซอร์ฟแวร์อื่นอีก

ปัญหาเหล่านี้จะหมดไป เพียงคุณเข้าไปที่ http://sqlserverbuilds.blogspot.com
ในเวปนี้จะมีตารางแจง build number ตั้งแต่ SQL 7 (ตั้งแต่ปี 2005 ยังมีใครใช้อยู่มั้ยเนี่ย) จนล่าสุดที่เขียนบทความเป็น SQL 2012 SP2 แล้ว โดยบอกละเอียดถึงระดับ hotfix หรือ cumulative update package กันเลยครับ

บางครั้งเราจำเป็นต้องติดตั้ง Microsoft SQL server ร่วมกับ service อื่นๆ เช่น Web Server หรือโปรแกรมอื่นๆ สิ่งที่มักจะเจอบ่อยๆ คือ SQL Server จะจองแรมที่มีในเครื่องทั้งหมดไป ไม่เหลือให้คนอื่นใช้อีก

คำแนะนำสำหรับกรณีนี้คือกำหนด Maximum Server Memory สำหรับโพรเซสของ SQL Server เพราะหากไม่กำหนดเพิ่ม SQL Server จะใช้ค่าที่มาจากโรงงานคือ 2PB (2,000 TB; ชีวิตนี้จะมีโอการเจอฮาร์ดแวร์ที่รอบรับ memory capacity ขนาดนี้มั้ยเนี่ย) หรือกล่าวคือใช้แรมที่มีอยู่ในเครื่องเซิร์ฟเวอร์ทั้งหมดนั่นเอง

โดยรายละเอียดการกำหนดทำได้ดังนี้
1) เปิดโปรแกรม SQL Server Management Studio แล้ว Connect ไปที่ database server
2) คลิ๊กขวาที่ชื่อ SQL Server เลือก properties

3) เลือก Memory แล้วเปลี่ยนค่าจาก 2PB เป็นค่าตามที่ต้องการ

คำถามนี้ตอบยากครับ มีหลายปัจจัย เอาเป็นว่า “SQL instance เดียวหลาย database” เมื่อเปรียบเทียบกับ “1 instance 1 database” คือ
ข้อดี

    – ประหยัด resource ทั้ง processing power, และ ram เนื่องจากว่ามี SQLservr.exe แค่ process เดียว ไม่ต้องไปแย่งกับใคร
    – ประหยัดพื้นที่ฮาร์ดดิสก์เพราะทุก database ใช้ executable files ชุดเดียวกัน ในกรณีติดตั้งหลาย instance ก็จะมีไฟล์ SQLservr.exe (และไฟล์ข้างเคียง) ตามจำนวน instance
    – หากมีผู้ใช้งานหลายๆ คน คอนฟิก logins ทีเดียว แล้วนำไปใช้กับได้หลาย database

ข้อจำกัด

    – application ที่เรียกใช้งาน SQL server ทุกตัวต้องสนับสนุน SQL server เวอร์ชั่นเดียวกัน service pack และ hotfix เดียวกัน
    – อาจเกิดปัญหาเรื่อง configuration ได้ เพราะบางครับซอร์ฟแวร์สำเร็จรูปที่เรียกใช้งาน SQL server อาจต้องการ configuration parameter ในระดับของ instance ที่ต่างกันก็ได้
    – หากมี DBA หลายทีม หรือ application owner หลายทีม จะแยกกันทำงานลำบาก

ซึ่งในบางสถานการณ์นอกจากควรจะแยก instance แล้ว แยก OS กันเลยอาจเหมาะสมกว่าครับ

เนื่องจากทุก transaction จะต้องถูกเขียนลง log ก่อนที่จะลง data file ดังนั้นหาก transaction มีขนาดใหญ่ เช่น ลบหลาย record ขนาดรวม 5GB ก็จำเป็นต้องเขียน logs ขนาด 5GB แม้ว่าจะเป็น simple recovery model ก็ตาม นอกจากนี้จะทำให้เกิด I/O สูงมากด้วย ดังนั้นแนะนำให้ซอยเป็น transaction ย่อยๆ โดยใช้ TOP และ @@ROWCOUNT มาช่วยทำงานครับ ตัวอย่างตามข้างล่าง


DECLARE @Done BIT
SET @Done = 0
WHILE @Done = 0
  BEGIN
    DELETE TOP (20000) -- reduce if log still growing
      FROM SomeTable WHERE SomeColumn = SomeValue
    IF @@ROWCOUNT = 0
      SET @Done = 1
    CHECKPOINT -- marks log space reusable in simple recovery
  END

ที่มา http://stackoverflow.com/questions/1448857/there-must-be-a-way-to-delete-data-in-sql-server-w-o-overloading-the-log

Recover Model เป็นโหมดที่จะเลือกการเก็บ transaction logs ว่าจะเก็บอย่างไร
ซึ่งมีอยู่ 3 แบบ แต่ละแบบจะมีรายละเอียดต่างกันคือ
Full

    เก็บทุกอย่าง ปลอดภัยสุด
    ข้อดี
    – เก็บการเปลี่ยนแปลงทั้งหมด หาก database file เสียสามารถกู้คืนได้โดยใช้ transaction logs
    – สามารถ recovery แล้วเลือกเวลาที่ต้องการ (point in time recovery) เช่น database มีปัญหาตอน 12:30น. ดังนั้นสามารถ recovery ไปยังสถานะเมื่อเวลา 12:25 ก่อนที่จะมีปัญหาได้
    ข้อควรระวัง
    – transaction logs จะมีขนาดใหญ่มาก ต้อง backup logs สม่ำเสมอเพื่อป้องกันไม่ให้ logs file โตเกินไป

Simple

    ประหยัดพื้นที่ฮาร์ดดิสก์ที่สุด
    ข้อดี
    – transaction เมื่อ checkpoint แล้วจะลบออก transaction logs file ทำให้ logs file มีขนาดเล็ก
    ข้อควรระวัง
    – หาก database file เสีย ต้อง restore จาก backup เท่านั้น ไม่สามารถนำ transaction logs มา redo ได้
    – ไม่สามารถเลือกว่าจะ restore ไปยังเวลาที่ต้องการได้ restore ได้เฉพาะ ณ เวลาที่ backup เท่านั้น

Bulk-logged

    เหมาะกับงานพวก Analysis Service ที่ต้อง import data ขนาดใหญ่
    ข้อดี
    – เหมือนกับ full ยกเว้นไม่เก็บ transaction logs เวลาทำ bulk insert
    ข้อควรระวัง
    – เหมือนกับ full

โดยสามารถคอนฟิกจาก SQL Server Management Studio (SSMS) มีขั้นตอนดังนี้

    1) คลิ๊กขวาที่ Database Name ที่ต้องการ
    2) เลือก Properties จาก drop down menu
    3) เลือก Options ในกรอบด้านซ้ายมือ
    4) เปลี่ยน recovery model ตามที่ต้องการ
    5) กด OK เพื่อยืนยันการแปลี่ยนแปลง

เวลาเราเรียกใช้งาน SQL Server Management Studio (SSMS) จะพบว่า SQL Server นั้นมี database สร้างไว้อยู่แล้ว 4 DB เราจะเรียก DB เหล่านี้ว่า System Database ซึ่งประกอบไปด้วย

Master

    – เป็น database หลัก จะเป็นที่เก็บค่าคอนฟิกของ SQL server เช่น Instance configuration, login, linked server เป็นต้น และจะเป็น database ตัวแรกที่ถูกโหลดขึ้นมาเวลา SQL Server ทำงาน
    – ซึ่งถ้า Master database corrupt ล่ะก็ start service ไม่ขึ้นกันทีเดียว ดังนั้นแนะนำให้ backup Master database ไว้เป็นระยะๆ ด้วยนะครับ

TempDB

    – ตามชื่อเลยครับ เป็น database ชั่วคราว เช่นเป็นที่อยู่ของ temporary tables, พี่พัก result ที่ได้ระหว่าง join หลายๆ table, ที่พักตอน sort, row version สำหรับงาน snapshot
    – โดย TempDB จะถูกเคลียร์ที่ครั้งที่ SQL server start ดังนั้นจึงไม่จำเป็นต้อง backup TempDB
    – และเพื่อให้ SQL server ทำงานได้เร็วขึ้น แนะนำให้ย้าย TempDB ไปไว้ใน disk ลูกที่เร็วที่สุดครับ

Model

    – เป็น template database เช่นถ้าอยากให้ database ใหม่ที่สร้างหลังจากนี้มี table, store procedure, user หรืออื่นๆ อยู่ในทุก database ก็ให้มาสร้าง object เหล่านั้นไว้ใน Model database แต่จะไม่มีผลกับ database ที่เคยสร้างไว้ก่อนหน้าแล้วนะครับ มีผลกับของใหม่เท่านั้น

MSDB

    – ใช้เก็บคอนฟิกของ SQL Agent, SSIS package (หรือ DTS package ในสมัย SQL 2000) นอกจากนี้ยังเก็บข้อมูลประวัติ backup ไว้ด้วย ซึ่งจะมีประโยชน์มากเวลาต้องการรู้ว่า database ไหน backup ไปเมื่อไหร่

นอกจากนี้ยังมี system database อื่นๆ อีกขึ้นอยู่กับว่าได้ติดตั้งและใช้งานฟีเจอร์อื่นๆ หรือไม่ เช่น Resource, Distribution และ ReportServer

Microsoft SQL Server ยอมให้เรามี SQL Server Service หลายๆ ตัวได้ในเครื่องเซิร์ฟเวอร์เดียวกัน โดยใช้ฟีเจอร์ที่ชื่อว่า Named Instance ซึ่งเราสามารถตั้งชื่อ SQL instance แต่ละตัวแยกกันได้ โดยการเรียกใช้จะเป็น “ServerName\InstanceName” ซึ่งจะพ่วงชื่อ instance มาด้วย ต่างกับ default instance ที่อ้างแค่ชื่อเซิร์ฟเวอร์เปล่าๆ แบบนี้ “ServerName”

สำหรับการตั้งชื่อนั้นทำได้ตั้งแต่ตอนที่ติดตั้ง SQL Server โดยหากไม่ระบุ named instance จะได้ชื่อ instance เป็น MSSQLSERVER ซึ่งก็คือ default instance หรือชื่อเซิร์ฟเวอร์เปล่าๆ นั่นเอง และหากต้องการ instance เพิ่มก็แค่รัน setup.exe ซ้ำอีกครั้ง แล้วก็เลือกชื่อ instance ที่ไม่ซ้ำกับของเดิมครับ

ข้อควรระวังสำหรับผู้ใช้งาน SQL Express Edition
SQL Express Edition จะต่างกับของเสียเงินนิดนึงหากไม่ระบุชื่อ instance จะสร้าง named instance ที่ชื่อว่า SQLExpress ให้อัตโนมัติ ดังนั้นเวลาใช้งานก็ต้องอ้างเป็น “ServerName\SQLExpress” แต่ถ้าอยากได้ default instance ใน SQL Express Edition ก็ให้เลือกตั้งชื่อเป็น MSSQLSERVER แทน ก็จะได้ default instance เวลาใช้งานสามารถอ้างเป็นชื่อเซิร์ฟเวอร์เปล่าๆ ได้เลยครับ

ข้อดีของการมีหลาย SQL Instance ในเครื่องเดียว
1) สามารถติดตั้ง SQL Server ได้หลายเวอร์ชั่น หลาย Edition ในเซิร์ฟเวอร์เครื่องเดียวกัน เช่น
    1a) มี SQL 2008 R2 Standard สำหรับงาน production และมี SQL 2008 Express สำหรับทำเป็นระบบทดสอบในเครื่องเดียว
    1b) บางโปรแกรมต้องกำหนด collation พิเศษ ซึ่งอาจส่งผลกระทบต่อ database อื่นในกรณีที่มี instance เดียวได้
2) การบริหารจัดการและดูแลรักษาของแต่ละ Named Instance แยกจากกัน
    เช่น เวลาแพตช์ SQL Express ต้องมี downtime ก็ทำได้ โดยอีก instance ที่เป็น SQL Standard ก็ยังทำงานได้ตามปกติ

แล้วข้อควรระวังของหลาย instance ล่ะ
1) ใช้ทรัพยากรของเครื่องเซิร์ฟเวอร์มากกว่า มีหลาย database แต่ใช้ Instance เดียว
2) ต้องระวังเรื่อง Disk I/O throughput และ Network Bandwidth ของ instance ที่ใช้งานสูงอาจกระทบกับ instance อื่นได้
3) ภาระบริหารจัดการจะสูงขึ้นเพราะต้องดูแลหลายที่ เช่น แพตช์, login, permission ก็ต้องทำหลายที่
4) การคิด license
    4a) SQL 2005 – เฉพาะ processor license และ Enterprise server license ที่สามารถทำหลาย instance โดยไม่ต้องซื้อเพิ่มได้
    4b) SQL 2008 – ทั้ง processor license และ server license ไม่ว่าจะ edition ไหน ก็สามารถทำหลาย instance โดยไม่ต้องซื้อเพิ่มได้ อ่านเพิ่ม ที่นี่
    4c) SQL 2008 R2 – ยังไม่มีข้อมูล
    ดังนั้นเรื่อง License แนะนำให้ปรึกษากับไมโครซอฟท์หรือคนขายก่อนจะดีกว่าครับ

พูดถึงเรื่อง SQL Server ก็มักจะมีคำถามว่าทำอย่างไรถึงจะทำให้ SQL Server มี high availability คำตอบแรกๆ และง่ายๆ ก็จะเป็นทำ Cluster วันนี้เราจะมีดูกันว่าต้องมีอะไรบ้างครับ

Hardware
1) เครื่องคอมพิวเตอร์ 2 เครื่อง — แน่ล่ะสิทำ cluster ก็ต้องเป็น 2 เครื่อง active กะ stand-by
2) share storage — อันนี้ยากแล้ว ถ้าจะให้ดีประสิทธิภาพสูงก็หนีไม่พ้น SAN หรือถ้าอยากได้ของถูก iSCSI ก็ได้นะ แต่คุณภาพสู้ไม่ได้แน่นอน
3) ระบบ Active Directory — เนื่องจากทุก advanced solution ต้องพึ่ง AD ดังนั้น SQL Cluster ก็เช่นกัน

Software
1) Windows Server 2008 R2 Enterprise Edition 2 licenses — ขอย้ำว่า Enterprise นะ เพราะต้องทำ Microsoft Fail Over Cluster
2) Microsoft SQL Server 2008 R2 Standard Editon 2 license — ถ้าทำแค่ cluster 2 node ใช้แค่ standard ก็พอครับ แต่หากอยากได้มากกว่านั้น ก็คงต้องกัดฟันจ่ายเงินเพิ่มเป็น Enterprise Edition สำหรับของฟรี Express Edition หมดสิทธิ์กับงาน cluster ครับ
3) SQL CALs ตามจำนวน client ถ้าข้อที่แล้วซื้อเป็น processor license ก็ข้ามได้ครับ

วิธีการแบบคร่าวๆ
1) ติดตั้ง Windows Server ลงบนทั้ง 2 เครื่อง และ patch ต่างๆ
2) ติดตั้ง Fail Over Cluster ลงบน Windows ทั้ง 2 เครื่องก่อน (แนะนำว่าควรจะมี share storage สำหรับ quorum disk ด้วย) ขั้นตอนนี้ต้องเตรียม IP เผื่อสำหรับ Virtual IP ของ Fail Over Cluster ด้วยนะครับ
3) ติดตั้ง SQL Cluster โหนดแรก โดยเลือกจาก New SQL Server Failover Cluster Installation ในหน้า Install Wizard ของ SQL
4) ติดตั้ง SQL Cluster โหนดที่สอง คราวนี้เลือก Add node to a SQL Server failover cluster แทนครับ
5) ติดตั้ง service pack และ hotfix อันนี้พิศดารนิดนึง สมัย SQL 2005 ทำที่ active node แล้วมันจะส่งมาที่ passive node ให้เอง แต่พอ SQL 2008 เป็นต้นมา เราต้องทำที่ passive node ก่อน แล้ว failover แล้วค่อยกลับไปทำที่ active node ที่กลายเป็น passive ไปแล้วแทน แม้ว่าจะยุ่งยากขึ้น แต่ downtime ลดลงนะครับ

ปล. High Availability กับ SQL server ไม่ได้มีแค่ Cluster นะครับ ที่พูดกันเยอะเพราะทำง่ายสุดครับ เพราะยังมีหลายทางเลือกเช่น Replication, Log Shipping, Mirroring หรือแม้แต่ Virtualization ก็มีครับ

ปัจจุบันโปรแกรมใหม่ๆ มักจำเป็นต้องใช้ฐานข้อมูล ซึ่งหากเป็นโปรแกรมบนวินโดวส์ก็จะมี Microsoft SQL Server อยู่ในรายชื่อแรกๆ แต่ว่าจะทำอย่างไรดีถ้าเราต้องการประหยัดงบ คำตอบง่ายๆ ครับ ทางไมโครซอฟท์แจกโปรแกรม Microsoft SQL Server Express Edition ให้ได้ใช้ฟรีกันมาเรื่อยๆ ซึ่งเวอร์ชั่นล่าสุดเป็น Microsoft SQL Server 2008 R2 Express Edition โดยมีให้เลือกทั้ง 32-bit และ 64-bit ตามแต่วินโดวส์ของผู้ใช้งานครับ นอกจากนี้ยังมีแยกประเภทอีกว่าจะให้รวมหรือไม่รวม Management Studio ซึ่งเป็นซอร์ฟแวร์ที่ใช้บริหารจัดการตัว SQL Server ด้วย โดยตัวผมแนะนำให้เลือกตัวที่รวม Management Studio ไว้จะดีกว่าครับเผื่อต้องมาแก้ปัญหาหรือมาดูคอนฟิกในอนาคตจะได้ไม่ลำบากนักครับ

สำหรับผู้ที่สนใจอยากดาวน์โหลด Microsoft SQL Server 2008 R2 Express Edition ไปใช้งานสามารถเข้าไปที่นี่เลยครับ
http://www.microsoft.com/download/en/details.aspx?id=23650