1. วัตถุประสงค์
เมื่อทำการบำรุงรักษาฐานข้อมูล SQL Server เมื่อหัวหน้าของเราขอให้เราย้ายไฟล์ข้อมูลหลายสิบกิกะไบต์ไปยังเซิร์ฟเวอร์อื่นและต้องการเวลาหยุดทำงานน้อยที่สุด เรามีแผนที่จะปฏิบัติตามข้อกำหนดเหล่านี้หรือไม่
ที่นี่เราถือว่าทั้งสองเครื่องไม่ได้อยู่ในห้องคอมพิวเตอร์เดียวกัน ดังนั้นโซลูชันของเราจึงดูมีความหมายมากขึ้น หากคุณโชคดีมากและทั้งสองเครื่องอยู่ใน LAN เดียวกัน ขอแสดงความยินดีด้วย คุณสามารถมีได้มากขึ้น โปรแกรมสามารถ ทำมัน.
2. การวิเคราะห์และแนวคิดการออกแบบ
ที่จริงแล้ว สภาพแวดล้อมที่เราถือว่ามีสองลักษณะ ลักษณะแรกคือไฟล์ฐานข้อมูลมีขนาดค่อนข้างใหญ่ ลักษณะที่สองคือความเร็วการถ่ายโอนไฟล์ของเราอาจค่อนข้างช้า บางทีเราไม่สามารถทำอะไรกับความเร็วในการส่งได้ แต่เราสามารถเริ่มจากปัญหาเรื่องขนาดไฟล์แล้วรวมเข้ากับคุณสมบัติของ SQL Server เพื่อที่เราจะได้วิธีแก้ปัญหาดังต่อไปนี้
เพื่อลดเวลาหยุดทำงานให้เหลือน้อยที่สุด เราจะใช้การสำรองข้อมูลเต็มรูปแบบและการสำรองข้อมูลส่วนต่างเพื่อย้ายฐานข้อมูล ในระหว่างวัน ให้ทำการสำรองข้อมูลเต็มรูปแบบ (XXX_full.bak) ของฐานข้อมูลที่ต้องการย้าย และคัดลอกไฟล์สำรอง (คุณสามารถใช้ ซอฟต์แวร์ FTP ที่นี่) ดำเนินการเบรกพอยต์ดำเนินการต่อ) ไปยังเซิร์ฟเวอร์เป้าหมายเพื่อการกู้คืน รอจนกระทั่งหลังเวลาทำงานและทำการสำรองข้อมูลส่วนต่าง (XXX_diff.bak) จากนั้นคัดลอกการสำรองข้อมูลส่วนต่างนี้ไปยังเซิร์ฟเวอร์เป้าหมาย และดำเนินการกู้คืนส่วนต่างตามการกู้คืนที่สมบูรณ์ .
เวลาหยุดทำงานที่นี่ = เวลาสำรองข้อมูลส่วนต่าง + เวลาถ่ายโอนไฟล์สำรองส่วนต่าง + กู้คืนเวลาไฟล์สำรองส่วนต่าง ทำให้คุณรู้สึกว่าเวลานี้สั้นมากหรือไม่
3. สคริปต์อ้างอิง
โปรดใส่ใจกับการแก้ไขชื่อของฐานข้อมูลในสคริปต์ด้านล่าง รวมถึงเส้นทางที่แน่นอน
--1: การสำรองข้อมูลเต็มรูปแบบ
ประกาศ @dbname varchar (100)
ประกาศ @sql nvarchar (สูงสุด)
ตั้ง @dbname = 'ชื่อฐานข้อมูล'
ตั้งค่า @sql = '
ฐานข้อมูลสำรอง ['+@dbname+']
ไปยังดิสก์ = ''D:DBBackup'+@dbname+'_full.bak''
ด้วย NOFORMAT, NOINIT, NAME = '''+@dbname+' - สำรองฐานข้อมูลทั้งหมด '',
ข้าม, NOREWIND, NOUNLOAD, สถิติ = 10
ไป'
พิมพ์ @sql
--สร้าง SQL
--DataBaseName_full
ฐานข้อมูลสำรอง [ชื่อฐานข้อมูล]
ถึงดิสก์ = 'D:DBBackupDataBaseName_full.bak'
ด้วย NOFORMAT, NOINIT, NAME = 'การสำรองฐานข้อมูล DataBaseName เต็ม',
ข้าม, NOREWIND, NOUNLOAD, สถิติ = 10
ไป
--2: สำรองและกู้คืนข้อมูลเต็มรูปแบบ
ประกาศ @dbname varchar (100)
ประกาศ @sql nvarchar (สูงสุด)
ตั้ง @dbname = 'ชื่อฐานข้อมูล'
ตั้งค่า @sql = '
--คืนค่า '+@dbname+'_full
คืนค่าฐานข้อมูล ['+@dbname+']
จากดิสก์ = ''D:DBBackup'+@dbname+'_full.bak'' พร้อมไฟล์ = 1,
ย้าย N''DataBase_Name'' ไปที่ N''D:DataBase'+@dbname+'.mdf'',
ย้าย N''DataBase_Name_log'' ไปยัง N''D:DataBase'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, แทนที่, สถิติ = 10
ไป'
พิมพ์ @sql
--สร้าง SQL
--คืนค่า DataBaseName_full
คืนค่าฐานข้อมูล [ชื่อฐานข้อมูล]
จากดิสก์ = 'D:DBBackupDataBaseName_full.bak' ด้วยไฟล์ = 1
ย้าย N'DataBase_Name' ไปที่ N'D:DataBaseDataBaseName.mdf',
ย้าย N'DataBase_Name_log' ไปที่ N'D:DataBaseDataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, แทนที่, สถิติ = 10
ไป
--3: การสำรองข้อมูลส่วนต่าง
ประกาศ @dbname varchar (100)
ประกาศ @sql nvarchar (สูงสุด)
ตั้ง @dbname = 'ชื่อฐานข้อมูล'
ตั้ง @sql = '
ฐานข้อมูลสำรอง ['+@dbname+']
ไปยังดิสก์ = N''D:DBBackup'+@dbname+'_diff.bak''
ด้วยความแตกต่าง, NOFORMAT, NOINIT, NAME = N'''+@dbname+' - การสำรองฐานข้อมูลส่วนต่าง '',
ข้าม, NOREWIND, NOUNLOAD, สถิติ = 10
ไป
-
พิมพ์ @sql
--สร้าง SQL
--DataBaseName_diff
ฐานข้อมูลสำรอง [ชื่อฐานข้อมูล]
ถึงดิสก์ = N'D:DBBackupDataBaseName_diff.bak'
ด้วยความแตกต่าง, NOFORMAT, NOINIT, NAME = N'DataBaseName-การสำรองฐานข้อมูลส่วนต่าง',
ข้าม, NOREWIND, NOUNLOAD, สถิติ = 10
ไป
--4: การสำรองและกู้คืนส่วนต่าง
ประกาศ @dbname varchar (100)
ประกาศ @sql nvarchar (สูงสุด)
ตั้ง @dbname = 'ชื่อฐานข้อมูล'
ตั้ง @sql = '
--คืนค่า '+@dbname+'_full
คืนค่าฐานข้อมูล ['+@dbname+']
จากดิสก์ = ''D:DBBackup'+@dbname+'_diff.bak'' พร้อมไฟล์ = 1,
โหลดเปล่า สถิติ = 10
ไป'
พิมพ์ @sql
--สร้าง SQL
--คืนค่า DataBaseName_full
คืนค่าฐานข้อมูล [ชื่อฐานข้อมูล]
จากดิสก์ = 'D:DBBackupDataBaseName_diff.bak' ด้วยไฟล์ = 1
โหลดเปล่า สถิติ = 10
ไป
4. คำลงท้าย
บางทีมันควรจะอยู่ตรงนี้ แต่บ่อยครั้งที่ไฟล์ฐานข้อมูลของเรามีขนาดไม่ถึงสิบกิกะไบต์ แล้วเราควรทำอย่างไร? มีวิธีแก้ไขปัญหาอื่น ๆ อีกหรือไม่?
ฉันเคยย้ายไฟล์ข้อมูล 700G มาก่อน แต่ฉันมีเวลาเพียงพอในการย้ายมัน ฉันย้ายข้อมูลไปยังเซิร์ฟเวอร์ใหม่ผ่านงานฐานข้อมูล ข้อดีคือ ปรับฐานข้อมูลก่อนหน้าให้เหมาะสม เช่น ตั้งค่าพารามิเตอร์ฐานข้อมูล เป็นพาร์ติชั่นของตาราง และย้ายข้อมูลโดยมีผลกระทบน้อยที่สุดกับฐานข้อมูลก่อนหน้า ฉันจะเขียนขั้นตอนโดยละเอียดในครั้งต่อไป
(ผู้เขียน: ฟังเสียงลมและฝน ที่มา: http://gaizai.cnblogs.com/ )