"تابستانِ شروع" رسید — تا ۹۰٪ تخفیف فقط تا ساعت ۲۳:۵۹ امشب جزئیات

پشتیبان‌ گیری در SQL Server؛ راهکارهای حرفه‌ ای و نکات کلیدی


SQL Server

پشتیبان‌ گیری در SQL Server؛ راهکارهای حرفه‌ ای و نکات کلیدی

اهمیت پشتیبان گیری و بازیابی منظم پایگاه داده رو نه میشه دست کم گرفت و نه نادیده گرفت و از اونجا که داده های شما ممکنه دستخوش تغییرات بشن، وظیفه اصلی اینه که امنیت اون ها رو تضمین کنید و خطرات از دست رفتن داده ها رو کاهش بدید.

به همین دلیل ما پشتیبان گیری های پایگاه داده رو در دست داریم و در این مقاله، ما شما رو با انواع اصلی و مفاهیم کلیدی پشتیبان گیری ها در ارتباط با پایگاه داده های SQL Server آشنا می کنیم.

بذارید از اینجا شروع کنیم که هر سیستم اطلاعاتی بستگی زیادی به تضمین عملکرد بدون نقص خودش داره. علاوه بر این، پیکربندی در دسترس بودن و تحمل خطا از اهمیت ویژه ای برخورداره و این ویژگی ها به میزان زیادی به هم وابسته هستن.

تحمل خطا می تونه در سطوح زیر به دست بیاد:

  1. سطح سخت‌افزار
  2. سطح برنامه – سطح سیستم‌عامل (OS)
  3. سطح برنامه – سطح اپلیکیشن
  4. سطح سیستم اطلاعاتی – اجزای سرور
  5. سطح DBMS – تنظیمات تکرار (Replication) و راه حل های تحمل خطا
  6. سطح پایگاه داده – پشتیبان‌گیری و بازیابی

همونطور که از لیست بالا می بینیم، تحمل خطا باید در سطح کل سرور پیاده سازی بشه چون اون سرور آخرین مرز قبل از حلقه عملکردی کل سیستم اطلاعاتی هست.

این اولین قسمت از سری مقالاتی هست که به پشتیبان گیری و بازیابی خودکار پایگاه داده اختصاص داره و تمرکز اصلی اون روی تضمین یکپارچگی پایگاه داده هست. برای نمایش فرآیندها و پیکربندی ها، ما از مایکروسافت SQL سرور به عنوان سیستم مدیریت پایگاه داده (DBMS) خود و پایگاه داده JobEmplDB که متعلق به یک سرویس جذب نیروی انسانی هست، استفاده خواهیم کرد.

SQL Server

حالا بیایید دقیق‌تر نگاه کنیم به انواع پشتیبان‌گیری در SQL Server :

انواع پشتیبان گیری در SQL Server

در این بررسی، ما انواع پشتیبان‌گیری های زیر رو پوشش می دهیم:

  1. پشتیبان گیری کامل (Full Backup)
  2. پشتیبان گیری کامل به چندین فایل (Full Backup to Multiple Files)
  3. پشتیبان گیری افزایشی (Differential Backup)
  4. پشتیبان گیری تراکنشی (Transaction Log Backup)
  5. پشتیبان گیری از انتهای لاگ (Tail-Log Backup)
  6. پشتیبان گیری جزئی (Partial Backup)
  7. پشتیبان گیری فایل و گروه فایل (File and File Group Backup)
  8. پشتیبان گیری فقط کپی (Copy-Only Backup)

پشتیبان گیری کامل (Full Backup)

پشتیبان گیری کامل یک پشتیبان است که شامل تمام داده های پایگاه داده مربوطه می شود، مانند مجموعه های فایل و گروه های فایل و همچنین لاگ ها برای تضمین بازیابی داده ها.

برای مثال، ما نیاز داریم که یک پشتیبان گیری کامل فشرده از پایگاه داده JobEmplDB ایجاد کنیم و اون رو در مسیر \Shared\Backup ذخیره کنیم، با چک کردن و نوشتن چک‌سام‌ها (checksums) و همچنین بررسی خود پشتیبان.

برای انجام این کار، اسکریپت زیر رو بر روی پایگاه داده خود اجرا می کنیم.

BACKUP DATABASE [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

برای دریافت اسکریپت ذکر شده در SSMS (SQL Server Management Studio) به Object Explorer می رویم، روی پایگاه داده JobEmplDB کلیک راست می کنیم و از منوی میانبر گزینه Tasks > Back Up رو انتخاب می کنیم.

SQL Server

پنجره Back Up Database نمایش داده میشه. در صفحه General، نوع پشتیبان گیری رو به Full تنظیم می کنیم و مقصد پشتیبان گیری رو مشخص می کنیم.

SQL Server

در صفحه Media Options، گزینه ها رو به شکل زیر انتخاب می کنیم.

SQL Server

در اینجا، پیشنهاد می کنیم تمام تنظیمات در گروه Reliability رو بررسی کنید. این کار ریسک ایجاد یک پشتیبان آسیب‌دیده رو به حداقل می رسونه.

در صفحه Backup Options، گزینه ها رو به شکلی که در اسکرین شات زیر نشان داده شده پیکربندی می کنیم. همیشه پیشنهاد می کنیم که پشتیبان های فشرده ایجاد کنید.

SQL Server

در نهایت، می توانیم روی Script کلیک کنیم تا اسکریپت تولید بشه.

SQL Server

پشتیبان گیری بار سیستم ورودی-خروجی رو کاهش میده اما بار CPU رو افزایش میده. بنابراین باید تنظیم فشرده سازی پشتیبان گیری پایگاه داده رو در هر جایی که امکان پذیر باشه فعال کنید. همچنین، می تونید تنظیم Backup checksum رو در سطح نمونه SQL Server با استفاده از اسکریپت زیر فعال کنید.

EXEC sys.sp_configure N'backup compression default', N'1'
GO
EXEC sys.sp_configure N'backup checksum default', N'1'
GO
RECONFIGURE WITH OVERRIDE
GO

شما می توانید همین کار رو در ویژگی های نمونه SQL Server، در صفحه Database Settings انجام بدید.

SQL Server

ما همچنین پیشنهاد می کنیم که تمامی بررسی ها رو در هنگام ایجاد پشتیبان گیری انجام بدید. همچنین باید پشتیبان گیری تکمیل شده رو هم بررسی کنید.

پشتیبان گیری کامل به چندین فایل

اگر پایگاه داده ما بسیار بزرگ باشه، می تونیم پشتیبان گیری رو به چند فایل کوچکتر تقسیم کنیم تا راحت تر مدیریت بشه.

BACKUP DATABASE JobEmplDB
TO DISK = N'\\Shared\Backup\JobEmplDB_Part1.bak',
   DISK = N'\\Shared\Backup\JobEmplDB_Part2.bak',
   DISK = N'\\Shared\Backup\JobEmplDB_Part3.bak'
WITH INIT, FORMAT, STATS = 10;

برای این کار، باید چندین فایل مقصد رو در اسکریپت خود مشخص کنیم، مشابه چیزی که در بالا آمده:

پشتیبان گیری افزایشی (Differential Backup)

پشتیبان گیری افزایشی اساساً یک زیرمجموعه از آخرین پشتیبان گیری کامل هست و شامل تمام تغییراتی میشه که از زمان آخرین پشتیبان گیری کامل انجام شده. بنابراین، هر چه تغییرات کمتر باشه، اندازه پشتیبان گیری کوچکتر میشه و برعکس.

در مورد ما، برای ایجاد یک پشتیبان گیری افزایشی از پایگاه داده JobEmplDB، اسکریپت زیر رو اجرا می کنیم.

BACKUP DATABASE [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH DIFFERENTIAL,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

به طور جایگزین، می توانیم این کار رو از طریق Back Up Database در SSMS انجام بدیم و همان مراحل را مانند پشتیبان گیری کامل طی کنیم.

SQL Server

تنها تفاوت این است که در صفحه General نوع پشتیبان گیری را به Differential backup تغییر می دهیم.

پشتیبان گیری تراکنشی (Transaction Log Backup)

پشتیبان گیری تراکنشی یک پشتیبان از لاگ های تراکنش هست. این پشتیبان شامل تمام ورودی های لاگ است که در پشتیبان گیری قبلی از لاگ تراکنش موجود نبوده اند (این ویژگی فقط در مدل بازیابی کامل SQL Server موجود است).

برای مثال، برای پشتیبان گیری از لاگ تراکنش پایگاه داده JobEmplDB، اسکریپت زیر را اجرا می کنیم.

BACKUP LOG [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

به طور جایگزین، می توانیم این کار رو از طریق همان Back Up Database در SSMS انجام بدیم.

SQL Server

این بار باید نوع پشتیبان گیری رو به Transaction Log backup در صفحه General تغییر بدیم.

پشتیبان گیری از انتهای لاگ (Tail-Log Backup)

پشتیبان گیری از انتهای لاگ شامل تمامی ورودی هایی هست که در پشتیبان گیری قبلی وجود نداشته اند (آخرین بخش از لاگ). این نوع پشتیبان گیری از از دست رفتن داده ها جلوگیری می کنه و ترتیب لاگ ها رو بدون آسیب نگه میداره.

بازیابی پایگاه داده SQL Server برای آخرین زمان به این معنیه که ابتدا باید پشتیبان گیری از انتهای لاگ اون انجام بشه. این بخش، آخرین نسخه از پشتیبان گیری مربوطه هست و برای بازیابی پایگاه داده ضروریه. پشتیبان گیری از انتهای لاگ در صورتی ضروری نیست که نقطه بازیابی در پشتیبان گیری قبلی لاگ قرار داشته باشه.

علاوه بر این، اگر پایگاه داده رو منتقل یا جایگزین (بازنویسی) کنید و نیازی به بازیابی اون به نسخه خاصی بعد از آخرین پشتیبان گیری نداشته باشید، نیازی به پشتیبان گیری از انتهای لاگ نخواهید داشت.

در مورد ما، برای ایجاد یک پشتیبان گیری از انتهای لاگ پایگاه داده JobEmplDB، اسکریپت زیر رو اجرا می کنیم.

BACKUP LOG [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH NO_TRUNCATE,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   NORECOVERY,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

پشتیبان گیری از انتهای لاگ رو می توان به همین راحتی از طریق Back Up Database در SSMS انجام داد.

SQL Server

برای این کار، به صفحه Media Options می رویم و گزینه Back up the tail of the log رو انتخاب کرده و پایگاه داده رو در حالت بازیابی (restoring state) تحت Transaction log قرار می دهیم.

پشتیبان گیری جزئی (Partial Backup)

پشتیبان گیری جزئی زمانی مفید هست که بخواهید گروه های فایل فقط خواندنی رو از پشتیبان گیری حذف کنید.

برای یک پایگاه داده خواندنی-نوشتنی، پشتیبان گیری جزئی شامل داده ها در گروه فایل اصلی، هر گروه فایل خواندنی-نوشتنی و به طور اختیاری، یک یا چند فایل فقط خواندنی است. پشتیبان گیری جزئی از یک پایگاه داده فقط خواندنی فقط شامل گروه فایل اصلی می شود.

در اینجا یک مثال از پشتیبان گیری جزئی وجود داره که از یک پارامتر به نام READ_WRITE_FILEGROUPS برای پشتیبان گیری فقط از گروه های فایل خواندنی-نوشتنی استفاده می کند.

BACKUP DATABASE [JobEmplDB]
READ_WRITE_FILEGROUPS
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL16.SQLEXPRESS02\MSSQL\Backup\JobEmplDB_partial.bak'
WITH DESCRIPTION = N'Partial Backup of read-write filegroups',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Partial Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   STATS = 10;
GO

توجه داشته باشید که پشتیبان گیری جزئی توسط SQL Server Management Studio پشتیبانی نمی شود.

پشتیبان گیری از فایل ها و گروه های فایل (File and File Group Backup)

شما می توانید داده ها را از فایل ها و یا گروه های فایل انتخابی پشتیبان گیری کنید. ما پشتیبان گیری از گروه فایل PRIMARY پایگاه داده JobEmplDB را انجام خواهیم داد. برای این کار، اسکریپت زیر را اجرا می کنیم.

BACKUP DATABASE [JobEmplDB] FILEGROUP = N'PRIMARY'
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND;
GO

به طور جایگزین، می توانیم این کار رو از طریق Back Up Database در SSMS انجام بدیم. این بار، در تب General، گروه فایل PRIMARY رو در بخش Files and filegroups تحت Backup component انتخاب می کنیم.

SQL Server

به همین روش، می توانیم یک پشتیبان گیری افزایشی جزئی ایجاد کنیم. (برای مثال، پشتیبان گیری افزایشی فقط برای گروه فایل PRIMARY)

BACKUP DATABASE [JobEmplDB] FILEGROUP = N'PRIMARY'
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH DIFFERENTIAL,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND;
GO

برای انجام این کار در Back Up Database، نوع پشتیبان گیری افزایشی (differential backup) را انتخاب می کنیم.

SQL Server

در ادامه گروه فایل PRIMARY را مشخص می کنیم.

پشتیبان گیری فقط کپی (Copy-Only Backup)

پشتیبان گیری فقط کپی یک پشتیبان خاص است که مستقل از ترتیب پشتیبان گیری استاندارد SQL Server عمل می کند.

برای ایجاد یک پشتیبان گیری فقط کپی از پایگاه داده JobEmplDB، اسکریپت زیر را اجرا می کنیم.

BACKUP DATABASE [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH COPY_ONLY,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

به طور جایگزین، می توانیم این کار را از طریق Back Up Database انجام دهیم و در صفحه General، گزینه Copy-only backup را انتخاب کنیم.

SQL Server

به طور مشابه، می توانیم یک پشتیبان گیری فقط کپی از لاگ تراکنش ها ایجاد کنیم.

BACKUP LOG [JobEmplDB]
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH COPY_ONLY,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;
GO

DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND;
GO

و دوباره، زمانی که این کار را از طریق Back Up Database انجام می دهیم، گزینه Copy-only backup را انتخاب می کنیم.

SQL Server

به همین روش، می توانیم یک پشتیبان گیری فقط کپی جزئی برای گروه فایل PRIMARY ایجاد کنیم.

BACKUP DATABASE [JobEmplDB] FILEGROUP = N'PRIMARY'
TO DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH COPY_ONLY,
   DESCRIPTION = N'backup description',
   NOFORMAT,
   NOINIT,
   NAME = N'JobEmplDB-Full Database Backup',
   SKIP,
   NOREWIND,
   NOUNLOAD,
   COMPRESSION,
   STATS = 10,
   CHECKSUM,
   CONTINUE_AFTER_ERROR;

GO
DECLARE @backupSetId AS INT;

SELECT
	@backupSetId = position
FROM msdb..backupset
WHERE database_name = N'JobEmplDB'
AND backup_set_id = (SELECT
		MAX(backup_set_id)
	FROM msdb..backupset
	WHERE database_name = N'JobEmplDB');

IF (@backupSetId IS NULL)
BEGIN
	RAISERROR (N'Verify failed. Backup information for database ''JobEmplDB'' not found.', 16, 1);
END

RESTORE VERIFYONLY FROM DISK = N'\\Shared\Backup\JobEmplDB.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND;
GO

زمانی که این کار را از طریق Back Up Database انجام می دهیم، گزینه Copy-only backup دوباره در دسترس است تا به ما کمک کند.

SQL Server

همین بود!

مشاهده انواع پشتیبان گیری و ویژگی های آن ها در یک نگاه

SQL Server

علاوه بر این، سازماندهی فرآیند پشتیبان گیری و بازیابی برای پایگاه داده های سیستم ضروری است. توجه داشته باشید که این فرآیند شامل تمام تغییراتی است که در حین انجام پشتیبان گیری ایجاد می شود.

برای یادگیری بیشتر در مورد فایل های پایگاه داده، می توانیم کوئری زیر را اجرا کنیم.

SELECT     [file_id],
	   [file_guid],
	   [type],
	   [type_desc],
	   [data_space_id],
	   [name],
	   [physical_name],
	   [state],
	   [state_desc],
	   [size],
	   [max_size],
	   [growth],
	   [is_media_read_only],
	   [is_read_only],
	   [is_sparse],
	   [is_percent_growth]
FROM sys.master_files
WHERE [database_id]=DB_ID('JobEmplDB');

در اینجا خروجی برای مورد ما آمده است.

SQL Server

این کوئری از نمای سیستم sys.master_files استفاده می کند و فیلدهای زیر را نمایش می دهد:

  • file_id – شناسه فایل در پایگاه داده. پارامتر file_id برای فایل اصلی همیشه برابر با 1 است.
  • file_guid – شناسه یکتای فایل.
  • type – نوع فایل (0 – داده، 1 – لاگ تراکنش، 2 – FILESTREAM).
  • type_desc – توضیح نوع فایل (ROWS – داده، LOG – لاگ تراکنش، FILESTREAM).
  • data_space_id – شناسه فضای داده ای که این فایل به آن تعلق دارد. فضای داده یک گروه فایل است (0 – برای لاگ های تراکنش).
  • name – نام منطقی فایل در پایگاه داده.
  • physical_name – نام کامل فایل در سیستم عامل.
  • state – وضعیت فایل:
    • 0 – ONLINE (آنلاین)
    • 1 – RESTORING (در حال بازیابی)
    • 2 – RECOVERING (در حال بازیابی)
    • 3 – RECOVERY_PENDING (در انتظار بازیابی)
    • 4 – SUSPECT (مشکوک)
    • 6 – OFFLINE (آفلاین)
    • 7 – DEFUNCT (غیرفعال)
  • state_desc – توضیح وضعیت داده.
  • size – اندازه فعلی فایل، بر حسب صفحات 8 کیلوبایتی. برای یک اسنپ‌شات پایگاه داده، آرگومان اندازه، فضای حداکثر قابل استفاده برای فایل تنها را تعریف می کند.
  • max_size – حداکثر اندازه فایل بر حسب صفحات 8 کیلوبایتی (0 – جلوگیری از افزایش اندازه؛ -1 – اندازه فایل می تواند افزایش یابد تا فضای کامل درایو پر شود).
  • growth (0 – اندازه فایل ثابت است و افزایش پیدا نمی کند؛ >0 – فایل به طور خودکار رشد می کند):
    • اگر پارامتر is_percent_growth مقدار 0 را داشته باشد، گام رشد در صفحات 8 کیلوبایتی اندازه گیری می شود که به نزدیک ترین 64 کیلوبایت گرد می شود.
    • اگر پارامتر is_percent_growth مقدار 1 را داشته باشد، گام رشد اندازه به صورت درصدی از اندازه کلی است.
  • is_media_read_only (1 – فایل در یک درایو فقط خواندنی است؛ 0 – فایل در درایوی است که اجازه خواندن و نوشتن می دهد).
  • is_read_only (1 – فایل به عنوان فقط خواندنی علامت گذاری شده است؛ 0 – فایل به عنوان قابل خواندن و نوشتن علامت گذاری شده است).
  • is_sparse (1 – یک فایل پراکنده است؛ 0 – فایل پراکنده نیست).
  • is_percent_growth (1 – اندازه فایل بر حسب درصد افزایش می یابد؛ 0 – اندازه فایل به صورت صفحه به صفحه افزایش می یابد).

ما می توانیم این اطلاعات را با استفاده از نمای سیستم sys.database_files دریافت کنیم.

SELECT [file_id],
	   [file_guid],
	   [type],
	   [type_desc],
	   [data_space_id],
	   [name],
	   [physical_name],
	   [state],
	   [state_desc],
	   [size],
	   [max_size],
	   [growth],
	   [is_media_read_only],
	   [is_read_only],
	   [is_sparse],
	   [is_percent_growth]
FROM sys.database_files;

هنگام کار با یک پایگاه داده، بررسی وضعیت و شرایط آن با استفاده از کوئری زیر بسیار مهم است:

SELECT
   [user_access]
   ,[user_access_desc]
   ,[is_read_only]
   ,[state]
   ,[state_desc]
   ,[is_in_standby]
FROM sys.databases
WHERE [name] = 'JobEmplDB';

در اینجا خروجی برای مورد ما آمده است.

SQL Server

این کوئری از نمای سیستم sys.databases استفاده می کند و فیلدهای زیر را نمایش می دهد:

  • user_access – تنظیم دسترسی کاربران:
    • 0 – MULTI_USER (چند کاربره)
    • 1 – SINGLE_USER (یک کاربره)
    • 2 – RESTRICTED_USER (کاربر محدود)
  • user_access_desc – توضیح وظیفه دسترسی کاربران.
  • is_read_only (1 – پایگاه داده فقط خواندنی است، 0 – پایگاه داده برای خواندن و نوشتن در دسترس است).
  • state – وضعیت پایگاه داده:
    • 0 – ONLINE (آنلاین)
    • 1 – RESTORING (در حال بازیابی)
    • 2 – RECOVERING (در حال بازیابی)
    • 3 – RECOVERY_PENDING (در انتظار بازیابی)
    • 4 – SUSPECT (مشکوک)
    • 5 – EMERGENCY (اورژانسی)
    • 6 – OFFLINE (آفلاین)
    • 7 – COPYING (در حال کپی)
    • 10 – OFFLINE_SECONDARY (آفلاین ثانویه)
  • state_desc – توضیح وضعیت پایگاه داده.
  • is_in_standby – 1 – پایگاه داده برای خواندن در دسترس است و فقط لاگ بازیابی می شود.

برای دریافت اطلاعات در مورد آخرین 10 پشتیبان گیری پایگاه داده از هر نوع (کامل، افزایشی، یا لاگ تراکنش)، اسکریپت زیر را اجرا می کنیم.

;WITH backup_cte
AS
(SELECT
		bs.[database_name]
	   ,CASE bs.[type]
			WHEN 'D' THEN 'database'
			WHEN 'L' THEN 'log'
			WHEN 'I' THEN 'differential'
			WHEN 'F' THEN 'filegroup'
			WHEN 'G' THEN 'diff file'
			WHEN 'P' THEN 'partial'
			WHEN 'Q' THEN 'partial differential'
			ELSE 'other'
		END AS [backup_type]
	   ,bs.[first_lsn]
	   ,bs.[last_lsn]
	   ,bs.[backup_start_date]
	   ,bs.[backup_finish_date]
	   ,CAST(bs.[backup_size] AS DECIMAL(18, 3)) / 1024 / 1024 AS [BackupSizeMb]
	   ,ROW_NUMBER() OVER
		(
		PARTITION BY bs.[database_name],
		bs.[type]
		ORDER BY bs.[backup_finish_date] DESC
		) AS [rownum]
	   ,bmf.[logical_device_name] AS [LogicalDeviceName]
	   ,bmf.[physical_device_name] AS [PhysicalDeviceName]
	   ,bs.[server_name]
	   ,bs.[user_name]
	FROM msdb.dbo.backupset AS bs
	INNER JOIN msdb.dbo.backupmediafamily AS bmf
		ON [bs].[media_set_id] = [bmf].[media_set_id])
SELECT
	[server_name] AS [ServerName]
   ,[database_name] AS [DBName]
   ,[user_name] AS [UserName]
   ,[backup_type] AS [BackupType]
   ,[backup_start_date] AS [BackupStartDate]
   ,[backup_finish_date] AS [BackupFinishDate]
   ,[BackupSizeMb]
   ,[LogicalDeviceName]
   ,[PhysicalDeviceName]
   ,[first_lsn] AS [FirstLSN]
   ,[last_lsn] AS [LastLSN]
   ,[rownum]
FROM backup_cte
WHERE [database_name] = 'JobEmplDB'
AND [rownum] <= 10
ORDER BY [rownum] ASC;

خروجی اجرای کوئری به شرح زیر است.

SQL Server

کوئری ما از نماهای سیستم msdb.dbo.backupset و msdb.dbo.backupmediafamily استفاده می کند و فیلدهای زیر را نمایش می دهد:

ServerName: نام سروری است که عملیات پشتیبان گیری SQL Server را اجرا می کند.

DBName: نام پایگاه داده ای است که در عملیات پشتیبان گیری شرکت می کند.

UserName: نام کاربری است که عملیات پشتیبان گیری را اجرا می کند.

BackupType: نوع پشتیبان گیری است (پایگاه داده، افزایشی، لاگ، گروه فایل، فایل افزایشی، جزئی، افزایشی جزئی).

BackupStartDate: تاریخ شروع فرآیند پشتیبان گیری است.

BackupFinishDate: تاریخ پایان فرآیند پشتیبان گیری است.

BackupSizeMb: اندازه پشتیبان گیری بدون فشرده سازی به مگابایت است.

LogicalDeviceName: نام منطقی دستگاه پشتیبان است.

PhysicalDeviceName: نام فیزیکی دستگاه پشتیبان است.

FirstLSN: شماره ثبت اولین یا قدیمی ترین ورودی لاگ تراکنش در مجموعه داده های رزرو شده است.

LastLSN: شماره ثبت ورودی لاگ بعدی پس از مجموعه داده های رزرو شده است.

rownum: شماره ترتیب پشتیبان گیری است که از 1 برای هر مجموعه منحصر به فرد (نام پایگاه داده، نوع پشتیبان گیری) شروع می شود.

به طور مشابه، می توانیم جدیدترین پشتیبان گیری های پایگاه داده را برای هر نوع پشتیبان گیری دریافت کنیم.

;WITH backup_cte
AS
(SELECT
		bs.[database_name]
	   ,CASE bs.[type]
			WHEN 'D' THEN 'database'
			WHEN 'L' THEN 'log'
			WHEN 'I' THEN 'differential'
			WHEN 'F' THEN 'filegroup'
			WHEN 'G' THEN 'diff file'
			WHEN 'P' THEN 'partial'
			WHEN 'Q' THEN 'partial differential'
			ELSE 'other'
		END AS [backup_type]
	   ,bs.[first_lsn]
	   ,bs.[last_lsn]
	   ,bs.[backup_start_date]
	   ,bs.[backup_finish_date]
	   ,CAST(bs.[backup_size] AS DECIMAL(18, 3)) / 1024 / 1024 AS [BackupSizeMb]
	   ,ROW_NUMBER() OVER
		(
		PARTITION BY bs.[database_name],
		bs.[type]
		ORDER BY bs.[backup_finish_date] DESC
		) AS [rownum]
	   ,bmf.[logical_device_name] AS [LogicalDeviceName]
	   ,bmf.[physical_device_name] AS [PhysicalDeviceName]
	   ,bs.[server_name]
	   ,bs.[user_name]
	FROM msdb.dbo.backupset AS bs
	INNER JOIN msdb.dbo.backupmediafamily AS bmf
		ON [bs].[media_set_id] = [bmf].[media_set_id])
SELECT
	[server_name] AS [ServerName]
   ,[database_name] AS [DBName]
   ,[user_name] AS [UserName]
   ,[backup_type] AS [BackupType]
   ,[backup_start_date] AS [BackupStartDate]
   ,[backup_finish_date] AS [BackupFinishDate]
   ,[BackupSizeMb]
   ,[LogicalDeviceName]
   ,[PhysicalDeviceName]
   ,[first_lsn] AS [FirstLSN]
   ,[last_lsn] AS [LastLSN]
   ,[rownum]
FROM backup_cte
WHERE [database_name] = 'JobEmplDB'
AND [rownum] = 1
ORDER BY [rownum] ASC;

در اینجا خروجی کوئری آمده است.

SQL Server

SQL Server همچنین از Volume Shadow Copy (VSS) پشتیبانی می کند و ماژول نویسنده (SQL module writer) را برای استفاده از پلتفرم VSS جهت پشتیبان گیری از فایل های پایگاه داده فراهم می آورد.

علاوه بر این، اگر به دنبال ابزاری برای پشتیبان گیری و بازیابی سریع و مؤثر پایگاه داده هستید، می توانید dbForge Studio for SQL Server را بررسی کنید که پشتیبان گیری و بازیابی قدرتمند با استفاده از ویزارد را ارائه می دهد.

نتیجه گیری

در نتیجه، ما مفاهیم پایه ای پشتیبان گیری در SQL Server را بررسی کردیم، نمایی دقیق از انواع اصلی پشتیبان گیری ارائه دادیم و هر مورد را با پایگاه داده JobEmplDB خود توضیح دادیم.

در انتها امیدواریم که این آموزش براتون مفید و کاربردی بوده باشه، همچنین اگر سوال یا ابهامی وجود داشت، خوشحال میشیم که پاسخگوی شما باشیم.

نظرات کاربران

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

آموزش های پیشنهادی

نوشته های دیگر در دسته بندی مقالات آموزشی

برترین ابزارهای DBMS

برترین ابزارهای DBMS؛ معرفی 12 ابزار مدیریت دیتابیس (2025)

برترین ابزارهای DBMS؛ 12 ابزار مدیریت دیتابیس که در سال 2025 باید حتما امتحانشون کنی!
ساخت دیتابیس در SQL Server

ساخت دیتابیس در SQL Server – آموزش قدم به قدم و تصویری 2025!

یادگیری ساخت دیتابیس در SQL Server با آموزش مرحله به مرحله و به صورت تصویری
ساخت دیتابیس در سال 2025

ساخت دیتابیس 2025 | آموزش گام به گام با مفاهیم پایه و کلیدی!

آموزش گام به گام ساخت دیتابیس با مفاهیم کلیدی در سال 2025
تخفیف ویژه لرن باکس ها

کمپین ایران