วันศุกร์ที่ 2 พฤศจิกายน พ.ศ. 2555

ขั้นตอนการ Backup Database SQL 2008

1.ไปที่ Start / Program / Microsoft SQL Server 2008 / SQL Server Management
2.Connect to Server ด้วย Server ที่ใช้งาน
3.คลิก ขวา เลือก Base ที่ต้องการ Backup จากตัวอย่าง base ชื่อ dbwins_demo ไปที่ Tasks / Backup
4.หน้าต่าง Back Up Database เลือก Add หากมีข้อมูลค้างที่ช่อง Back Up to ให้เลือก path เก่าแล้วกดที่ Remove ทิ้งก่อน แล้วค่อยกดที่ Add
5.หน้าต่าง Select Backup Destination ช่อง file name เลือก Brow
6.Locate Database เลือกไดร์ ที่จัดเก็บ backup จากภาพเลือก D / ช่อง file name กำหนดชื่อ base ที่ต้องการ backup ตามตัวอย่างภาพ แล้วกด OK
7.เลือก OK
8.หน้าต่างสุดท้ายเลือก OK รอ Progress แสดงผล 100 เปอร์เซ็นต์ backup สำเร็จ

การแบ็คอัพ SQL Database

            ถึงแม้ว่าระบบจัดการฐานข้อมูลของ SQL Server จะมีการทำ Automatic Recovery เมื่อข้อมูลเกิดความเสียหายแล้วก็ตาม ผู้ใช้งานระบบควรต้องมีการแบ็คอัพข้อมูลไว้ด้วยเพื่อความปลอดภัยให้มากยิ่งขึ้น เพราะถ้าการทำ Automatic Recovery ของ SQL Server ไม่สำเร็จ ก็อาจต้องใช้ข้อมูลชุดแบ็คอัพแทน การแบ็คอัพข้อมูลจะสามารถแบ็คอัพดาต้าเบสตั้งแต่ Master,MSDB,Mode,Distribution Database รวมทั้งดาต้าเบสที่ผู้ใช้สร้างขึ้นด้วย การเลือกประเภทของการแบ็คอัพยังขึ้นกับปริมาณข้อมูลด้วย
  1. Full Backup คือ การแบ็คอัพข้อมูลทั้งหมดของดาต้าเบส และบางส่วนใน Transation Log ที่เกิดขึ้นขณะทำการแบ็คอัพ ซึ่งสามารถแบ็คอัพขณะที่ดาต้าเบสกำลังถูกใช้งานอยู่ โดยเมื่อเริ่มทำการแบ็คอัพ SQL Server จะเพิ่มรายการแบ็คอัพนี้ไว้ใน Transation Log เพื่อให้รู้ว่าจุดเริ่มต้นอยู่ที่ใด เมื่อแบ็คอัพส่วนที่เป็นดาต้าเบสเสร็จ ก็จะแบ็คอัพ Transation Log ที่เกิดขึ้น  Full Backup เป็นวิธีการแบ็คอัพที่สะดวก และสามารถนำไปใช้ในการทำแบ็คอัพล่าสุดเท่านั้น การแบ็คอัพวีธีนี้เหมาะสำหรับ Master,MSDB,Model และยูสเซอร์ดาต้าเบสที่ข้อมูลไม่มากนักและใช้เวลาการแบ็คอัพไม่นาน โดยทั่วไปถ้าดาต้าเบสมีขนาดใหญ่มากและอัพเดทบ่อยๆจะใช้ร่วมกับการแบ็คอัพแบบอื่นๆคือ Differential และTransaction Log ทำให้ไม่เสียเวลามากไป และยังได้ข้อมูลที่ใกล้เคียงกับความเป็นจริงมากที่สุด
  2. Differential คือ การแบ็คอัพเฉพาะส่วนที่เป็นข้อมูลที่มีการเปลี่ยนแปลง ดังนั้นถ้ามีการแบ็คอัพแบบ Differrntial ทุกคืน ข้อมูลที่แบ็คอัพในคืนวันพุธจะมีข้อมูลที่มีการเปลี่ยนแปลงของทั้งวันจันทร์และอังคารด้วย เวลาที่จะกู้ข้อมูลก็เพียงแต่นำชุด Full Backup ลงก่อน จากนั้นจึงค่อยนำ Differential Backup ครั้งล่าสุดลงถัดไป
  3. Transaction Log คือการแบ็คอัพเฉพาะส่วนที่เป็น 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 ไป

    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 ควรทำเมื่อสร้างดาต้าเบส เพิ่ม ลบ หรือ เปลี่ยนแปลงโครงสร้างของเทเบิล ข้อมูล รวมทั้งการสร้างอินเด็กซ์

  ตัวอย่างการแบ็คอัพ User Database
      - Full Backup เดือนละครั้ง
      - Differential ทุกอาทิตย์
      - Transction Log ทุกคืน

อ้างอิง http://itd.htc.ac.th/st_it50/it5012/P_2/Implement%20of%20Database/images/B6.htm

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


      Transaction Log (.ldf) คือ log file ที่จะบันทึกคำสั่งของการทำงานรวมถึงการเปลี่ยนแปลงที่เกิดขึ้นกับ database ตั้งแต่ Insert, Update และ Delete และเมื่อถึง Check point ก็จะบันทึกลงใน Database โดย Transition Log จะแยกเก็บเป็น Files ซึ่งเมื่อเขียนจนถึงตำแหน่งสุดท้ายของไฟล์แล้ววนกลับไปที่จุดเริ่มต้นของพื้นที่ว่าง แต่ถ้าไม่มีที่ว่าง Log file ก็จะขยายใหญ่ขึ้นเรื่อยๆ

      Checkpoint จะถูกสร้างโดยอัตโนมัติเมื่อ Transaction log ถูกเขียน record ไปเรื่อยๆ ระยะเวลาหนึ่ง หรือ stop/start sql server instant, backup, alter database

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

ตัวอย่าง






















จากรูปอธิบายได้ดังนี้
1. System Failure เกิดขึ้นที่ T(f) และ Check Point ล่าสุดเมื่อเวลา T(c)
2. Transaction T1 เสร็จสิ้นก่อนเวลาT(c)
3. Transaction T2 เกิดก่อนเวลา T(c) และเสร็จสิ้นหลังเวลา T(c)
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)
  2. T2 และ T4 จะต้องเข้าไปทำงานใหม่ (Roll Forward) เพราะข้อมูลที่ทำงานตามคำสั่งใน T2,T4 ยังไม่ได้บันทึกลงในดาต้าเบสเท่านั้น
  3. T1ไม่ต้อง Roll Back หรือ Roll Forward เพราะระบบได้ทำการบันทึกข้อมูลของการเปลี่ยนแปลงลงดาต้าเบสเรียบร้อยแล้ว

วันพฤหัสบดีที่ 1 พฤศจิกายน พ.ศ. 2555

ปัญหาขนาด database log file .ldf โตไม่หยุด MSSQL server

file .ldf เป็นไฟล์ที่แยกเก็บบันทึก transaction ของไฟล์ฐานข้อมูล (.mdf file) และจำเป็นต้องใช้งานคู่กัน ถ้าหาก transaction log ไม่สมบูรณ์หรือเราจัดการผิดวิธี sql server จะเรียกใช้งาน database ก้อนนั้นไม่ได้เลย

สาเหตุที่ไฟล์ .LDF ขนาดใหญ่ขึ้นไม่หยุด

ปกติค่า default ของฐานข้อมูลใน SQL server จะอยู่ใน full recovery mode แปลว่าถ้าเราไม่ทำอะไรซักอย่างกับ database ก้อนนี้ ขนาดของไฟล์ .ldf ก็จะโตขึ้นเรื่อยๆ ทุกวันจนฮาร์ดดิสเต็มในที่สุด

ในการติดตั้ง SQL Server ไม่ได้มี options นี้ให้เราเลือก admin หลายคนกด next >> ไปไม่โดยไม่สนใจบางทีก็คิดไปเองว่า การติดตั้ง database ลงในเซอฟเวอร์เป็นหน้าที่ของผู้พ้ฒนาโปรแกรมน่าจะรู้เรื่องมั้ง (พลาดแล้ว..)

วิธีแก้ปัญหาขนาดไฟล์ .LDF


1. ตั้งค่า recovery model ของ database เป็น simple เพื่อให้ database หยุดขยายขนาด log แบบไม่มี limit
  • ใช้ SQL Server Management Studio login เข้าไปจัดการเซอฟเวอร์ฐานข้อมูล
  • ใน Object Explorer browse ไปที่ไฟล์ database ที่ต้องการ Right click > Properties > Options เลือก Rocovery model : Simple





2. ลดขนาดของ log file (.ldf) ที่เกินจำเป็น

Options A: Shink database

  1. เลือกคลิ้กขวาที่ database > Tasks > Shrink > Files
  2. File type: Log
  3. Shrink action : Release unused space
  4. กด OK

Option B: detach/attach สร้าง .ldf log file ใหม่ *ควรจะทำ full backup ไว้ก่อน
เลือกคลิ้กขวาที่ database > Tasks > Detach...
  1. ถ้ามีการใช้งาน database นี้อยู่จะมี Active connections ให้ปิดโปรแกรมที่ใช้งานก่อนติ๊กถูกที่ drop connections กด OK
  2. ลบ หรือ เปลี่ยนชื่อ ไฟล์ ldf เป็นชื่ออื่น
  3. เลือก Tasks > Attach ไฟล์ .mdf เข้าไปใหม่

Recovery model ใน SQL server database


  1. Simple recovery model : เมื่อถึงจุด Checkpoint ระบบจะเคลียร์พื้นทีจาก Record แรกสุด - MinLSN เป็นที่ว่างเขียนทับได้
  2. Full recovery model : records ทั้งหมดจะห้ามเขียนทับจนกว่าเราจะทำ transaction log backup (Manual)
  3. Bulk-logged recovery model : จะสร้าง Checkpoint ทุกครั้งที่เรา backup log หรือทำ bulk-copy


สรุปว่า นอกจาก Simple Recovery model แล้วจะต้องมี admin คอยทำหน้าที่จัดการ backup log file และ Shrink database เป็นประจำนั่นเอง

แต่ Size ของ *.mdf และ *.ldf จะเปลี่ยนแปลงหรือ date modified ก็ต่อเมื่อ SQL close file หรือขยาย size ของ Database หรือ restart service

อ้างอิง : http://msdn.microsoft.com/en-us/library/ms189573.aspx
              http://aifarfa.blogspot.co.uk/2012/02/database-log-file-ldf-mssqlserver.html