ใบความรู้หน่วยที่ 6

หน่วยที่ 6

 

การแบ็คอัพและรีสโตร์ข้อมูล

 

วัตถุประสงค์เชิงพฤติกรรม (Behavioral Objectives)

หลังจากศึกษาจบบทเรียนนี้แล้ว นักศึกษาจะมีความสามารถดังนี้

1. ศึกษา Transaction Log และ Check Point กับการกู้ข้อมูล

2. อธิบายการแบ็คอัพข้อมูล (Backup)

3. เข้าใจการสร้างแบ็คอัพดีไวซ์

4. ปฏิบัติการแบ็คอัพดาต้าเบสโดย Transaction SQL

5. ยกตัวอย่างการกู้ข้อมูล (Recovery)

6. บอกเทคนิคการกู้เต้าเบส

7. ลำดับขั้นตอนการกู้ยูสเซอร์ดาต้าเบส

8. จัดบอร์ดเชิงปฏิบัติการ “การแบ็คอัพและรีสโตร์ข้อมูล”

9. สนทนาเชิงปฏิบัติการ “การกู้ข้อมูล (Recovery)”

10. สนทนาเชิงปฏิบัติการ “การกู้ยูสเซอร์ดาต้าเบส”

11. อธิบายคำศัพท์ได้ 10 คำ

 

  บทที่ 6

การแบ็คอัพและรีสโตร์ข้อมูล

 

        การทำงานของ SQL Server ตั้งอยู่บนปัจจัยที่เกี่ยงข้องหลายอย่าง ตั้งแต่เครื่องที่เป็นฮาร์ดแวร์ (Hardware) ซอฟต์แวร์ (Software) ตลอดจนการจัดการที่ต้องอาศัยบุคลกรเข้าไปทำงานด้วย  ดังนั้น ปัจจัยต่างๆอาจจะเป็นสาเหตุหนึ่งที่ทำให้ข้อมูลเสียหายได้ เช่น ฮาร์ดแวร์ ได้แก่ดิสก์เสีย เครื่องไม่ทำงานหรือเปิดไม่ได้ เนื่องจากส่วนประกอบของฮาร์ดแวร์ไม่ทำงาน การทำงานของซอฟต์แวร์เองที่จะเป็นผลต่อความเสียหาย ได้แก่ Operating System (OS), ระบบการจัดการฐานข้อมูล (RDBMS) ทำงานบกพร่อง เช่น ดิสก์เสียทำให้ดาต้าเบสที่ใช้งานเสีย รวมถึงระบบต่างๆที่พัฒนาขึ้นก็มีโอกาสก่อให้เกิดความเสียหายของข้อมูลได้ นอกจากนี้ปัจจัยด้านบุคลากรก็เป็นสาเหตุหนึ่งที่ทำลายข้อมูลได้ เช่น การลบดาต้าเบส การลบเทเบิลโดยไม่ตั้งใจ

        ในกระบวนการทำงานที่ต้องใช้ข้อมูลจากดาต้าเบสนั้น การรักษาความปลอดภัยของข้อมูลและความถูกต้องของข้อมูลเป็นสิ่งที่จำเป็นมาก โดยทั่วไปในการใช้ระบบจัดการฐานข้อมูล (Relational Database Management System : RDBMS) จะต้องมีการสำรองข้อมูล (Back Up) แยกเก็บไว้บนสื่ออื่นเพื่อให้นำกลับมาใช้เมื่อดาต้าเบสเกิดขึ้นจากเหตุต่างๆ และวิธีการกู้ข้อมูลแบบอัตโนมัติซึ่ง SQL Server จะทำให้หลังจากมีการรีสตาร์ททุกครั้ง เรียกว่า System Recovery หรือ Automatic Recovery (คือ การที่ SQL Server พยายามกู้ข้อมูลในระบบกลับคืนใกล้สู่สภาพเดิมมากที่สุดก่อนที่ระบบจะมีปัญหา โดยจะทำงานควบคู่กับ Transation Log และ Check Point เพื่อรองรับทรานแซคชั่นหลายๆแบบที่เกิดขึ้นในขณะนั้น) โดยมีหลักการดังนี้

1        สำหรับทรานแซคชั่นที่ไม่มีการอัพเดทข้อมูลในดาต้าเบส คือ คิวรีเพียงอย่างเดียวก็จะไม่มีการ Recovery

2        ทรานแซคชั่นที่มีการคอมมิทรานแซคชั่นก่อนที่ระบบจะเสียหาย หรือคอมมิทก่อนจุด Check Point (คือ เวลาที่ระบบจัดการฐานข้อมูลจะนำทรานแซคชั่นที่เสร็จเรียบร้อยแล้วบันทึกลงใน ดาต้าเบส)แม้ว่าจะมีการบันทึกลงดิสก์หรือไม่ก็ตาม ระบบจะรับประกันว่าเมื่อรีสตาร์ท SQL Server ขึ้นมาใหม่ ทรานแซคชั่นและข้อมูลเหล่านั้นจะถูกกู้กลับมาอยู่ในสถานะที่ถูกต้อง

3        ส่วนทรานแซคชั่นที่มีการแก้ไขไปบ้าง แต่ยังไม่ได้คอมมิท เมื่อทำการกู้ระบบจะใช้ข้อมูลใน Transaction Log เพื่อยกเลิกทรานแซคชั่น และกลับไปสู่จุดก่อนที่ทรานแซคชั่นจะเริ่ม เหมือนกับว่าทรานแซคชั่นยังไม่ได้ถูกเริ่มทำงานเลย

4        ส่วนกรณีที่ระบบไม่สามารถกู้ดาต้าเบสกลับคืนมาได้ ก็จำเป็นต้องใช้ข้อมูลที่แบ็คอัพไว้มารีสตาร์ทเพื่อให้ข้อมูลในดาต้าเบสกลับ สู่สภาพปกติ

Transaction Log และ Check Point กับการกู้ข้อมูล

        ระบบจัดการฐานข้อมูลของ SQL Server จะดูแลความถูกต้องของการทำงานต่างๆในทุกลักษณะที่เกิดขึ้นกับดาต้าเบส ตั้งแต่ Insert, Update และ Delete โดยบันทึกคำสั่งของการทำงานรวมถึงการเปลี่ยนแปลงที่เกิดขึ้นกับดาต้าเบสลงใน Transaction Log ทุกครั้งก่อนที่จะทำการเปลี่ยนแปลงข้อมูลจริงลงไปในดาต้าเบส ซึ่งข้อมูลจะบันทึกลงดาต้าเบสเมื่อถึงจุด Check Point

        ทั้ง Transaction Log และ Check Point ถือได้ว่าเป็นบทบาทสำคัญต่อการกู้ข้อมูลเมื่อมีความเสียหายเกิดกับระบบอย่าง กะทันหัน และหลังจากสตาร์ทเซอร์วิสของ MSSOL Server

ใหม่แล้ว ระบบจัดการฐานข้อมูล (RDBMS) จะทำการกู้ความเสียหายเบื้องต้น โดยจะกู้ดาต้าเบสที่เสียหาย (ถ้ามี) เรียงลำดับ Master,Model,Temp DB,MSDB และดาต้าเบสอื่นๆ เช่น ดาต้าเบสที่สร้างโดยยูสเซอร์ เป็นต้น

        ก่อนที่จะลงรายละเอียดของการกู้ข้อมูล ควรจะทำความเข้าใจในเรื่องของ Transaction Log

และ Check Point เสียก่อน จากรูปเวลาที่แต่ละทรานแซคชั่นเกิดขึ้นจนกระทั่งเสร็จสิ้น คือ T1 ถึง T5 ระยะเวลาที่ระบบทำ Check Point คือ T(c)และ T(f) คือ เวลาที่มีความผิดปกติเกิดขึ้น

 

 

จากรูปอธิบายได้ดังนี้

        1  System Failure เกิดขึ้นที่ T(f) และ   Check Point ครั้งล่าสุดที่เกิดขึ้นก่อน T(f) คือ เมื่อเวลา T(c)

            2 Transaction T1 เสร็จสิ้นก่อนเวลาT(c)

            3. Transaction T2 เกิดก่อนเวลา T(c) และเสร็จสิ้นหลังเวลา T(c) แต่ก่อนเวลา T(f)

            4.  Transaction T3 เกิดก่อนเวลา T(c) แต่ไม่เสร็จสิ้นหลังเวลา T(c)

            5. Transaction T4เกิดก่อนเวลา T(c) และเสร็จสิ้นหลังเวลา T(c)

            6. Transaction T2 เกิดก่อนเวลา T(c) แต่ไม่เสร็จสิ้นหลังเวลา T(c)

และหลังจากสตาร์ทเซอร์วิส MSSQL Server ใหม่ได้แล้ว ระบบจะทำการกู้ข้อมูลและตรวจสอบทรานแซคชั่นต่างๆจาก Transaction Log ซึ่งพบว่า

1        T3 และ T5 จะต้องยกเลิก (Roll Back) เนื่องจากไม่มีการคอมมิททรานแซคชั่นก่อนที่ระบบเสียหาย คือ ใน Transaction Log ไม่พบคำสั่ง Commit Transaction นั่นเอง

2        T2 และ T4 ทรานแซคชั่นทั้งสองนี้ SQL Server จะอ่านจาก Transaction Log และเข้าไปทำงานใหม่ (Roll Forward) ทั้งนี้เพราะพบว่ามีการคอมมิททรานเซคชั่นหลังจุด Check Point แต่เกิดก่อนเวลาที่เครื่องจะเสียซึ่งหมายความว่า ข้อมูลที่ทำงานตามคำสั่งยังไม่ได้บันทึกลงในดาต้าเบสเท่านั้น

3        มีข้อสังเกตว่า T1ไม่ต้องเข้ามาในขบวนการยกเลิก หรือทำงานใหม่ ทั้งนี้เนื่องจาก T1 ได้ทำงานเสร็จสิ้นก่อนจุด Check Point นั่นแสดงว่าระบบได้ทำการบันทึกข้อมูลของการเปลี่ยนแปลงลงดาต้าเบสเรียบร้อย แล้ว

4         

การแบ็คอัพข้อมูล (Backup)

            การแบ็คอัพ คือ การสำรองข้อมูลโดยใช้คำสั่งของ SQL Server เพื่อเก็บไว้บนสื่อชนิดอื่น เช่น เทป หรือดิสก์ ซึ่งควรจะเป็นก้อนอื่นนอกเหนือจากก้อนที่เก็บดาต้าเบส ถึงแม้ว่าระบบจัดการฐานข้อมูลของ SQL Server จะเอื้ออำนวยต่อการทำ Automatic Recovery เมื่อข้อมูลเกิดความเสียหายแล้วก็ตาม ผู้ใช้งานระบบควรต้องมีการแบ็คอัพข้อมูลไว้ด้วยเพื่อความปลอดภัยให้มากยิ่ง ขึ้น เพราะถ้าการทำ Automatic Recovery ของ SQL Server ไม่สำเร็จ ก็อาจต้องใช้ข้อมูลชุดแบ็คอัพแทน การแบ็คอัพข้อมูลจะสามารถแบ็คอัพดาต้าเบสตั้งแต่ Master,MSDB,Mode,

Distribution Database รวมทั้งดาต้าเบสที่ผู้ใช้สร้างขึ้นด้วย

ประเภทของการแบ็คอัพ

            SQL Server เอื้ออำนวยความสะดวกในการแบ็คอัพ โดยขึ้นกับผู้ใช้งานมีความต้องการจะแบ็คอัพข้อมูลในลักษณะใด การเลือกประเภทของการแบ็คอัพยังขึ้นกับปริมาณข้อมูลด้วย

1        Database-Complete คือ การแบ็คอัพข้อมูลทั้งหมดของดาต้าเบส และบางส่วนใน Transation Log ที่เกิดขึ้นขณะทำการแบ็คอัพ หรือบางครั้งก็เรียกว่าการทำ Full  Backup ซึ่งสามารถแบ็คอัพขณะที่ดาต้าเบสกำลัง Online หรือกำลังถูกใช้งานอยู่ โดยเมื่อเริ่มทำการแบ็คอัพ SQL Server จะเพิ่มรายการแบ็คอัพนี้ไว้ใน Transation Log เพื่อให้รู้ว่าจุดเริ่มต้นอยู่ที่ใด เมื่อแบ็คอัพส่วนที่เป็นดาต้าเบสเสร็จ ก็จะแบ็คอัพ Transation Log ที่เกิดขึ้นเป็นวิธีการแบ็คอัพที่สะดวก และสามารถนำไปใช้ในการทำแบ็คอัพ ล่าสุดเท่านั้น การแบ็คอัพวีธีนี้เหมาะสำหรับ Master,MSDB,Model และยูสเซอร์ดาต้าเบสที่ข้อมูลไม่มากนักและใช้เวลาการแบ็คอัพไม่นาน โดยทั่วไปถ้าดาต้าเบสมีขนาดใหญ่มากและอัพเดทบ่อยๆจะใช้ร่วมกับการแบ็คอัพแบบ อื่นๆคือ Differential และTransaction Log ทำให้ไม่เสียเวลามากไป และยังได้ข้อมูลที่ใกล้เคียงกับความเป็นจริงมากที่สุด

2        Database-Differential คือ การแบ็คอัพเฉพาะเป็นส่วนที่เป็นข้อมูลที่มีการเปลี่ยนแปลงดังนั้นถ้ามีการ แบ็คอัพแบบ Differrntial ทุกคืน ข้อมูลลที่แบ็คอัพในคืนวันพุธจะมีข้อมูลที่มีการเปลี่ยนแปลงของทั้งวัน จันทร์และอังคารด้วย เวลาที่จะกู้ข้อมูลก็เพียงแต่นำชุด Full Backup ลงก่อน จากนั้นจึงค่อยนำ Differential Backup ครั้งล่าสุดลงถัดไป

3        Transaction Log คือการแบ็คอัพเฉพาะส่วนที่เป็น Transaction Log การแบ็คอัพแบบนี้จะใช้เมื่อต้องบการแบ็คอัพข้อมูลจนถึงปัจจุบัน ทั้งนี้เพราะข้อมูลที่คอมมิทหลังจากการแบ็คอัพแบบ Full และ Differential ก่อนแล้วจึงค่อยแบ็คอัพ Transaction Log เป็นระยะๆ เมื่อเสร็จสิ้นการแบ็คอัพนี้แต่ละครั้ง SQL Server จะตัดส่วน (Truncate) ของ Transaction Log ที่สมบูรณ์ไป แล้วนำพื้นที่นี้มาใช้ใหม่เพื่อทำ Transaction Log ครั้งถัดไปช่วยให้ Transaction Log มีขนาดใหญ่ไป (การทำแบบ Full และ Differential จะไม่ Truncate ส่วน Transaction Log เมื่อจบการแบ็คอัพ) ดังนั้นเมื่อต้องการจะกู้ข้อมูล ก้อจะต้องเริ่มจากการนำ Full Backup หรือ Differential ลงก่อน แล้วจึ่งค่อยทยอยนำ Transaction Log ที่แบ็คอัพไว้แต่ละชุดลงตามลำดับก่อนหลัง

Time1                          Full  Backup

Time2                          Transaction Log Backup

Time3                          Full Backup

Time4                          Transaction Log Backup

Time5                          System Fail

เมื่อกู้ข้อมูลหลังเวลา Time5 ก็ให้นำ Full Backup ที่เวลา Time3 ลงก่อนจากนั้นค่อยนำ Transaction Log Backup ที่เวลา Time4 ลงแต่เนื่องจาก Log ที่มีในเวลา Time4 นั้นจะเริ่มตั้งแต่หลังจากที่แบ็คอัพ Time2 ซึ่ง่จ่ะคลุม Log ที่ช่วงเวลา Time3 ไปด้วย ดังนั้นจะมีบางส่วนที่ซ้ำกันคือ ช่วง Time2 และ Time3 ทั้งใน Full Backup และ Transaction Log Backup แต่ขณะกู้ข้อมูล SQL Server หากตรวจว่ามีบางส่วนที่ซ้ำกันก็จะข้าม Log ช่วงนั้นใน Transaction Log ไป สิ่งที่จะต้องระวังเมื่อต้องลง Transaction Log ที่แบ็คอัพไว้หลายๆชุดประกอบกันเพื่อกู้ข้อมูล คืออย่าให้แบ็คอัพชุดใดชุดหนึ่งเสียไป เพราะจะทำให้กู้ข้อมูลกลับมาได้ไม่หมด

4.  File and Filegroup ในดาต้าซึ่งประกอบไปด้วยไฟล์และไฟล์กรุ๊ปต่างๆ สามารถเลือกที่จะแบ็คอัพแยกแต่ละไฟล์หรือไฟล์กรุ๊ปได้โดยไม่ต้องแบ็คอัพทั้ง ดาต้าเบส วิธีนี้เหมาะสำหรับดาต้าเบสที่ขนาดใหญ่มากๆและมีเวลาไม่เพียงพอที่จะแบ็คอัพ ได้หมด หรือมีการแบงดาต้าเบสแยกเก็บไว้ในหลายๆดิสก์ เมื่อมีดิสก์ใดเกิดเสีย ก็กู้การกู้ไฟล์ก็ยังต้องใช้ชุดแบ็คอัพ Transaction Log ของไฟล์หรือไฟล์กรุ๊ปนั้นลงตามนอกจากว่าข้อมูลในไฟล์หรือไฟล์กรุ๊ปไม่มี การอัพเดท

ข้อจำกัดระหว่างการแบ็คอัพ

แม้ว่าการแบ็คอัพของ SQL Server จะสามารถทำงานได้ขณะที่ยังมีการใช้งาน SQL Server อยู่แต่ก็มีข้อจำกัดบางอย่างไม่ควรกระทำระหว่างการแบ็คอัพ

สำหรับการแบ็คอัพแบบ Full และ Differential สิ่งที่ไม่ควรทำคือ

  1. การจัดการเกี่ยวกับดาต้าเบส ได้แก่ ALTER DATABASE,CREATE DATABASE  และ DROP DATABASE
  2. การลดขนาดเนื้อที่ดาต้าเบสด้วยคำสั่ง DBCC SHRINKDATABASE
  3. การสร้างอินเด็กซ์ (เป็นข้อห้ามเฉพาะเมื่อมีการแบ็คอัพดาต้าเบสเท่านั้น)
  4. การใช้คำสั่งที่ไม่มีการบันทึกใน Transaction Log ได้แก่ Balk Copy,SELEC INTO ในกรณีที่คำสั่งนี้กำลังทำงานอยู่ แล้วมีการสั่งแบ็คอัพ SQL Server ก็จะยกเลิกการแบ็คอัพ แต่ในทางกลับกันคือ ถ้ากำลังแบ็คอัพอยู่ แล้วมีการส่งคำสั่งเหล่านี้เข้าไป ก็จะทำการยกเลิกคำสั่งเหล่านั้น

ส่วนการแบ็คอัพแบบ Transaction Log จะไม่เกิดขึ้นมา

  1. กำหนดออปชั่น trunc. Log on chkpt ให้เป็น TRUE ซึ่ง Transaction Log จะถูก Truncate เมื่อเกิด Check Point เท่านั้น
  2. ไม่มีการบันทึกคำสั่งลงใน Transaction Log เลยเพราะเรียกแต่คำสั่งที่ไม่บันทึกลง Transaction Log หลังจากการแบ็คอัพดาต้าเบสครั้งสุดท้าย
  3. มีการเพิ่มหรือลบไฟล์ออกจากดาต้าเบส
  4. Transaction Log ถูก Truncate

การวางแผนการแบ็คอัพ

ก่อนที่จะเริ่มลงมือทำการแบ็คอัพนั้น ควรจะมีการวางแผนว่าจะแบ็คอัพดาต้าเบสด้วยวิธีใด เมื่อไร ในหัวข้อนี้จึงมีแนวทางพอสังเขปเกี่ยวกับการแบ็คอับไว้ให้พิจารณาดังนี้

สำหรับการแบ็คอัพดาต้าเบสแต่ละประเภทควรทำเมื่อมีการเปลี่ยนแปลงเกิดขึ้น สรุปเป็นตารางได้ดังนี้

 

ชนิดของดาต้าเบส

ประเภทและเวลาที่ควรทำแบ็คอัพ

Master

 ทำ Full Backup และแบ็คอัพเมื่อมีการเรียกคำสั่งที่มีผลต่อ System Table ซึ่งได้แก่คำสั่ง

     *เพิ่ม แก้ไข และยกเลิกรหัสล็อคอิน

     *CREATE,ALTER และ DROP DATABASE

     *CREATER,ALTER และ DROP ไฟล์กรุ๊ปหรือแบ็คอัพดีไวซ์

     *เปลี่ยนออปชั่นของเซิร์ฟเวอร์หรือดาต้าเบส

     *เพิ่มหรือยกเลิกการลิงค์เซิร์ฟเวอร์

MSDB

ทำ Full Backup และควรทำเมื่อ

  *สร้างงานที่มีการตั้งเวลาให้ทำงานอัตโนมัติเพราะ MSDB Schedule Task

 *มีการทำ หรือปรับแต่งออปชั่นการทำ Replicate

Model

ทำ Full Backup และควรทำเมื่อมีการแก้ไขพร็อพเพอร์ตี้ของดาต้าเบสและเมื่อ เพิ่ม แก้ไข หรือยกเลิกอ๊อปเจ็กต์ในดาต้าเบส Model

Distribution

เมื่อมีการเปลี่ยนแปลงข้อมูลหรือโครงสร้างของดาต้าเบส

User Database

ทำ Full Backup ร่วมกันกับ Differential ควรทำเมื่อสร้างดาต้าเบส เพิ่ม ลบ หรือ เปลี่ยนแปลงโครงสร้างของเทเบิล ข้อมูล รวมทั้งการสร้างอินเด็กซ์

 

เมื่อได้แนวทางในการแบ็คอัพแล้วก็ควรจัดทำตารางเวลาทำการแบ็คอัพเป็น ระยะๆสำหรับดาต้าเบส Master,MSDB,Model และ Distribution อาจไม่ยุ่งยากมากนัก แต่สำหรับ User Database จำเป็นต้องกำหนดเวลาและวิธีการแบ็คอัพให้ดีโดยมวัตถุประสงค์หลักๆคือ

1        ให้การแบ็คอัพมีผลต่อระบบรวมน้อยที่สุด

2        สามารถกู้ข้อมูลที่ถูกคอมมิทคืนกลับมาได้หมด หรือใกล้เคียงมากที่สุด

3        ใช้เวลาในการกู้ให้น้อยที่สุด

ดังนั้น การเลือกวิธีใดวิธีหนึ่งในการแบ็คอัพ User Database ไม่สามารถจะบรรลุวัตถุประสงค์ข้างต้นได้ เช่น เลือกทำ Full Backup ทุกทรานแซคชั่น ก็จะทำให้เสียเวลาและเกินกำลังของเครื่องมาก อีกทั้งใช้เวลาในการกู้นานไปด้วย หรือหากมีการแบ็คอัพทุกทรานแซคชั่นที่เกิดขึ้นการกู้ข้อมูลก็จะใช้เวลา เนื่องจากต้องจัดการทุกทรานแซคชั่น การทำแบ็คอัพจึงควรใช้หลายๆวิธีร่วมกัน เช่น กำหนดให้ทำ Full Backup เดือนละครั้ง ขณะที่ทำ Differential ทุกอาทิตย์และทำการแบ็คอัพ Transction Log ทุกคืนอย่างไรก็ตาม การวางแผนยังขึ้นกับขนาดของดาต้าเบสความสำคัญของข้อมูล รวมทั้งมาตรการในการกู้ข้อมูลว่าจะให้ได้คืนมากน้อยเท่าใด

 

การตรวจสอบก่อนการแบ็คอัพ

ในขบวนการแบ็คอัพข้อมูลของ SQL Server ผู้ใช้งานควรตรวจสอบความถูกต้องของดาต้าเบสก่อน เพื่อให้มั่นใจว่าข้อมูลที่มีอยู่ในดาต้าเบสมีความถูกต้องสมบูรณ์ก่อนการ แบ็คอัพโดยมีคำสั่งสำคัญๆ 2 คำสั่ง คือ DBCC,CHECKDB และ DBCC CHECKALLOC

 

 

คำสั่งจะตรวจสอบรายละเอียดต่างๆดังนี้

1        ตรวจสอบข้อมูลและอินเด็กซ์ของดาต้าเบสสอดคล้องกันหรือไม่ (IntrgrtyX

2        ตรวจสอบการลิงค์ของดาต้าเบสและอินเด็กซ์เพจว่ามีการลิงค์อย่างถูกต้อง

3        ตรวจสอบการจัดเรียงอินเด็กซ์เพจ

4        ตรวจสอบตำแหน่งที่ชี้ของพอยท์เตอร์

5        ตรวจสอบความถูกต้องของข้อมูลในแต่ละเพจรวมทั้งการจัดสรรเพจต่างๆในดาต้าเบส

6        ตรวจสอบ Page Offset

7        ตรวจสอบขนาดของประเภทข้อมูลแบบ Text,Ntext และ Imgae สำหรับแต่ละเทเบิล

คำสั่งนี้จะทำหน้าที่เหมือนกับการใช้ทั้งคำสั่ง DBCC CHECKALLOC และ DBCC CHECKTABLE ดังนั้นหลังจากใช้คำสั่ง DBCC CHECKDB แล้วจึงไม่จำเป็นต้องใช้คำสั่ง DBCC CHECKALLOC หรือ DBCC CHECKTABLE อีก ในขณะที่เอ็กซีคิวคำสั่งนี้จะทำการ Shared Lock เทเบิลและอินเด็กซ์ที่อยู่ในดาต้าเบสทั้งหมด ทำใหไม่สามารถแก้ไข สร้างหรือ ลบเทเบิลใดๆได้เลย

ออปชั่นต่างๆมีความหมายดังนี้

1        database_name :  ชื่อของดาต้าเบส ถ้าไม่ระบุจะตรวจสอบดาต้าเบสปัจจุบัน

2   NOINDEX: จะไม่ตรวจสอบอินเด็กซ์ชนิด Non-Clustered สำหรับทุกเทเบิลในดาต้าเบสนั้น แต่จะไม่มีผลกับเทเบิลของระบบเพราะจะทำการตรวจสอบให้อัตโนมัติอยู่แล้ว

3        REPAIR_ALLOW_DATA_LOSS | REPAIR_REBUILD : ระบุให้แก้ไขเมื่อพบข้อผิดพลาดที่เกิดขึ้นที่เกิดขึ้นบนดาต้าเบส

4        ALL_ERRORMSGS : ให้แสดงข้อความรายละเอียดของการตรวจเช็คทั้งหมด ถ้าไม่ระบุจะแสดงเพียง 200 รายการสำหรับแต่ละเทเบิล

5        NO_INFOMSGS: ไม่แสดงรายละเอียดของการตรวจเช็ค บอกแต่เพียงว่าการตรวจเช็คได้เสร็จสิ้นลงแล้ว

ตัวอย่าง การตรวจสอบด้วย DBCC CHECKDB

DBCC CHECKDB(‘FIRSTCB’)

 

 

เป็นคำสั่งที่ตรวจสอบความสอดคล้องกันของเทเบิลต่างๆโดยตรวจสอบทั้งความ ถูกต้องภายใน และตรวจสอบความสอดคล้องกันระหว่างเทเบิล เช่น การตรวจสอบชื่คอลัมน์ทีเก็บในเทเบิล Syscolumns ให้มีประเภทข้อมูลที่ถูกต้องตรงกับเทเบิล Systypes การตรวจสอลชื่อเทเบิลและวิวทีอยู่ในเทเบบิล Sysobjects คือให้มีคอลัมน์ตรงกับเทเบิล Syscolumns

1        database_name คือ ชื่อของดาต้าเบส ถ้าไม่ระบุจะตรวจสอบดาต้าเบสปัจจุบัน

2        WITH NO_INFORMSGS ไม่แสดงข้อความรายละเอียดของการตรวจเช็ค บอกแต่เพียงการตรวจเช็คได้เสร็จสิ้นลงแล้ว

ถ้าระบุชื่อดาต้าเบสจะตรวจสอบที่ดาต้าเบสตัวนั้น แต่ถ้าไม่ระบุชื่อดาต้าเบสจะตรวจสอบดาต้าเบสปัจจุบัน

ตัวอย่าง การตรวจด้วย

 

 

การสร้างแบ็คอัพดีไวซ์

        ในการแบ็คอัพซึ่งต้องระบุสื่อที่ใช้เก็บข้อมูลที่เรียกว่า แบ็คอัพดีไวซ์ (Backup Device) นั้น อาจระบุถึงสื่อโดยใช้ชื่อที่เป็น Physical Name หรือ Logical Name ก็ได้ สำหรับ Physical Name  เป็นชื่อที่ระบบปฏิบัติการกำหนดมาให้ เช่น C:Backups SalesFull.bak เป็นดิสก์ดีไวซ์สำหรับการแบ็คอัพเพื่อเก็บไว้บนดิสก์ \.TAPE0  เป็นเทปดีไวซ์ของเครื่องที่ต่อกับเครื่องนั้น ๆ (Local Server) สำหรับ Logical Name เป็นชื่อเล่นหรืออีกชื่อหนึ่ง (Alias Name) ของแบ็คอัพดีไวซ์ ที่ผู้ใช้กำหนดขึ้นมาใหม่เพื่อให้เรียกใช้ได้ง่ายกว่าการใช้ Physical Name อย่างไรก็ตามสามารถใช้ชื่อทั้งสองแบบสลับกันไปมาได้ และสามารถจะใช้ Logical Name นี้ได้เฉพาะใน SQL Server เท่านั้น การสร้างแบ็คอัพดีไวซ์จึงเป็นการสร้าง Logical Name ให้กับแบ็คอัพดีไวซ์ที่มีอยู่ ไม่ได้สร้าง Physical Device ขึ้นมา (ถ้าจะสร้าง Physical Device ให้ปรึกษาดูแลระบบ Windows NT)

            ในการแบ็คอัพลงบนแบ็คอัพดีไวซ์ เราสามารถใช้แบ็คอัพดีไวซ์เพียงตัวเดียวเพื่อทำการแบ็คอัพข้อมูลจากหลาย ๆ ดาต้าเบสได้ หรือเราอาจเลือกแบ็คอัพดีไวซ์หลายตัวมาช่วยในการแบ็คอัพข้อมูลชุดเดียวกันใน แต่ละครั้งก็ได้ ทั้งนี้ให้พึงระวังว่า ถ้ามีการแบ็คอัพหลายดาต้าเบสต้องเลือกออปชั้นให้ข้อมูลชุดถัดไปอยู่ต่อจาก ข้อมูลชุดแรกเสมอ (Append) และถ้าเป็นการแบ็คอัพครั้งแรกที่ต้องการลบส่วนที่แบ็คอัพก่อนหน้านี้ออกไปก็ ให้เลือกเป็น Overwrite

 

          การสร้างแบ็คอัพดีไวซ์ Enterprise Manager

            1. เป็น Enterprise Manager แล้วเข้าสู่ Server ที่ต้องการ

        2.  ในกรอบด้านซ้ายให้คลิกเมาส์ที่เครื่องหมาย + ที่ Management จะเห็นโฟลเดอร์ Backup ให้คลิกเมาส์ปุ่มขวาที่ Backup แล้วเลือก New Backup Device…

            3.  ที่หน้าจอ Backup Device Properties – New Device

 

 

                        — ที่ช่อง Name ให้ตั้งชื่อ Logical Name ของดีไวซ์

                        — คลิกเช็คบ็อกซ์ File Name เพื่อเลือกดีไวซ์เป็นดิสก์ (ถ้าคลิกเช็คบ็อกซ์ Tapc Drive Name จะเลือกดีไวซ์แบบเทป) และระบุ Physical Name ถ้าเครื่องเซิร์ฟเวอร์ไม่มีเทปต่ออยู่ออปชั่น Tape Drive Name จะถูก Disable ไม่ให้เลือก

        4.  เมื่อเรียบร้อยให้คลิก OK

 

การสร้างแบ็คอัพดีไวซ์โดย Transaction-SQL

        — ‘device_type’ : ชื่อของดีไวซ์แบบดิสก์หรือเทป โดยใช้คำเฉพาะว่า disk หรือ tape

        — ‘logical_nane’ : ชื่อที่ใช้อ้างอิงใน SQL Server

        — ‘physical_name’ : สำหรับดิสก์ คือ ชื่อของไฟลเดอร์ ซึ่งอาจเป็นดิสก์ของเครื่องอื่น ๆ ในเน็ตเวิร์กก็ได้ หรือถ้าเป็นเทปก็คือตำแหน่งของเทปทางกายภาพที่ต่ออยู่กับเครื่องนั้น เช่น \. ape0

ตัวอย่าง  สร้างแบ็คอัพดีไวซ์ที่ดิสก์ชื่อ BACKALLDB ไว้ที่โฟลเดอร์

 

 

การลบแบ็คอัพดีไวซ์โดย Enterprise Manager

            1.  เปิด Enterprise Manager แล้วเข้าสู่ Server ที่ต้องการ

        2.  ในกรอบด้านซ้ายให้คลิกเมาส์ที่เครื่องหมาย + ที่ Management คลิกโฟลเดอร์ Backup จะเห็นชื่อแบ็คอัพดีไวซ์ทั้งหมดที่วินโดว์ขวามือ

        3.  คลิกเมาส์ปุ่มขวาตรงชื่อของแบ็คอัพดีไวซ์ที่จะลบ แล้วเลือก Delete

 

 

 

            4.  เครื่องจะแสดงข้อความเพื่อยืนยันอีกครั้ง ถ้าแน่ใจให้คลิก Yes

 

การลบแบ็คอัพดีไวซ์ด้วย Transaction-SQL

            — ‘device’ : Logical Name mต้องการลบ โดยที่ Physical Device ยังคงอยู่

        — [@delfile =[‘delfile’] : ถ้าระบุออปชั่น Defile จะทำให้ลบ Physical File ที่อยู่บนดิสก์ออกไป

ตัวอย่าง    ลบแบ็คอัพดีไวซ์ที่ดิสก์ชื่อ BACKALLDB

 

 

 

            การแบ็คอัพดาต้าเบสโดย Enterprise Manager

            การแบ็คอัพโดยใช้ Enterprise Manager นี้ สามารถเลือกวิธีการแบ็คอัพได้ทุกแบบ เช่น แบบ Database-Complete, Database Differential, Transaction Log หรือ File and File Group โดยมีหลักการเดียวกัน ซึ่งจะเห็นได้จากขั้นตอนต่อไปนี้

        1.  เปิด Enterprise Manager แล้วเข้าสู่ Server ที่ต้องการ

2.  ในกรอบด้านซ้ายให้คลิกเมาส์ที่เครื่องหมาย + ที่ Databases จะโชว์ชื่อดาต้าเบส

        3.  ให้คลิกเมาส์ปุ่มขวาดาต้าเบสที่เราต้องการ แล้วเลือก All Tasks>Backup Database

            4.  หน้าจอ SQL Server Backup จากรูปอธิบายเพิ่มเติมได้ดังนี้

 

 

 

        — Database คือ ชื่อดาต้าเบสที่จะแบ็คอัพ ซึ่งหากต้องการเลือกใหม่ให้คลิกที่ปุ่มลูกศรชี้ลงข้าง ๆ กรอบ Database

            — Name คือ ชื่อของการแบ็คอัพครั้งนี้ โดยปกติ SQL Server จะกำหนดให้โดยใช้ชื่อดาต้าเบสก่อนแล้วตามด้วยคำว่า Backup ถ้าจะเปลี่ยนก็ให้บันทึกซ้ำ

        — Description คือ คำอธิบายการแบ็คอัพ

        — Backup คือ การระบุชนิดของการแบ็คอัพมี 4 แบบ คือ

                ¡ Database – Complete แบ็คอัพทั้งดาต้าเบส

                ¡ Database – Differential แบ็คอัพเฉพาะส่วนที่มีการแก้ไขเพิ่มติมของดาต้า

เบส หลังจากการแบ็คอัพครั้งที่แล้ว

                ¡ Transaction Log แบ็คอัพเฉพาะ Transaction Log และ Truncate Transaction Log ให้ด้วย

                ¡ File and File Group แบ็คอัพเฉพาะไฟล์หรือไฟล์กรุ๊ปที่ต้องการ

                ¡ Destination คือ ดีไวซ์หรือสื่อที่ใช้เก็บข้อมูลที่แบ็คอัพ อาจเป็นดิสก์หรือเทปก็ได้ โดยจะระบุเป็น Logical Name หรือ Physical Name

                        ¡ คลิกปุ่ม Add เพื่อใส่ชื่อแบ็คอัพดีไวซ์สำหรับแบ็คอัพ หรือสร้างแบ็คอัพใหม่จะแสดงในขั้นที่ 5

                ¡ คลิกปุ่ม Remove เพื่อลบดีไวซ์

                ¡ คลิกปุ่ม Content เพื่อแสดงข้อมูลที่เก็บไว้ในแบ็คอัพดีไวซ์นั้น

                ¡ Overwrite มี 2 แบบให้เลือกคือ Append to Media คือ ให้บันทึกต่อท้ายข้อมูลเดิมในแบ็คอัพดีไวซ์และ Overwrite Existing Media หมายถึง การบันทึกทับข้อมูลเดิมในแบ็คอัพดีไวซ์

                ¡ Schedule คือ ตั้งเวลาการแบ็คอัพเพื่อให้ทำงานโดยอัตโนมัติเมื่อถึงเวลานั้น ให้คลิกที่เช็คบ็อกซ์ Schedule แล้วคลิกปุ่ม ... จะได้บนหน้าจอที่ให้กำหนดรายละเอียดของการตั้งเวลาในการแบ็คอัพ

                ¡ Name  ชื่อของการทำงานครั้งนี้ ซึ่งมีค่าดีฟอลต์เป็น Schedulel

                        ¡ Enabled ถ้าคลิกเลือกเช็คบ็อกซ์ที่ออปชันนี้ คือ สามารถทำงานหลังจากกำหนดออปชั่นทั้งหมดเรียบร้อย

                ¡ Schedule Type คือ ตัวกำหนดว่าจะให้แบ็คอัพนี้เกิดขึ้นเมื่อใด

                ¸ Start Automatically When SQL Server Agent Starts ให้แบ็คอัพเมื่อเซอร์วิส ของ SQL Server Agent สตาร์ท

                ¸ Start Whenever The CPU (s) Become Idle ให้แบ็คอัพเมื่อ CPU อยู่ในสถานะ Idle (หยุดพัก)

                ¸ One Time ให้แบ็คอัพตามวันที่กำหนด (On Date) และเวลาที่กำหนด (On Time)

                ¸ Recurring คือ ให้แบ็คอัพซ้ำ ๆ กันได้ โดยกำหนดให้ทำทุกวัน หรือทุกสัปดาห์ หรือทุกเดือนนี้ ทั้งนี้ให้เลือกโดยคลิกที่ปุ่ม Change

            5.  เมื่อคลิกปุ่ม Add ในกรอบ Destination ของขั้นที่ 4 เปลี่ยนไปแสดงที่หน้าจอ Choose Backup Destination ให้คลิกที่เช็คบ็อกซ์ Backup Device แล้วคลิกที่ปุ่มลูกศรชี้ลงเพื่อเลือก Logical Name ชื่อ Backup_1 เมื่อเรียบร้อยคลิก OK หรือจะเลือกเป็น File Name เพื่อระบุเป็น Physical Name ที่จะใช้แบ็คอัพ

 

 

 

        6.  เครื่องจะกลับไปที่หน้าจอ SQL Server Backup และแสงชื่อของ Backup_1 ที่กรอบของ Destination (ถ้าเลือกดีไวซ์หลายตัว คือ การให้แบ็คอัพลงหลายดีไวซ์พร้อม ๆ กัน ซึ่งจะช่วยเพิ่มความเร็วในการแบ็คอัพถ้าดีไวซ์นั้นอยู่คนละไดรฟ์กัน)

 

 

 

 

 

 

 

  1. ให้คลิกแท็ป Options เพื่อดูออปชั่นในที่นี้ให้กำหนดตามดีฟอลต์ จากนั้นคลิก OK แต่ละออปชั่นมีความหมาย ดังนี้

 

 

 

 

 

                — Verify Backup Upon Completion ให้ระบบตรวจสอบผลการแบ็คอัพอีกครั้งหลังจากแบ็คอัพเสร็จแล้ว

                — Eject Tape After Backup ให้ดันม้วนเทปออกจากเทปไดรฟ์หลังจากแบ็คอัพเสร็จ

                — Remove Inactive Entries From Transaction Log (ใช้เฉพาะกับการแบ็คอัพ Transaction Log) ให้ลบ (Truncate) รายการใน Transaction Log ที่คอมมิทแล้วหลังจากที่แบ็คอัพเสร็จ

                — Check Media Set Name and Backup Set Expiration ให้ตรวจสอบชื่อของดีไวซ์และวันหยุดอายุของดีไวซ์ก่อนที่จะบันทึก จะช่วยป้องกันความผิดพลาดในการหยิบแบ็คอัพดีไวซ์ที่ผิดมาใช้ที่ช่อง Media Set Name ให้ระบุชื่อของดีไวซ์

— Backup Set Will Expire ระบุจำนวนวันหรือวันที่ที่จะให้ดีไวซ์นั้นหมดอายุและพร้อมที่จะให้บันทึกทับ ดีไวซ์นั้นได้ มี 2 แบบ คือ After ให้บันทึกทับดีไวซ์นั้นเมื่อครบจำนวนวันที่กำหนด หลังจากแบ็คอัพเสร็จ ส่วน On คือ ให้บันทึกทับดีไวซ์นั้นหลังจากวันที่กำหนด

                — Initialize and Label Media ให้บันทึกรายละเอียดเกี่ยวกับเทปที่ส่วนต้นของเทปและลบข้อมูลเดิมที่มีอยู่ รวมทั้งรายละเอียดเดิมออกไป เช่น วันหมดอายุ Media Set Name มักใช้เมื่อใช้สื่อบันทึกเป็นครั้งแรก หรือต้องการเปลี่ยนข้อมูลเดิมที่มีอยู่เสียใหม่

                        ¡ Media Set Name ระบุชื่อของดีไวซ์ที่ส่วนตัวของดีไวซ์

                        ¡ Media Set Description ระบุส่วนที่เป็นคำอธิบายเพิ่มเติมเกี่ยวกับดีไวซ์

  1. เครื่องจะทำการแบ็คอัพจนกระทั่งแสดงข้อความ “The Backup Operation has been Completed Successfully”  ให้คลิก OK

 

 

 

การแบ็คอัพดาต้าเบสโดย Transaction SQL

                        — DATABASE : กำหนดว่าจะแบ็คอัพแบบ Full Database

                        — database_name| @database_name_var : ชื่อดาต้าเบสที่จะแบ็คอัพ ซึ่งอาจเก็บไว้ในตัวแปรที่เก็บชื่อของดาต้าเบส โดยต้องมีประเภทเป็น next หรือ text

                — backup_device : เป็นชื่อแบ็คอัพดีไวซ์ที่เป็นเทปหรือดิสก์ ซึ่งระบุได้ 2 แบบ คือ แบบ Logical Name กับ Physical Name

                                    ¡ {backup_device_name}  |  {@backup_device_name_var}  :  ระบุ Logical Name ของดีไวซ์นั้นเลย หรือเป็นตัวแปรที่เก็บชื่อดีไวซ์อีกทีหนึ่ง ซึ่ง Logical Name นี้จะได้จากคำสั่ง sp_addumpdevice

                                    ¡ {DISK | TAPE | PIPE} = ‘temp_backup_device’ |

                                          @temp_backup_device_var : ระบุเป็น Physical Name ของดี

                            ไวซ์ จะต้องใส่ประเภทของสื่อกำกับไว้ด้วยว่าเป็น Disk Tape

                            หรือ Pipe เช่น

                                          DISK =’ C:MISSQL7BACKUPDiskBackup1.BAK’

                        — Description : คำอธิบายเกี่ยวกับการแบ็คอัพมีความยาวไม่เกิน 255 ตัวอักษร จะใช้ตอนกู้ข้อมูลเพื่อหยิบสื่อที่แบ็คอัพไว้มาใช้ได้ถูกต้อง

                — Differential : กำหนดให้ทำการแบ็คอัพแบบ Differential

                — Expiredate : กำหนดว่าสื่อที่แบ็คอัพไว้ไม่สามารถบันทึกทับได้ จนกว่าจะเลยวันที่หมดอายุ รูปแบบของวันที่ให้ระบุตามแบบวันที่ดีฟอลต์ของ SQL Server (ส่วนใหญ่จะเป็น mm-dd-yy หรือ mm-dd-yyy) และสามารถใช้ออปชั่น Skip เพื่อไม่ให้เช็ค Expiredate

                        — Retaindays : กำหนดจำนวนวันหลังจากแบ็คอัพแล้วจึงจะบันทึกทับลงในดีไวซ์นี้ได้ ซึ่งเป็นการกำหนดวันหมดอายุเช่นกัน เพียงแต่ระบุเป็นจำนวนวันแทนการระบุวันเดือนปีที่หมดอายุ สามารถใช้ออปชั่น Skip เพื่อไม่ให้เช็ค Retaindays

                — Format | Noformat

                                    ¡ Format : หมายถึง การกำหนดให้ลบส่วนที่เป็นรายละเอียดของดีไวซ์ (Header Information) ออปชั่นนี้จะครอบคลุมทั้งออปชั่น INIT และ SKIP จึงไม่จำเป็นต้องระบุออปชั่นทั้งสองนี้ซ้ำอีก

                        Noformat : จะทำหน้าที่ตรงข้ามกับ Format

                        — INIT | NOINIT

                                    ¡ INIT : หมายถึง ข้อมูลที่แบ็คอัพจะอยู่ในตำแหน่งที่เป็นไฟล์แรกของดีไวซ์และจะไม่ลบส่วนที่ เก็บรายละเอียดส่วนต้นของแบ็คอัพดีไวซ์

                        ¡ NOINIT : คือ ให้บันทึกข้อมุลต่อท้ายข้อมูลที่แบ็คอัพไว้แล้ว

                — MEDIANAME = media_name : คือ ชื่อของดีไวซ์ มีความยาวไม่เกิน 128 ตัวอักษร เมื่อระบุให้มีชื่อดีไวซ์แล้ว ในการแบ็คอัพครั้งถัดไปต้องระบุชื่อดีไวซ์ให้ตรงกันหรือถ้าไม่ต้องการให้ เช็คอีกก็ต้องระบุ Skip

                        — NAME = backup_set_name : บอกชื่อของแบ็คอัพเซ็ท ถ้าไม่ใส่จะมีค่าเป็น Blank

                        — NOSKIP | SKIP : ถ้าระบุ Skip จะไม่ตรวจสอบ Expiredate และ MEDIANAME และถ้าระบุ Noskip ให้ตรวจสอบ Expiredate, MEDIANAME ถ้าไม่ตรงตามเงื่อนไขจะไม่สามารถบันทึกข้อมูลทับได้

                — Nounload | Unload

                        ¡ Nounload : กำหนดให้ม้วนเทปยังคงอยู่ในเทปไดรฟ์เมื่อแบ็คอัพเสร็จแล้ว

                        ¡ Unload : ให้กรอเทปกลับไปยังต้นม้วนและดันม้วนเทปออกมาจากเทปไดรฟ์

 

— STATS[=percentage] : กำหนดให้ส่งข้อความแจ้งเตือนทุก ๆ ครั้งที่แบ็คอัพได้ครบตามจำนวนเปอร์เซ็นต์ที่ระบุ เช่น ส่งข้อความทุกครั้งที่แบ็คอัพได้ครบทุก 10% แต่ถ้าไม่ระบุเปอร์เซ็นต์ จะมีค่าฟอลต์เป็น 10%

 

ตัวอย่าง   ให้แบ็คอัพ  Northwind ลงแบ็คอัพดีไวซ์ชื่อ User Backup มีออปชั่นแบบ INIT และวันหมดอายุ วันที่ 05 เดือน 01 ปี ค.ศ. 2005

      BACKUP DATABASE Northwind to UserBackup

                        WITH INIT, EXPIREDATE = ‘07-05-2000’

สำหรับรูปแบบของคำสั่งที่ใช้แบ็คอัพไฟล์หรือไฟล์กรุ๊ป เป็นดังนี้

 

      ในการแบ็คอัพแบบไฟล์หรือไฟล์กรุ๊ปนี้ ใช้เพื่อแบ็คอัพข้อมูลตามชื่อไฟล์ที่สร้างไว้ในดิสก์ หรือแบ็คอัพโดยระบุชื่อไฟล์กรุ๊ป

 

                                    ¡ FILE = {logical_file_name | @logical_file_name_var} : ชื่อไฟล์ที่ต้องการนำมาแบ็คอัพ

                        ¡ FILEGROUP = [logical_filegroup_name | @logical_filegroup_name_var} : ชื่อของไฟล์กรุ๊ป

 

 

ตัวอย่าง

                BACKUP DATABASE EmpDB

                                    FILE = ‘EmpDB_Data’,

                                    FILEGROUP = ‘EMPGR1’

                                    TO DiskBackup1

 

การแบ็คอัพ Transaction Log โดย Transaction-SQL

        การแบ็คอัพ Transaction Log คือ การแบ็คอัพเฉพาะส่วนของทรานแซคชั่นที่เกิดขึ้นใน Transaction Log  การแบ็คอัพโดยวิธีนี้จะใช้ร่วมกับการแบ็คอัพแบบ Full และ Differential และ สามารถนำไปประยุกต์ใช้กัยการกู้ข้อมูลใกล้จุดที่ดาต้าเบสเสียจริงๆ

  • NO_LOG | TURNCATE_ONLY : เมื่อใช้ออปชั่นนี้ ระบบจะเครียร์ทรานแซคชั่น ที่คอมมิทแล้วแกจาก Transaction Log ทำให้ได้ที่ว่างๆ สำหรับ Transaction Log เพิ่ม บางครั้งมักใช้คำสั่งนี้เพื่อเคลียร์ Transaction Log ที่เต็ม ทั้ง NO_LOG และ TRUNCATE_ONLY จะทำงานเหมือนกัน เว้นแต่ NO_LOG จะใช้เมื่อ Transaction Log เต็มจริงๆ และใช้ออปชั่น TRUNCATE_ONLY ไม่ได้ ก่อนใช้ออปชั่นนี้ควรแน่ใจว่า จะไม่พบเหตุที่ต้องกู้ดาต้าเบสอย่างกระทันหัน ทางที่ดีควรแบ็คอัพแบบ full เสียก่อน
  • NO_TRUNCATE : การแบ็คอัพ Transaction Log โดยไม่เคลียร์ทรานแซคชั่น เดิมออก เมื่อเลือกใช้ออปชั่นนี้แล้ว ถ้าดาต้าเบสถูกเสียหายกระทันหัน สามารถนำ Transaction Log มากู้ดาต้าเบส

ส่วนออปชั่นอื่นๆมีความหมายเดียวกันกับคำสั่ง Backup Database

ตัวอย่าง สร้างแบ็คอัพดีไวซ์ชื่อ Disk Backup 2 และแบ็คอัพเฉพาะ Transaction Log ของ First DB ลงลงแบ็คอัพดีไวซ์นั้น

        USE master

            EXEC sp_addumpdevice ‘disk’,’DiskBackup2’,

                        ‘c:mssql7ackupDiskBackup2.bak’

            BACKUP LOG FirstDB TO DiskBackup 2 WITH INIT

ตัวอย่าง เคลียร์ Transaction Log ของดาต้าเบส First DB โดยไม่ได้แบ็คอัพ Transaction Log

 

 

การดูรายการที่แบ็คอัพในแบ็คอัพดีไวซ์โดยใช้ Enterprise Manager

            เมื่อทำการแบ็คอัพดาต้าแล้ว สิ่งที่ควรตรวจสอบ คือ แบ็คอัพดีไวซ์มีข้อมูลที่แบ็คอัพครบถ้วนและถูกต้องหรือไม่ เช่น ต้องการดูรายละเอียดการแบ็คอัพของดีไวซ์ Disk Backup 1 ให้ทำขั้นตอนดังนี้

  1. เปิด Enterprise Manager แล้วเข้าสู่ Server ที่ต้องการ
  2. ในกรอบด้านซ้ายให้คลิกเมาส์ที่เครื่องหมาย + ที่ Management จะโชว์ชื่อ Backupในกรอบด้านขวา
  3. ให้คลิกเมาส์ปุ่มขวา Backup ที่เราต้องการ แล้วเลือก Properties
  4. ที่หน้าจอของ Backup Device Properties คลิกปุ่ม View Contents

 

 

 

  1. ที่หน้าจอ View Backup Media Contents เป็นส่วนที่แสดงรายการสิ่งต่างๆ ที่แบ็คอัพไว้จากรูปอธิบายได้ว่าขณะนี้ Backup_1 เป็นแบ็คอัพดีไวซ์ที่เก็บข้อมูลของดาต้าเบส Northwind ตัวเดียวเท่านั้น คลิกปุ่ม Close เพื่อเลิกดู

 

 

 

6. เครื่องจะ กลับไปที่หน้าจอของ Backup Device Properties-Disk Back 1

 

การแบ็คอัพหลายๆดาต้าเบสไว้ในแบ็คอัพดีไวซ์เดียวกันโดยใช้ Enterprise Manager

ต่อไปนี้จะเสนอวิธีการแบ็คอัพดาต้าเบสต่างๆลงบนแบ็คอัพดีไวซ์ชื่อ Disk Backup 1 โดยการแบ็คอัพดาต้าเบสแรกจะแบ็คอัพทับข้อมูลเก่าที่มีอยู่ใน Backup_1 (จากการแบ็คอัพก่อนหน้านี้) ส่วนตั้งแต่ดาต้าเบสที่สอง สาม... เป็นต้นไป จะแบ็คอัพต่อท้ายดาต้าเบสแรก ซึ่งจะใช้ออปชั่น INIT หรือ Format ไม่ได้

 

            ในตัวอย่างถัดไปจะแสดงการแบ็คอัพหลายๆดาต้าเบส คือ Master,Model,MSDB และ User Database ในที่นี้คือ OrganDB

 

ขั้นที่ 1 แบ็คอัพ Master

  1. เปิด Enterprise Manager แล้วเข้าสู่ Server ที่ต้องการ
  2. ในกรอบด้านซ้ายให้คลิกเมาส์ที่เครื่องหมาย + ที่Database จะโชว์ชื่อดาต้าเบส
  3. ให้คลิกขวาดาต้าเบส Master แล้วคลิก All Tasks>Backup Database
  4. จะปรากฏหน้าจอ SQL Server Backup – Master ให้คลิกที่เช็คบ็อกซ์ Database Complete และ Overwrite Exiting Media จากนั้นคลิก Add

 

 

 

 

 

 

 

 

 

  1. จากนั้นหน้าจอแสดง Choose Backup Destination ให้คลิกที่เช็คบ็อกซ์ Backup Device แล้วคลิกที่ลูกศรชี้ลงเพื่อเลือกดีไวซ์ชื่อ Back_1 จากนั้นคลิก OK

 

 

  1. เครื่องจะกลับไปแสดงหน้าจอ SQL Server Backup – Master พร้อมกับแสดงชื่อ Backup_1 ในกรอบของ Destination คลิกปุ่ม OK

 

 

 

  1. ระบบจะเริ่มการแบ็คอัพ จนกระทั่งแสดงข้อความ “The Backup Operation has been Completed Successfully”

 

 

ขั้นที่ 2 การแบ็คอัพดาต้าเบสที่เหลือ คือ Model,MSDB และ OrganDB

            ให้ดำเนินการเช่นเดียวกับขั้นตอน 1 การแบ็คอัพ Master ตั้งแต่ข้อ1 ถึงข้อ5 โดยที่

        ในขั้นตอนย่อยที่1 ให้เปลี่ยนจาก Master เป็น Model,MSDB และ OrganDB ตามลำดับ

        ในขั้นตอนย่อยที่2 ให้คลิกที่เช็คบ็อกซ์ Append to Media ดังตัวอย่างในรูป

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

แบ็คอัพ Msdb

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

เมื่อแบ็คอัพเรียบร้อยให้ดูรายละเอียดภายในดีไวซ์ Backup_1 คลิกขวาเลือก Properties จะปรากฏหน้าจอ Backup Media Contents และจะต้องมีดาต้าเบสที่แบ็คอัพทั้งหมดอยู่ 4 รายการ คือ Master,Model,MSDB และ OrganDB ตามลำดับ

 

การแบ็คอัพโดยใช้แบทช์ไฟล์

        การแบ็คอัพโดยใช้แบทซ์ไฟล์จะทำให้ผู้ใช้งานมีความสะดวกมากขึ้น คือ สร้างชุดคำสั่งที่จะแบ็คอัพดาต้าเบสไว้ ซึ่งในชุดคำสั่งหนึ่งๆ จะมีคำสั่งในการแบ็คอัพดาต้าเบสมากกว่าหนึ่งตัวได้และนอกจากนี้ยังสามารถ เลือกเวลาที่จะแบ็คอัพตามสะดวกได้อีก

        ตัวอย่าง  สร้างแบทช์ไฟล์สำหรับการแบ็คอัพ โดยให้แบ็คอัพลงเทปไดรฟ์ และให้เรียกผ่านยูทิลิตี้ OSQL ทำได้ดังนี้

  1. สร้างแบทช์ไฟล์โดยอาจใช้โปรแกรม Notepad ก็ได้ ป้อนคำสั่งต่อไปนี้แล้วเก็บไว้เป็นไฟล์ที่มีนามสกุลเป็น .BAT เช่น C:SQLBac.bat

OSQL /U sa/P /S DBSQLSVR /i c:SQLDump.qry /o c:SQLDump.lst

                        จากคำสั่งมีความหมายว่า เรียกยูทิลิตี้ OSQL โดยใชยูสเซอร์ชื่อ sa บนเครื่องเซิร์ฟเวอร์ชื่อ DBSQLSVR มีอินพุตไฟล์ที่เป็นคำสั่งชื่อ C:SQLDump.qry และให้เก็บเอาท์พุตที่ไฟล์ C:SQLDump.lst

  1. สร้างไฟล์ชื่อ SQLDump.qry โดยใช้โปรแกรม Notepad และมีคำสั่งในกรรแบ็คอัพดังกรอบข้างล่างนี้ การใช้ออปชั่น INIT ที่ชุดแรกของการแบ็คอัพนี้เพื่อทำการเคลียร์ดีไวซ์ (Initial Device) หรือบันทึกข้อมูลทับข้อมูลเก่าบนดีไวซ์ (Overwrite Exiting Media) นั่นเอง และคำสั่งต่างๆ นั้นจะทำการแบ็คอัพดาต้าเบส 4ตัว คือ Master, Model, MSDB และ First DB ตามลำดับ และเมื่อแบ็คอัพเสร็จแล้ว ให้กรอเทปกลับ และดันเทฟออกมาจากเทปไดร์ฟด้วย

backup database master to TapeDump

WITH nounload, stats= 10, init ,skip

                                    backup database model to TapeDump

                                                WITH nounload, stats= 10, noinit ,skip

                                    backup database msdb to TapeDump

WITH nounload, stats= 10, init ,skip

                                    backup database FirstDB to TapeDump

                                                WITH unload, stats= 10, noinit ,skip

  1. สร้างดีไวซ์ที่เป็นเทปชื่อ Tape Dump

sp_addumpdevice ‘tape’,’TapeDump’,’\. ape()’

  1. เรียก C:SQLBck.bat ให้ทำงาน โดยไปที่ MS-DOS Prompt ของเครื่องเซิร์ฟเวอร์ป้อนคำสั่ง SQLBck.bat แล้วกด Enter โดยต้องเตรียมเทปใส่ไว้ในเทปเทปไดร์ฟที่เครื่องเซิร์ฟเวอร์ก่นเรียกคำสั่ง ด้วย

 

การกู้ข้อมูล (Recoery)

            ในขณะที่ใช้ดาต้าเบสนั้นอาจมีเหตุต่างๆที่ไม่คาดคิดเกิดขึ้น แล้วก่อให้เกิดผลต่อข้อมูลที่เก็บไว้ เช่น ข้อมูลที่ได้ไม่สดคล้องกัน แต่ข้อมูลไม่เสียหาย หรือในบางครั้งฮาร์ดดิสก์เกิดพัง แล้วดาต้าเบสเสียหายไปด้วย ผู้ดูแลฐานข้อมูล (DBA) จำเป็นต้องกู้ข้อมูลให้กลับมาอยู่ในสภาพที่ถูกต้องและนำข้อมูลเท่าที่ได้ แบ็คอัพไว้กลับมารีสโตร์ ยิ่งแบ็คอัพมากเท่าใด ก็จะได้ข้อมูลที่ใกล้เคียงมากขึ้นเท่านั้น

        ในระบบ SQL Server มีการกู้ข้อมูลอยู่ 2 แบบ คือ Automatic Recovery และ Manual Recovery

  • Automatic Recovery วิธีนี้ SQL Server จะทำเอง หลังจากที่ SQL Server หยุดการทำงานกลางคัน จากเหตุไฟดับ กดปุ่มรีเซ็ทเครื่องโดยไม่ตั้งใจ หรือจากแอพริเคชั่นที่ทำให้ SQL Server ไม่ได้ถูก Shutdown ตามปกติ (Abnormal Shutdown) เมื่อ SQL Server ถูกรีสตาร์ทขึ้นมาใหม่ ก็จะพยายามกู้ข้อมูลเอง โดยจะเริ่มกู้ข้อมูลในดาต้าเบส Master, Model, MSDB และ User Database โดยการเช็คคำสั่งใน Transaction Log ว่ามีทรานแซคชั่นใดที่เกิดหลังจากจุด Check Point ถ้าทรานแซคชั่นใดมีการคอมมิทก็ต้องส่งเข้าไปทำใหม่ (Roll Forward) แต่ถ้าทรานแซคชั่นใดไม่ได้คอมมิทก็จะถูกยกเลิกไป (Roll Back)
  • Manual Recovery คือ การกู้ดาต้าเบสโดยผู้ใช้เอง อาจใช้คำสั่งของ Transaction-SQL หรือทำโดย Enterprise Manager การกู้ดาต้าเบสแบบนี้ ผูใช้ต้องมีการแบ็คอัพข้อมูลไว้ก่อนที่จะเกิดปัญหากับดาต้าเบส และเมื่อต้องการกู้ดาต้าเบสคืนสู่สภาวะเดิมก็นำชุดที่แบ็คอัพไว้มารีสโตร์ โดยมีขั้นตอนคล่าวๆ ในการรีสโตร์เมื่อระบบมีปัญหา คือ

-          แบ็คอัพ Transaction Log

-          จากนั้นรีสโตร์ดาต้าเบสจากแบ็คอัพชุดล่าสุด (จากชุด Full Backup และตามด้วยชุด Differential ถ้ามี)

-          รีสโตร์แบ็คอัพของ Transaction Log ถ้ามีการแบ็คอัพไว้หลายครั้ง ให้รีสโตร์จากชุดแรกสุดก่อนตามด้วยแบ็คอัพชุดอื่นๆ เรียงตามลำดับ

-          แล้วป้อนข้อมูลหรือรายการที่ไม่ถูกคอมมิทลงไปใหม่

หลังจากที่ทำขั้นตอนเหล่านี้ด้วยความราบรื่นแล้ว ก็จะได้ดาต้าเบสคืนกลับมาในสภาพเดิมจนถึงจุดก่อนที่ดาต้าเบสจะเสียหาย

 

หมายเหตุ  สำหรับดาต้าเบส Model และ MSDB นอกจากจะต้องรีสโตร์ใหม่เฉพาะในกรณีที่ เครื่องหรือดาต้าเบสเสียหายแล้ว ควรจะรีสโตร์เมื่อมีการสร้างดาต้าเบส Master ใหม่โดยใช้คำสั่ง Rebuild Master เพราะคำสั่งนี้จะลบและสร้างดาต้าเบส Model และ MSDB ขึ้นมาใหม่

 

หลักการกู้ข้อมูล

ถ้าพบว่าดาต้าเบส หรือดิสก์เสียหาย มีข้อควรพิจารณาในการดำเนินการดังต่อไปนี้

  1. ถ้าดาต้าเบสเสีย อาจจะลบดาต้าเบสตัวเดิมออกและสร้างใหม่ จากนั้นนำชุดแบ็คอัพไปรีสโตร์ได้เลย (คำว่า Suspect ยู่หลังดาต้าเบสใด มีความหมายว่า ดาต้าเบสนั้นเสียหาย ไม่สามารถใช้งานได้) การรีสโตร์ดาต้าเบสนั้นยังสามารถนำไปใช้ประยุกต์สำหรับการย้ายดาต้าเบสไปลง ที่ SQL Server ตัวอื่นได้ด้วย โดยการสร้างดาต้าเบสที่เครื่องเซิร์ฟเวอร์ตัวนั้นแล้วรีสโตร์ข้อมูล
  2. ถ้าต้องการเปลี่ยนาร์ดดิสก์ใหม่ หลังจากเปลี่ยนฮาร์ดดิสก์แล้วก็ให้รีสโตร์ข้อมูล
  3. แบ็คอัพ Transaction Log ในระบบ ขึ้นทันทีที่ระบบเสียหายและยังสามารถอ่านและแบ็คอัพ Transaction Log ขึ้นมาได้ โดยใช้คำสั่ง Backup Log
  4. ถ้าข้อมูลเสียหาย เนื่องจากการลบข้อมูลผิด หรือลบเทเบิลผิด เป็นต้น สามารถนำชุดแบ็คอัพที่มีอยู่มารีสโตร์ได้เหมือนกัน ดังนั้นข้อมูลที่แบ็คอัพไว้มิใช่เป็นเพียงเพื่อการกู้ข้อมูลเมื่อดาต้าเบส เสียหายทางกายภาพเท่านั้น

 

เทคนิคการกู้ดาต้าเบส

ให้พิจารณาตารางเวลาการแบ็คอัพ และชนิดของแบ็คอัพในช่วงเวลาต่างๆกันเริ่มต้นจากการสร้างดาต้าเบสหลังจาก นั้นกำหนดตารางการแบ็คอัพดาต้าเบสและ Trnsaction Log ดังนี้

  1. ศุกร์  17.00 น                  Backup Database: INVDB
  2. จันทร์ 10.00 น                Backup Transaction Log
  3. จันทร์ 17.00 น                Backup Transaction Log
  4. อังคาร 10.00 น               Backup Transaction Log
  5. อังคาร 16.50 น               Backup Transaction Log
  6. อังคาร 17.00 น               Backup Database

 

สมมติถ้าระบบ  SQL  Server มีปัญหาเมื่อวันจันทร์ เวลา 16.00 น.และดาต้าเบส  INVDB เสียหายไม่สามารถทำงานต่อได้ แต่จากข้อมูลที่แบ็คอัพไว้มีข้อมูลของการแบ็คอัพทั้งดาต้าเบสเฉพาะวันศุกร์ 17.00 น.และ Transaction Log วันจันทร์ 16.00 น. เท่านั้น ดังนั้นหลังจาก 10.00 น. จะไม่มีข้อมูลที่แบ็คอัพไว้เลย

                          การแก้ปัญหา ปกติถ้าตอนสร้างดาต้าเบสและ Transaction Log ออกจากกันรวมทั้งมีการระบุตำแหน่งของไฟล์เป็นไดรฟ์กันด้วย โอกาสที่จะกู้ข้อมูลคืนมาทั้งหมดจนถึงเวลา 16.00 น. เป็นวิธีการที่ไม่ยากเลยเพราะถ้าส่วนของดาต้าเบสเสียอย่างเดียวจะแบ็คอัพ เป็นส่วน Transaction Log ทันที แล้วก็จะกู้ข้อมูลมาจนถึงจุดที่เครื่องมีปัญหาได้ทั้งนี้ต้องมีชุดแบ็ตอัพ ตั้งแต่วันศุกร์ 17.00 น. และจันทร์  10.00 น. ด้วยแต่ถ้าเสียในส่วน Transaction Log ก็ต้องทำใจเพราะผู้ใช้ระบบต้องเริ่มต้นทำรายการของทรานแซคชั่นกันใหม่ ตั้งแต่หลัง 10.00 น. จนถึง 16.00 น. เพราะไม่สามารถกู้ทรานแซคชั่นได้

 

การกู้ภัยยูสเซอร์ดาต้าเบส

               ในขั้นตอนนี้ขอสมมติว่า Northwind   มีความเสียหาย เช่น Suspect ซึ่งเราจะเห็นได้ที่จอ Enterprise Manager  จะมีข้อความว่า “ Suspect” ปรากฎอยู่ที่ชื่อดาต้าเบสตัวนั้น อาการนี้เกิดจากไฟล์ของดาต้าเบสที่อยู่ในดิสก์เสีย (คงจำได้ว่าเมื่อมีการสร้างดาต้าเบสของ SQL Server จะมีการสร้างไฟล์บนดิสก์เพื่อเก็บข้อมูล คือ *.mdf และส่วนที่เป็น Log คือ ,.ldf *หรือ .ndf )   ดังนั้นเมื่อดาต้าเบส First DB Suspect จะไม่สามารถเปิดใช้งานได้อีก ต้องทำการกู้ดาต้าเบสก่อนโดยมีขั้นตอนดังต่อไปนี้

วิธีการสร้างสถานการณ์ให้ข้อมูลหรือ Northwind เสีย

1.ให้ปิดเซอร์วิสของ MSSQL Server

2.ไปที่MSSQL7DATA เปลี่ยนชื่อไฟล์เก็บข้อมูลของ Northwind  คือ Northwnd.mdf ให้เป็นชื่ออื่น (Northwnd.mdfold)

3.สตาร์ทเซอร์วิสของ MSSQL Server

4.ที่ Enterprise Manager เปิดโฟลเดอร์ Dataabase ครั้งแรกที่เห็น  คือ  Northwind  ยังปกติอยู่ให้คลิกเมาส์ปุ่มขวาที่ดาต้าเบส Northwind แล้วคลิก Refresh เราจะเห็นว่ามีข้อความว่า Suspect อยู่ข้างชื่อดาต้าเบสหรือพยายามเปิดโฟลเดอร์ Northwind จะเปิดไม่ได้ และมีข้อความเตือนว่าดาต้าเบสมีปัญหา

 

หมายเหตุ    ถ้าจะแก้ไข Northwind ให้กลับสู่สภาพเดิม ขอให้ปิดเซอร์วิสของMSSQL  Server แล้วแก้ไขชื่อไฟล์ first.mdfoldใน MSSQL7DATA ให้เป็น first.mdf

 

การRestoreโดย Transaction-SQL





RESTORE DATABASE {database_name| @ database_name_var}

[FROM

            [WITH

            [DBO_ONLY]

            [[,] FILE  = file_number]

            [[,] MEDIANAME = {media_name |@ media_name_variable}]

            [[,] [MOVE ‘logical_file_name’ TO ‘operating_system_file_name’]

            [,….n]

            [[,] { NORECOVERY  |  RECOVERY | STANDBY = undo_file_name}]






           [[,] {NOUNLOAD | UNLOAD}]

           [[,] REPLACE

           [[,] STATS [= perccntage]]

 

 






RESTORE DATABASE {database_name | @database_name_var}

[ FROM [,……n]]

            [WITH

            [DBO_ONLY]

            [[,]  FILE = fole_number]

            [[,] MEDIANAME = { media_name |  @  media _name_variable}]

            [[,] { NORECOVERY ]

            [[,] { NOUNLOAD  |  UNLOAD}]

            [[,]  REPLACE]

            [[,]  STATS [ = percentage]]


คำถามท้ายบท ::

แบบฝึกหัด บทที่ 6

ตอนที่ 1

1. จากรูป อธิบาย

T(c) T(f) Time

T
R
A
N
S
A
C
T
I
O
N
Check Point System Failure

 

ตอบ - System Failure เกิดขึ้นที่ T(f) และ Check Point ต้งล่าสุดที่เกิดจึ้นก่อน T(f) คือ เมื่อ T(c)

- Transaction T1 เสร็จสิ้นก่อนเวลา T(c)

- Transaction T2 เสร็จสินก่อนเวลา T(c) และเสร็จสิ้นหลังเวลา T(c) แต่ก่อนเวลา T(f)

- Transaction T3 เกิดก่อนเวลา T(c) แต่ไม่เสร็จสิ้นหลังเวลา T(c)

- Transaction T4 เกิดหลังเวลา T(c) และเสร็จสิ้นหลังเวลา T(c)

- Transaction T2 เกิดหลังเวลา T(c) แต่ไม่เสร็จสิ้นหลังเวลา T(c) และหลังจากสตาร์ทเซอร์วิส MSSQL Server ใหม่ได้

แล้วระบบจะทำการกู้ข้อมูลและตรวจสอบทรานแซคชันต่างๆจาก Transaction Log ซึ่งพบว่า

- T3 และ T5 จะต้องยกเลิก (Roll Back) เนื่องจากไม่มีการคอมมิซทรานแซคชันก่อนที่ระบบเสียหาย คือ ใน Transaction

Log ไม่พบคำสั่ง Commit Transaction นั่นเอง

- T2 และ T4 ทรานแซคชันทั้งสองตัวนี้ SQL Server จะอ่านจาก Transaction Log และส่งเข้าไปทำงานใหม่ (Roll Forword)

ทั้งนี้เพราะว่ามีการคอมมิททรานแซคชันหลังจุด Check point แต่เกิดก่อนเวลาที่เครื่องจะเสียหายซึ่งหมายความว่า ข้อมูลที่ทำ

งาน ข้อมูลที่ทำงานตามคำสั่งยังไม่ได้บันทึกลงในตาราง Database เท่านั้น

- มีข้อสังเกตว่า T1 ไม่ต้องเข้ามาในขบวนการยกเลิก หรือทำงานใหม่ทั้งนี้เนื่องจาก T1 ได้ทำงานเสร็จสิ้นก่อนจุด Check

Point นั้นระบบได้ทำการบันทึกข้อมูลของการเปลี่ยนแปลงลงดาต้าเบสเรียบร้อยแล้ว