ฉันจะแนบฐานข้อมูลใน SQL Server ได้อย่างไร


32

คำถามทั่วไปที่เกี่ยวข้องกับการแนบฐานข้อมูลใน SQL Server:

  • การแนบหรือแยกฐานข้อมูลหมายความว่าอย่างไร
  • ฉันจะแยกฐานข้อมูลได้อย่างไร
  • ฉันจะแนบฐานข้อมูลได้อย่างไร
    • การแนบและสร้างบันทึกใหม่หมายความว่าอย่างไร
  • ฉันจะทำอย่างไรใน SQL Server Express
  • ฉันจะพิจารณาถอดและติดตั้งเมื่อใด
  • มีความเสี่ยงหรือคำเตือนหรือไม่?
  • แล้วการเชื่อมต่อระหว่าง SQL Server กับรุ่นต่าง ๆ ล่ะ? (มาตรฐานสู่องค์กร? 2000 ถึง 2008? 2012 ถึง 2008?)

คำตอบ:


33

แยกออกหรือเชื่อมต่อคืออะไรและทำงานอย่างไร

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

ฉันจะแยกฐานข้อมูลได้อย่างไร

คุณสามารถทำได้ใน T-SQL หรือจาก SQL Server Management Studio GUI

ใน GUI คุณคลิกขวาบนฐานข้อมูลที่คุณต้องการที่จะแยกออกเลือกและคลิกที่All Tasks Detachจากนั้นคุณจะได้รับกล่องโต้ตอบแยก คุณสามารถเลือกที่จะวางการเชื่อมต่อก่อนเพื่อบังคับให้ยกเลิกการเชื่อมต่อที่ใช้งานอยู่และการย้อนกลับที่พวกเขากำลังดำเนินการ นอกจากนี้คุณยังสามารถเลือกอัปเดตสถิติก่อนที่จะถอดออกได้ กำลังตัดผ่าน - เลือกแยก ...

ใน T-SQL:

-- You don't want to be in the database you are trying to detach
USE Master
GO

-- Optional step to drop all active connections and roll back their work
ALTER DATABASE DatabaseName
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

-- Perform the detach
EXEC sp_detach_db 'DatabaseName'
GO

สำหรับโพรซีเดอร์ที่เก็บไว้ในระบบ sp_detach_db มีพารามิเตอร์สองตัวที่คุณสามารถผ่านได้:

  • @skipchecks- อินพุตที่ยอมรับได้คือ'True'หรือ'False'ถ้า'True'SQL Server จะอัปเดตสถิติก่อนที่จะแยกออก ถ้า ' False'มันจะไม่ หากคุณไม่ระบุอะไรที่นี่สถิติจะได้รับการอัปเดตใน SQL Server 2005 หรือใหม่กว่า
    • @keepfulltextindexfile- ค่าเริ่มต้นที่นี่คือ'True'- หากตั้งค่าเป็นจริงข้อมูลเมตาของดัชนีข้อความแบบเต็มจะไม่ถูกทิ้งระหว่างการถอด

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการแยกออกและรายละเอียดเพิ่มเติมเกี่ยวกับความเสี่ยงที่ฉันเน้นด้านล่างบทความ Books Onlineสำหรับsp_detach_dbเป็นจุดเริ่มต้นที่ดี

ฉันจะแนบฐานข้อมูลได้อย่างไร

คุณสามารถทำได้ใน T-SQL หรือจาก SQL Server Management Studio GUI

( หมายเหตุ: หากคุณมีข้อมูลและไฟล์บันทึกจากฐานข้อมูลที่ไม่ได้ถอดออกอย่างถูกต้องไฟล์แนบของคุณอาจไม่ทำงานเมื่อมีการปลดเกิดขึ้นฐานข้อมูลจะถูกออฟไลน์และไฟล์บันทึกและข้อมูลจะอยู่ในสถานะที่สอดคล้องกัน เกิดขึ้นเมื่อบริการถูกปิดอย่างสมบูรณ์ )

ใน GUI คุณคลิกขวาที่ระดับบนโฟลเดอร์สำหรับอินสแตนซ์ของคุณและเลือกDatabases Attachในกล่องโต้ตอบถัดไปคุณจะต้องเลือกไฟล์ข้อมูลหลัก (.MDF) ของฐานข้อมูลที่คุณต้องการแนบและให้แน่ใจว่าคุณได้เลือกไฟล์อื่น ๆ และระบุตำแหน่งที่เหมาะสมแล้วคลิกตกลงติดฐานข้อมูลของคุณ

ใน T-SQL วิธีที่ดีที่สุดในการทำเช่นนี้ใน SQL Server 2005 และส่งต่อคือผ่านCREATE DATABASEคำสั่ง นี่คือวิธีที่ได้รับการสนับสนุนนอกเหนือจาก SQL Server 2012 หากคุณต้องการดูวิธีการใช้งานsp_attach_dbคุณสามารถเห็นได้ว่าในบทความหนังสือออนไลน์สำหรับ[sp_attach_db][3]หรือ[sp_attach_single_file_db][4]

เมื่อคุณมีไฟล์บันทึกและไฟล์ข้อมูลและสอดคล้องกันนี่เป็นวิธีการ T-SQL:

- การใช้สร้างฐานข้อมูลและส่วนคำสั่ง FOR ATTACH เพื่อแนบ

CREATE DATABASE DatabaseName 
    ON (FILENAME = 'FilePath\FileName.mdf'), -- Main Data File .mdf
    (FILENAME = 'FilePath\LogFileName.ldf'), -- Log file .ldf
     (FILENAME = 'FilePath\SecondaryDataFile.ndf)  -- Optional - any secondary data files
    FOR ATTACH 
GO 

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

ฉันจะแยก / แนบใน SQL Server Express ได้อย่างไร

มันเหมือนกันจริงๆ หากคุณใช้ SQL Server Management Studio Express คุณสามารถใช้กล่องโต้ตอบแยก / แนบใน GUI ที่อธิบายไว้ข้างต้นหรือขั้นตอน T-SQL ผ่าน SSMS Express ที่อธิบายไว้ข้างต้นเช่นกัน ไม่มีความแตกต่างกับ Express ตรงนั้น

หากคุณไม่มี SSMS Express คุณสามารถดาวน์โหลดได้ ( นี่คือเวอร์ชันของ SQL Server 2012 Express)

ของคุณสามารถเข้าสู่SQLCMDเซสชั่นและใช้โครงสร้าง T-SQL เดียวกันที่อธิบายไว้ข้างต้น

เมื่อใดที่ฉันควรพิจารณาทำการถอดหรือติดตั้ง

สิ่งแรกที่คำว่า detach และ attach นั้นไม่ได้มีไว้สำหรับใช้งาน: Backup and Recovery Detach and Attach ไม่ใช่วิธีการสำรองฐานข้อมูลของคุณเพื่อการกู้คืนตามปกติ ไม่มีการสำรองข้อมูลบันทึกธุรกรรมด้วยวิธีนี้มันทำให้ฐานข้อมูลของคุณอยู่ในสถานะที่สามารถลบไฟล์ฐานข้อมูลโดยไม่ตั้งใจได้และไม่ใช่วิธีที่ดีสำหรับวัตถุประสงค์นี้

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

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

ความเสี่ยงและคำเตือน

อีกครั้งหนังสือออนไลน์เป็นแหล่งข้อมูลที่ดีที่นี่แต่ฉันจะขอพิจารณาข้อพิจารณาเฉพาะบางประการเพื่อระลึกถึงการแยกหรือแนบฐานข้อมูล -

ถอด

  • คุณกำลังทำให้ฐานข้อมูลของคุณออฟไลน์ มันจะไม่สามารถเข้าถึงได้อีกต่อไป สิ่งนี้ควรชัดเจน แต่ควรเรียกว่าคุ้มค่า นี่คือเหตุผลที่มันไม่ใช่ตัวเลือกการสำรองข้อมูลที่ดี
  • เมื่อฐานข้อมูลของคุณออนไลน์ SQL Server จะล็อกไฟล์ ฉันจะไม่แนะนำให้ลองทำสิ่งนี้เพื่อพิสูจน์ว่าฉันผิดเพราะอาจมีสถานการณ์อื่นที่กำลังเล่นอยู่ แต่โดยทั่วไปคุณไม่สามารถลบไฟล์ฐานข้อมูล (ข้อมูลข้อมูลรองหรือไฟล์บันทึก) ในขณะที่ SQL Server ออนไลน์อยู่ นี่เป็นสิ่งที่ดี เมื่อคุณแยกคุณจะไม่มีการป้องกันเช่นนี้ - อาจเป็นเรื่องเลวร้าย
  • หากคุณกำลังจัดการกับความเสียหายของฐานข้อมูลและคุณพบบทความบางแห่งที่มีขั้นตอนแรกของการแยกออก - มันผิด - ถ้าคุณแยกฐานข้อมูลที่เสียหายนั่นอาจเป็นได้ คุณอาจไม่ได้แนบฐานข้อมูลนั้นอีกครั้ง
  • การตัดและวางไฟล์ฐานข้อมูลการผลิตของคุณทั่วทั้งเครือข่ายเป็นวิธีหนึ่งที่จะทำให้เกิดความเสียหายในระดับไฟล์ .. อีกเหตุผลหนึ่งที่ฉันต้องการสำรอง / กู้คืนเมื่อทำการย้ายข้อมูล
  • มันอาจทำให้แผนการบำรุงรักษาล้มเหลว สถานการณ์คือที่คุณมีตั้งแผนบำรุงรักษาเพื่อดำเนินการสำรองข้อมูลปกติของฐานข้อมูลทั้งหมดโดยไม่ต้องตรวจสอบการปฏิบัติที่ดีที่สุด วิธีนี้ใช้งานได้ดีดังนั้นคุณจึงหยุดคิดถึงมัน คนอื่นตัดสินใจที่จะใช้ฐานข้อมูลที่พวกเขาไม่ได้ใช้ออฟไลน์ แผนการบำรุงรักษาจะล้มเหลวจากจุดนั้นไปข้างหน้าจนกว่าคุณจะแก้ไขแผนการบำรุงรักษาโดยการตรวจสอบตัวเลือก "ละเว้นฐานข้อมูลที่สถานะไม่ออนไลน์" ในกล่องโต้ตอบ "ฐานข้อมูล" โปรดทราบว่าจะไม่เพียง แต่ล้มเหลวสำหรับฐานข้อมูลออฟไลน์ - แผนการบำรุงรักษาจะล้มเหลวพร้อมข้อผิดพลาด ณ เวลาที่พยายามสำรองฐานข้อมูลออฟไลน์ดังนั้นฐานข้อมูลออนไลน์บางแห่งอาจไม่ได้สำรองไว้ (ผู้แต่งคนละคนสำหรับประเด็นนี้จงปฏิบัติด้วยความสงสัย)

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

แล้ว SQL Server รุ่นต่างๆหรือรุ่นที่ต่างกันล่ะ?

สิ่งเหล่านี้ไม่แตกต่างจากกฎการกู้คืนฐานข้อมูลระหว่างเวอร์ชัน โดยทั่วไปคุณสามารถคืนค่าได้ถึงเวอร์ชันถัดไปสำหรับรุ่น 3 (SQL Server 2008 ถึง SQL Server 2012 ตัวอย่างเช่นจะทำงาน SQL Server 2000 ไปยัง SQL Server 2012 จะไม่) คุณไม่สามารถย้อนกลับได้เลยด้วยการสำรอง / กู้คืนหรือถอด / แนบ - คุณจะต้องคัดแยกวัตถุและสคริปต์แทรกออกและทำด้วยตนเองหรือด้วยเครื่องมือที่ทำสิ่งนี้ สำหรับรุ่นต่าง ๆ โดยทั่วไปคุณสามารถย้ายระหว่าง SKU หลักของ SQL Server - ตัวอย่างเช่นคุณสามารถย้ายฐานข้อมูลจาก Standard ไปยัง Enterprise โดยไม่มีงานพิเศษ หากคุณใช้คุณสมบัติขององค์กร (พูดบีบอัดหรือแบ่งพาร์ติชัน) คุณจะต้องปิดใช้งานคุณลักษณะเหล่านั้นก่อนที่จะทำการย้าย คุณสามารถรับทราบคุณสมบัติที่คุณต้องการ


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

ฉันมีฐานข้อมูลที่เมื่อฉันหยุดอินสแตนซ์ SQL Server และคัดลอกไฟล์ 3 ไฟล์จากนั้นฉันแนบไฟล์เหล่านั้นในอินสแตนซ์อื่นฐานข้อมูลจะเข้าสู่การกู้คืน (เกิดขึ้นกับฉันสองครั้งในฐานข้อมูลเดียวกัน) จากคำอธิบายของคุณสิ่งนี้ไม่ควรเกิดขึ้นดังนั้นฉันควรสงสัยอะไรเกี่ยวกับฐานข้อมูลของฉัน มันเสียหายอย่างใด? การสำรองข้อมูลใช้เวลานานหลายปีในการสร้างและกู้คืนและคุณลักษณะนี้เป็นตัวช่วยชีวิต! อย่างน้อยเพื่อวัตถุประสงค์ในการใช้งานร่วมกันของนักพัฒนา DB ...
ไม่มีใคร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.