زمانی که یک دیتابیس جدید ایجاد میکنید یا حجم فایلهای دیتابیس را افزایش میدهید، SQL Server نیاز دارد فضایی را در دیسک به این فایلها تخصیص دهد. این فرآیند میتواند زمانبر باشد، اما Database Instant File Initialization (IFI) قابلیتی است که به طور چشمگیری این زمان را کاهش میدهد. در این مقاله، با مفهوم IFI، کاربردهای آن و نحوه فعالسازی آن آشنا خواهیم شد.
اما Database Instant File Initialization چیست؟
فیچر Instant File Initialization یک ویژگی در SQL Server است که به هنگام ایجاد یا افزایش حجم فایلهای دیتابیس، فرآیند پاکسازی (zeroing out) فضای دیسک را نادیده میگیرد. یعنی زمانی که این ویژگی فعال باشد مثلا اگر بخواهید یک فایل ایجاد کنید به اندازه 10 گیگ همان لحظه فضا ده گیگ ایجاد میشود و منتظر اینکه آن فضا اول با مقدار صفر پر شود و سپس فایل را ایجاد کند نمی ماند. در حالت عادی، SQL Server برای اطمینان از امنیت دادهها، فضای دیسک را با مقدار صفر پر میکند که زمان زیادی میبرد. IFI با حذف این مرحله، فضای دیسک را به سرعت در دسترس قرار میدهد. و زمانی که این ویژگی IFI فعال باشد موارد زیر با سرعت بیشتری انجام می شود.
نکته : از SQL Server 2022 به بعد، فایلهای لاگ (Log Files) که تنظیمات Autogrowth آنها برابر 64 مگابایت است نیز میتوانند از IFI بهره ببرند. اما در نسخههای قبل از SQL Server 2022، فایلهای لاگ امکان استفاده از IFI را ندارند.
اما این ویژگی Instant File Initialization انقدر مهم بود که مایکروسافت قابلیت فعال سازی IFI از نسخه SQL Server 2016 هنگام نصب آورده است. و می توانید ویژگی IFI را فعال کنید. که در تصویر زیر مشخص است باید تیک مربوط به «Grant perform volume maintenance task privilege to sql server database engine Service» را بزنید.
و اگر خواستید بررسی کنید که آیا این ویژگی در Instance شما فعال است یا خیر می توانید از دستور زیر استفاده کنید. در صورتی که زیر ستون instant_file_initialization_enabled حروف Y باشد یعنی فعال است اگر N باشد یعنی فعال نیست.
SELECT instant_file_initialization_enabled, *
FROM sys.dm_server_services
GO
و یا از طریق خواندن لاگ هم میتوان این ویزگی ر بررسی کرد.
EXEC xp_readerrorlog 0, 1, N'Initialization', NULL, NULL, NULL, N'DESC';
GO
اما اگر هنگام نصب SQL Server فراموش تیک مربوط به Grant perform volume maintenance task privilege to sql server database engine Service» را بزنید. هیچ اشکالی ندارد چرا که میتوان بعد از نصب این ویژگی را فعال کرد . برای فعال سازی مراحل زیر را طی کنید.
کلید win + R را همزمان فشار دهید تا پنجره مربوط به RUN باز شود و عبارت secpol.msc نوشته و کلید Enter را بزنید تا پنجره مربوط به Local Security Policy باز شود و سپس زیر Local Policies گزینه
User Rights Assignment را پیدا کرده روی Perform Volume maintenance tasks دو بار کلیک کنید تا پنجره مربوط به اضافه کردن اکانت (Account) که سرویس sql server engine را اجرا کرده را اضافه میکنیم و بعد دکمه OK را زده و بعد سرویس اس کیو ال سرور را restart را میکنیم تا این ویژگی اعمال شود.
و با استفاده از دستور زیر مجدد بررسی کنید ببیند فعال است یا خیر.
SELECT instant_file_initialization_enabled, *
FROM sys.dm_server_services;
در ادامه قصد دارم به شما نشان دهم که ویژگی IFI چگونه عملکرد را بهبو می بخشد. البته این مورد را در دو سناریو به شما نشان می دهم ابتدا Restore کردن یک دیتابیس و بعد افزودن یک فایل دیتا به دیتابیس ، تا ببینیم جقدر تاثیر مثبت خواهد داشت.
1- بازیابی (Restore) دیتابیس StackOverflow2010 در حالی که IFI غیر فعال بوده 16:17 دقیقه طول کشید.
RESTORE DATABASE StackOverflow2010
FROM DISK = 'StackOverflow2010_full.bak'
WITH
MOVE 'StackOverflow2010' TO 'C:\Databases\Data\StackOverflow2010.mdf',
MOVE 'StackOverflow2010_log' TO 'C:\Databases\Log\StackOverflow2010_log.ldf'
, STATS = 10;
GO
اکنون IFI را فعال کردم و سرویس SQL Server را restart کردم تا این ویژگی اعمال شود.
بازیابی (Restore Database) همان دیتابیس را با فعال بودن IFI انجام دادم، زمان بازیاببی در این حالت به 2:16 دقیقه طول کشید. این برای یک پایگاه داده 11 گیگبایتی 17.7 درصد سریعتر است. حالا شما تصور کنید برای پایگاه داده هایی در حد ترابایت هستند ، ویژگی IFI چقدر میتواند کمک کند.
سناریو دوم : افزودن دیتا فایل به دیتابیس StackOverflow2010 زمانی که IFI غیرفعال است 3:24 دقیقه طول کشید.
ALTER DATABASE StackOverflow2010
ADD FILE (NAME = N'StackOverflow2010_2',
FILENAME = N'C:\Databases\Data\StackOverflow2010_2.ndf',
SIZE = 10GB , maxsize = unlimited, filegrowth = 1024MB);
و مجدد ویژگی IFI را فعال می کنم و سرویس SQL Server را restart میکنم، و یک دیتا فایل با همان سایز 10 گیگ اضافه میکنم و مدت زمان ایجاد فایل کمتر از 1 ثانیه طول کشید.
ALTER DATABASE StackOverflow2010
ADD FILE (NAME = N'StackOverflow2010_3',
FILENAME = N'C:\Databases\Data\StackOverflow2010_3.ndf',
SIZE = 10GB , maxsize = unlimited, filegrowth = 1024MB);
اگر ویژگی IFI را فعال کردید و خواستید در لاگ SQL Server اطلاعات زیادی در این خصوص ببینید میتوانید از دستور زیر را اجرا کنید .
DBCC TRACEON(3004,3605,-1)
یک نکته مهم : سناریو که در این مطالب شما خوانید و اگر در سیستم خودتان تست کردید ممکن است بسته به منابع سیستم شما و نوع هارد دیسک شما مدت زمان متغییر باشد.
Database Instant File Initialization ابزاری قدرتمند برای بهبود عملکرد SQL Server است که به شما امکان میدهد فرآیندهایی مانند ایجاد دیتابیس، بازیابی بکاپ و افزایش حجم فایلها را سریعتر انجام دهید. با این حال، پیش از فعالسازی این ویژگی، باید جنبههای امنیتی و دسترسیهای لازم را به دقت بررسی کنید.
اگر هنوز IFI را غیرفعال کرده اید، توصیه می کنم آن را فعال کنید.