بکاپگیری از SQL Server و آزمون بازیابی پایگاه داده
از یک دیتابیس کوچک بکاپ بگیرید و آن را روی یک SQL Server جدا با نام تازه برگردانید؛ سپس یکپارچگی و دادهٔ نمونه را بررسی کنید.
این راهنما براساس مستندات رسمی تهیه شده و توسط نتمسترز بهصورت عملی آزمایش نشده است.
آخرین بازبینی متن:
در این صفحه
دو سرور آزمایشی و مجوزهای لازم
مثال برای SQL Server 2025 روی Windows، SSMS سازگار و دو Instance جدا به نام SQLLAB1 و SQLRESTORE1 است. هر دو نصب آزمایشی با نسخهٔ سازگار و مجوز معتبرند؛ مقصد از ارتباط با برنامههای تولید جداست. این متن دربارهٔ دیتابیس کاربری معمول با فایل Data و Log است، نه Azure SQL Database، دیتابیس سیستمی، Always On یا تعمیر خرابی.
روی SQLLAB1 پوشهٔ E:\SQLBackups و روی SQLRESTORE1 پوشههای E:\RestoreInput، D:\SQLData و L:\SQLLog باید از قبل آماده و دارای فضای کافی باشند. مسیرها متعلق به سرور موتور SQL هستند، نه رایانهای که SSMS روی آن باز است. حساب سرویس موتور باید حق نوشتن بکاپ در مبدأ، خواندن فایل ورودی و نوشتن فایلهای داده در مقصد را داشته باشد؛ دسترسی حساب ویندوز شما به پوشه کافی نیست.
حساب SQL مجاز برای BACKUP و حساب دارای اختیار ساخت دیتابیس تازه در مقصد لازم است؛ عضویت همزمان در همهٔ نقشهای مدیریتی شرط بکاپ نیست. برای ساخت نمونهٔ زیر از مدیر آزمایشگاه استفاده کنید و همین دسترسی را به حساب عملیاتی بکاپ تعمیم ندهید. بکاپ نسخهٔ جدید SQL روی نسخهٔ قدیمیتر Restore نمیشود. دیتابیس رمزگذاریشده نیز به گواهی یا کلید لازم و امکان استفاده از کلید خصوصی نیاز دارد؛ BAK را تنها دارایی بازیابی فرض نکنید.
Recovery Model چه تغییری در بکاپ میدهد؟
SELECT name, recovery_model_desc, state_desc
FROM sys.databases
WHERE name = N'NMBackupLab';| مدل | اثر بر طرح بکاپ |
|---|---|
| Simple | Log Backup ندارد؛ بازیابی به پایان نسخهٔ دادهٔ موجود محدود است |
| Full | به برنامهٔ Log Backup و زنجیرهٔ سالم برای بازیابی نقطهای نیاز دارد |
| Bulk-logged | Log Backup لازم دارد؛ عملیات bulk با ثبت حداقلی محدودیت بازیابی نقطهای ایجاد میکند |
برای دیدن همه ستونها، جدول را به چپ یا راست بکشید؛ با کیبورد از کلیدهای جهت استفاده کنید.
نام Full در Recovery Model با Full Backup یکی نیست. تغییر دیتابیس کاری به Simple برای کوچککردن Log میتواند طرح بازیابی را مختل کند. تمرین زیر یک دیتابیس تازه با Simple میسازد؛ این انتخاب را روی دیتابیس شرکت اعمال نکنید. برنامهٔ واقعی باید فاصلهٔ بکاپ و نگهداری نسخهها و نیاز برنامه به چند دیتابیس هماهنگ را پوشش دهد.
ساخت دادهٔ نمونه فقط روی SQLLAB1
در SSMS یک Query تازه روی SQLLAB1 باز کنید. نام NMBackupLab نباید وجود داشته باشد؛ اگر وجود دارد، توقف کنید و برای تمرین نام دیگری در تمام مراحل انتخاب کنید. قطعهٔ زیر یک Batch است؛ آن را تکهتکه اجرا نکنید. شرط ابتدای آن از ادامهٔ همین Batch روی دیتابیس همنام جلوگیری میکند.
USE master;
IF DB_ID(N'NMBackupLab') IS NOT NULL
THROW 50001, 'NMBackupLab already exists; stop.', 1;
EXEC(N'CREATE DATABASE [NMBackupLab]');
ALTER DATABASE [NMBackupLab] SET RECOVERY SIMPLE;
EXEC(N'USE [NMBackupLab];
CREATE TABLE dbo.RestoreProbe (Id int PRIMARY KEY, Note nvarchar(40) NOT NULL);
INSERT INTO dbo.RestoreProbe VALUES (1, N''before-backup''), (2, N''baseline'');');اجرای موفق این قطعه باید دو ردیف بسازد؛ این نتیجهٔ مورد انتظار است و باید در محیط خودتان بررسی شود. هیچ دستور حذف دیتابیس یا تغییر دیتابیس کاری در این تمرین وجود ندارد.
گرفتن Full Copy-only با CHECKSUM
در E:\SQLBackups نام NMBackupLab_run01.bak باید تازه باشد. برای اجرای دوباره نام تازه بدهید؛ استفادهٔ دوباره از فایل موجود ممکن است Backup Set دیگری به همان فایل اضافه کند. Append به معنی بکاپ افزایشی نیست. از INIT یا FORMAT برای پاککردن نسخههای قبلی استفاده نکنید.
BACKUP DATABASE [NMBackupLab]
TO DISK = N'E:\SQLBackups\NMBackupLab_run01.bak'
WITH COPY_ONLY, CHECKSUM, STATS = 10;COPY_ONLY مبنای Differential موجود را جابهجا نمیکند و مانند Full معمولی قابل بازیابی است؛ خودش مبنای Differential تازه نیست. CHECKSUM کنترل خطا را اضافه میکند، اما بهتنهایی اثبات کارکرد برنامه نیست. پیام پایان و خطاهای واقعی را بخوانید و فایل ساختهشده را ثبت کنید.
INSERT INTO [NMBackupLab].dbo.RestoreProbe
VALUES (3, N'after-backup');فایل BAK را با روش انتقال مجاز به E:\RestoreInput در SQLRESTORE1 منتقل کنید؛ مسیر و نام آن را دقیق ثبت کنید. هدف آزمایش این است که مقصد شامل دو ردیف زمان بکاپ باشد و ردیف سوم فقط در مبدأ باقی بماند.
خواندن فایل و بررسی قبل از Restore
اکنون Query تازهای روی SQLRESTORE1 باز کنید و نام سرور اتصال را دوباره ببینید. این فرمانها فایل را بررسی میکنند و هنوز دیتابیس نمیسازند:
RESTORE HEADERONLY
FROM DISK = N'E:\RestoreInput\NMBackupLab_run01.bak';
RESTORE FILELISTONLY
FROM DISK = N'E:\RestoreInput\NMBackupLab_run01.bak'
WITH FILE = 1;در HEADERONLY نام دیتابیس، زمان و Position نسخهٔ مطلوب را بررسی کنید. FILE = 1 فقط برای فایل تازه با اولین Backup Set این مثال است؛ اگر Position متفاوت است، آن را در همهٔ فرمانهای بعد اصلاح کنید. از FILELISTONLY نام LogicalName هر فایل را بخوانید؛ مثال زیر NMBackupLab و NMBackupLab_log را فرض میکند. اگر خروجی متفاوت یا بیش از دو فایل دارد، برای همهٔ فایلها مسیر جدا تعیین کنید و مثال را بدون تطبیق اجرا نکنید.
RESTORE VERIFYONLY
FROM DISK = N'E:\RestoreInput\NMBackupLab_run01.bak'
WITH FILE = 1, CHECKSUM,
MOVE N'NMBackupLab' TO N'D:\SQLData\NMBackupLab_RestoreTest.mdf',
MOVE N'NMBackupLab_log' TO N'L:\SQLLog\NMBackupLab_RestoreTest_log.ldf';VERIFYONLY کاملبودن و خوانایی بکاپ و کنترلهای مشخصی را بررسی میکند؛ ساختار همهٔ دادهها یا رفتار برنامه را تأیید نمیکند. اگر خطا دارد، قبل از Restore علت را رفع کنید. نام دیتابیس و هر دو مسیر مقصد باید تازه باشند و متعلق به فایل موجود دیگری نباشند.
Restore در مقصد تازه با MOVE
USE master;
IF DB_ID(N'NMBackupLab_RestoreTest') IS NOT NULL
THROW 50002, 'Restore target exists; stop.', 1;
RESTORE DATABASE [NMBackupLab_RestoreTest]
FROM DISK = N'E:\RestoreInput\NMBackupLab_run01.bak'
WITH FILE = 1, CHECKSUM,
MOVE N'NMBackupLab' TO N'D:\SQLData\NMBackupLab_RestoreTest.mdf',
MOVE N'NMBackupLab_log' TO N'L:\SQLLog\NMBackupLab_RestoreTest_log.ldf',
RECOVERY, STATS = 10;MOVE مسیر فیزیکی هر فایل را عوض میکند؛ تغییر نام دیتابیس بهتنهایی برای جلوگیری از برخورد فایلها کافی نیست. اینجا WITH REPLACE نداریم. در صورت برخورد نام یا فایل توقف کنید؛ گزینهٔ بازنویسی را برای عبور از خطا اضافه نکنید. RECOVERY این Restore تکمرحلهای را باز میکند؛ زنجیرهٔ Full/Differential/Log به ترتیب و NORECOVERY در مراحل میانی نیاز دارد و موضوع این تمرین Simple نیست.
کنترل یکپارچگی و دادهٔ نمونه
DBCC CHECKDB (N'NMBackupLab_RestoreTest') WITH NO_INFOMSGS;
SELECT Id, Note
FROM [NMBackupLab_RestoreTest].dbo.RestoreProbe
ORDER BY Id;CHECKDB نباید خطای حلنشده گزارش کند. SELECT باید فقط ردیفهای 1 و 2 را با متن زمان بکاپ نشان دهد؛ ردیف 3 پس از بکاپ ساخته شده و انتظار نداریم در این نسخه باشد. در مبدأ نیز وجود هر سه ردیف را جدا کنترل کنید. نبود پیام اطلاعاتی با NO_INFOMSGS را با بررسینکردن خطاها اشتباه نگیرید.
برای دیتابیس برنامهٔ واقعی، کنترل جدول نمونه کافی نیست؛ مسئول برنامه باید داده و عملیات ضروری را با اتصال به مقصد تست تأیید کند. Loginها، Jobهای SQL Agent و وابستگیهای بیرون دیتابیس کاربری را جدا فهرست کنید. هیچ اتصال برنامهٔ تولید را در این تمرین به مقصد تغییر ندهید.
نام سرورها، نسخهٔ SQL، Backup Set و زمان آن، مسیرها، نتیجهٔ CHECKDB و آزمون داده را ثبت کنید. فایل بکاپ، کلیدهای لازم و نسخهٔ مستقل را مطابق سیاست نگهداری حفظ کنید. برای تحویل نتیجه و آزمونهای گستردهتر، راهنمای بررسی بازیابی بکاپ را دنبال کنید؛ تعمیر دیتابیس خراب با گزینههای REPAIR موضوع این آموزش نیست.