วันพฤหัสบดีที่ 18 มีนาคม พ.ศ. 2553

การ backup sql server ผ่าน network

ตามหัว ข้ออ่ะครับ เคยมีคน post ถามเอาไว้ แล้วตอนนั้น ผม ก็คิดว่ามันไม่ได้ แต่วันนี้บังเอิญไปเจอวิธีเข้าอ่ะครับ แล้วมันก็ใช้ได้ด้วย ก็เลยเอาสรุปมาทิ้งไว้เผื่อมีใครนำไปใช้ได้น่ะครับ Cool

สาเหตุที่ MSSQL ไม่สามารถ backup ผ่าน network shared folder เป็นเพราะเรื่อง สิทธิครับ

นำเรื่องเล็กน้อย
=============
เรื่อง มันยาวนิดนึง คือ MSSQL service เนี่ย มันจะมีการให้เราระบุได้ว่า จะให้มัน start หรือ run ด้วย account หรือ user อะไร ซึ่ง user ที่ใช้ในการ start หรือ run MSSQL นั้น ไม่จำเป็น ที่จะต้องเป็น user เดียวกันกับ user ที่ logon windows อยู่

ทีนี้ service ของ MSSQL โดย default แล้วจะ run โดยใช้ SYSTEM ซึ่งเจ้า SYSTEM มันจะไม่มีสิทธิในการเข้าถึง share resouce บน network (เค้าว่ามาแบบนี้ มันคงเป็น user หรือ account อีกแบบน่ะแหละ ใครแม่น ๆ ช่วยบรรยายเพิ่มหน่อยละกัน :Smiley)

ปัญหามันก็เลยเกิด เพราะ MSSQL จะทำงานภายใต้ชื่อของ SYSTEM

ที นี้ไอ้การ Backup น่ะ มันจะเป็นลักษณะว่า MSSQL service เป็นผู้ทำงาน (งาน คือ save file) เอง ไม่เกี่ยวกับ user ที่ logon windows อยู่ ณ ขณะนั้น มันจึงทำให้ MSSQL service ที่ run ภายใต้ชือของ SYSTEM นี้ไม่สามารถใช้งาน หรือ save file ไปที่ network drive หรือ folder ที่ share ไว้ได้ (เพราะว่า SYSTEM ไม่มีสิทธิ) แม้ว่า ขณะนั้น คนที่ logon windows อยู่จะใช้งาน network drive หรือ shared folder ไว้ก็ตาม เพราะว่า มันไม่เกี่ยวข้องกัน (งงมั้ยเนี่ย)

ส่วนวิธีการตรวจว่า MSSQL Service นั้น start/ run ด้วย user อะไรนั้น สามารถดูได้จากใน Control Panel --> Admin Tools --> MSSQL --> Properties --> Log on

การแก้ไข ก็คือ ก็ทำให้ MSSQL มันมีสิทธิ ดิ...

แล้วก็ถึงคราววิธีแก้ไข
================
1. แก้ user ที่ start MSSQL ให้เป็น user อื่นที่มีสิทธิในการใช้งาน shared folder นั้น ๆ

หรือ
2. แก้ไข Registry ของเครื่องที่ได้ทำการ share เอาไว้ โดยให้เพิ่มชื่อที่ทำการ share เอาไว้ที่

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmamServer\Parameters\NullSessionShares

จากนั้น ทำการ stop server service แล้ว start ใหม่ เป็นอันเสร็จ
(ไป restart ใน services ก็ได้ หรือ จะใช้คำสั่ง net stop server แล้วค่อย สั่ง net start server ใหม่ หรือ จะ reboot เลยได้)

ซึ่งข้อ 2 นี้จะเป็นการเอา security ทั้งหมดออกจาก folder ที่ share เอาไว้


กลับมา backup ที่ MSSQL
===================
ทีนี้การ backup จะต้อง อ้างอิง โดยใช้ UNC เช่น

backup database pubs to disk='\\server01\myshare\pubsbackup.bak'


ผลการทดสอบ
===========
ผมลองทั้ง 2 วิธี กับ เครื่องที่ share folder ซึ่งเป็น windows 2000 server แล้ว ใช้ได้น่ะครับ

อ้างอิง
=====
จากที่นี่ เผื่อใครที่อยากอ่าน ต้นฉบับจริง ๆ

http://groups.google.co.th/group/microsoft.public.sqlserver.server/browse_thread/thread/dd3c09faf39a9177/5064600b8b1709bf?lnk=st&rnum=2&hl=th#5064600b8b1709bf