Bacpac and Dacpac, the similarities and differences

فایل‌های Bacpac و Dacpac؛ شباهت‌ها و تفاوت‌ها

هنگامی که نیاز دارید یک پایگاه داده کامل یا اشیاء درون آن را جابه‌جا کنید، فایل‌های bacpac و dacpac به دلیل وجود گزینه‌های ابزاری فراوان برای... نام برده می‌شوند.

هنگامی که نیاز دارید یک پایگاه داده کامل یا اشیاء درون آن را جابه‌جا کنید، فایل‌های bacpac و dacpac اغلب به دلیل وجود ابزارهای فراوان برای تعامل با آن‌ها مطرح می‌شوند. فایل‌های bacpac و dacpac دارای شباهت‌های اساسی و همچنین تفاوت‌های عمده‌ای در نحوه استفاده از آن‌ها در ابزار SqlPackage و سایر ابزارهای SQL هستند، اما انعطاف‌پذیری آن‌ها می‌تواند کمی سردرگمی ایجاد کند. در این مقاله، قصد داریم دقیقاً بررسی کنیم که چه چیزی فایل‌های bacpac را به‌طور ویژه مهم می‌سازد و همچنین قابلیت‌های مختلف فایل‌های dacpac را واکاوی کنیم.

فایل bacpac در درجه اول یک نسخه قابل حمل از ساختار (schema) و داده‌ها است که مدل آن به سطح پشتیبانی پایگاه داده Azure SQL محدود می‌شود. فایل dacpac در درجه اول یک خروجی استقرار (deployment artifact) است، از مدل‌های پلتفرم مقصد گسترده‌تری پشتیبانی می‌کند و می‌تواند به‌صورت اختیاری شامل داده‌ها نیز باشد.

فایل‌های Bacpac: قابلیت حمل برای پایگاه داده Azure SQL

بیشتر افراد فایل‌های bacpac را از طریق کار با گزینه‌های قابلیت حمل برای استخراج (export) و وارد کردن (import) می‌شناسند؛ این قابلیت‌ها امکان جابه‌جایی اشیاء پایگاه داده و داده‌های آن‌ها را در نسخه‌های مختلف SQL، از جمله دانگرید کردن نسخه‌ها (چه از Azure به SQL Server یا برعکس به نسخه‌های قدیمی‌تر SQL Server) فراهم می‌کنند. این موضوع تفاوت بزرگی با فایل‌های پشتیبان (فایل‌های BAK) دارد که فقط می‌توانند روی همان نسخه از SQL Server یا نسخه‌های ارتقایافته بازگردانی (restore) شوند. قابلیت‌های وارد کردن و استخراج در SQL Server Management Studio (SSMS)، وی‌اس کد (VS Code)، پورتال Azure و خط فرمان از طریق SqlPackage در دسترس هستند.

فایل‌های bacpac فرمتی برای جابه‌جایی انعطاف‌پذیر داده‌ها هستند، اما برای رسیدن به آن فرمت قابل‌حمل‌تر، یک سازش در سرعت عملیات وجود دارد. عملیات استخراج یا وارد کردن یک فایل bacpac معمولاً کندتر از پشتیبان‌گیری یا بازگردانی بومی SQL Server است. عملیات‌های bacpac به‌طور منطقی ساختار پایگاه داده و داده‌های جداول را استخراج و بازسازی می‌کنند، در حالی که پشتیبان‌گیری و بازگردانی بومی، صفحات پایگاه داده و رکوردهای لاگ را در فرمت پشتیبان بهینه‌شده‌ی SQL Server کپی می‌کنند. در پایگاه داده Azure SQL، پشتیبان‌های سطح فایل به عنوان بخشی از سرویس مدیریت می‌شوند و در SQL Server، شما یا مدیر پایگاه داده‌تان (DBA) مسئول مدیریت صحیح فرآیندهای پشتیبان‌گیری هستید.

یک فایل bacpac شامل تعریف اشیاء پایگاه داده و همچنین نسخه‌ای از تمام داده‌های موجود در جداول است. اگر پسوند یک فایل bacpac را به .zip تغییر دهید و آن را در یک پوشه استخراج کنید، می‌توانید محتویات درون آن را مشاهده کنید. محتویات شامل یک فایل model.xml است که ساختار اشیاء را تعریف می‌کند و همچنین یک پوشه داده که حاوی فایل‌های BCP است. این فایل‌های BCP در طول استخراج نوشته شده‌اند و هنگام وارد کردن، درج انبوه (bulk insert) پایگاه داده را با آن داده‌ها پر خواهد کرد.

bacpac image

قابلیت حمل داده از طریق فایل‌های bacpac بر این تمرکز دارد که اطمینان حاصل شود فایل bacpac را می‌توان به پایگاه داده Azure SQL وارد کرد. در نتیجه، فایل‌های bacpac فقط می‌توانند حاوی اشیایی باشند که قابلیت استفاده در پایگاه داده Azure SQL را دارند. یک فایل bacpac را نمی‌توان از یک پایگاه داده SQL Server با اشیایی که در پایگاه داده Azure SQL پشتیبانی نمی‌شوند (مانند ورودهای ویندوزی (Windows logins)، ستون‌های file stream یا حتی عناصر SQL CLR) ایجاد کرد.

اگر با پایگاه داده‌ای مواجه شدید که به دلیل وجود عناصر پشتیبانی‌نشده در پایگاه داده Azure SQL قابل استخراج به bacpac نیست، جای نگرانی نیست. یک گزینه این است که کپی از آن پایگاه داده ایجاد کرده و اشیاء پشتیبانی‌نشده را حذف کنید. با این حال، اگر مقصد مورد نظر شما پایگاه داده Azure SQL نباشد، ممکن است آن محدودیت‌های اشیاء معنادار یا مطلوب نباشند. در این حالت، درک تمام قابلیت‌های یک فایل dacpac گزینه دیگری را پیش روی شما قرار می‌دهد.

فایل‌های Dacpac: همه‌کاره و منعطف

بیشتر افرادی که با فایل‌های dacpac آشنایی دارند، آن‌ها را برای استقرار پایگاه داده می‌شناسند. هنگامی که یک پروژه SQL را می‌سازید (build)، خروجی/نتیجه یک فایل dacpac است، اما یک dacpac را همچنین می‌توان مستقیماً از یک پایگاه داده موجود استخراج کرد. یک فایل dacpac حاوی تعریف ساختار (schema) یا مدل پایگاه داده است و ابزارهای dacpac یک برنامه استقرار (deployment plan) تولید می‌کنند که می‌تواند به صورت T-SQL (اسکریپت) خروجی گرفته شود یا مستقیماً اعمال شود (انتشار یا publish). برای یک پایگاه داده جدید، برنامه استقرار شامل ساخت تمام اشیاء از صفر است. برای یک پایگاه داده موجود، برنامه استقرار تعیین می‌کند که چگونه اشیاء موجود پایگاه داده را به گونه‌ای تغییر دهد که با تعریف ارائه شده در dacpac مطابقت داشته باشند.

عملیات‌های انتشار و اسکریپت گزینه‌های متعددی دارند که برنامه استقرار تولیدشده را سفارشی‌سازی و تحلیل می‌کنند. نمونه‌ای از گزینه‌ای که برنامه استقرار را سفارشی می‌کند «GenerateSmartDefaults» است که مقادیر پیش‌فرض را هنگام افزودن یک ستون فاقد قابلیت پذیرش مقدار تهی (non-nullable) به جدولی با رکوردهای موجود، درج می‌کند. نمونه‌ای از گزینه‌ای که برنامه استقرار را تحلیل می‌کند «AllowTableRecreation» است که بررسی می‌کند آیا برنامه استقرار قبل از لغو استقرار یا اجازه ادامه آن، داده‌های یک جدول را در مکان جدیدی کپی خواهد کرد یا خیر. در حالی که استقرارهای پویا امکان استفاده از فایل‌های dacpac را برای جریان‌های کاری متعددی از برنامه‌های ساده گرفته تا SaaS چندمشتری (multi-tenant) با هزاران پایگاه داده فراهم می‌کنند، انعطاف‌پذیری فرمت dacpac بر کارایی آن می‌افزاید.

dacpac image

ایجاد یک فایل dacpac با یک عملیات استخراج به‌طور پیش‌فرض شامل تمام تعاریف اشیاء در پایگاه داده است و این اشیاء می‌توانند مختص هر تعداد پلتفرم مقصد باشند (SQL Server، پایگاه داده Azure SQL، پایگاه داده SQL در Fabric و غیره). با این حال، عملیات استخراج را می‌توان به موارد زیر تغییر داد:

  • استثنا کردن عناصر در سطح سرور از فایل dacpac
  • گنجاندن داده‌های مربوط به جداول به‌طور مستقیم در فایل dacpac (مشابه فایل bacpac)
  • استخراج داده‌های جدول در فضای ذخیره‌سازی Azure Blob Storage به عنوان فایل‌های parquet
dacpac data options image

با قابلیت گنجاندن داده‌ها در فایل dacpac یا همراه با آن، می‌توانید در سناریوهایی که نیاز فایل bacpac به سازگاری با پایگاه داده Azure SQL به یک چالش تبدیل می‌شود، قابلیت حمل را به سرانجام برسانید. در حالی که انتشار و استخراج dacpac در اکثر ابزارها در دسترس است، بهره‌برداری از این قابلیت‌های پیچیده‌تر معمولاً نیازمند استفاده از رابط خط فرمان SqlPackage (CLI) است.

قابلیت حمل با فایل‌های dacpac

در ادامه یک نمای کلی سریع و تاکتیکی از جابه‌جایی یک کپی از پایگاه داده از سروری به سرور دیگر از طریق یک فایل dacpac با استفاده از دستورات extract و publish در خط فرمان SqlPackage آورده شده است. به عنوان یادآوری، این کار مشابه استخراج و وارد کردن با یک فایل bacpac است، اما هیچ تضمینی وجود ندارد که با ایجاد فایل dacpac، محتویات آن آماده وارد کردن به پایگاه داده Azure SQL باشند.

برای مرحله استخراج، فرآیند ما شامل افزودن «/p:ExtractAllTableData=true» و به‌طور اختیاری «/p:ExtractReferencedServerScopedElements=false» برای ایجاد یک فایل dacpac به همراه کپی داده‌ها از پایگاه داده اصلی است.

    sqlpackage /action:extract /sourceconnectionstring:"<source connection string>" /targetfile:"C:\extracted.dacpac" /p:ExtractAllTableData=true  /p:ExtractReferencedServerScopedElements=false
  

برای مرحله انتشار، داده‌های موجود در فایل dacpac به‌طور پیش‌فرض روی پایگاه داده بارگذاری می‌شوند. برای تغییر فرآیند استاندارد انتشار، ممکن است ویژگی‌های اضافی مانند موارد زیر را اضافه کنیم:

  • «/p:AllowIncompatiblePlatform=true» هنگام جابه‌جایی بین انوع مختلف پایگاه داده
  • «/p:ExcludeObjectTypes=Logins;Users» برای رد کردن ورودهای ویندوزی که هنگام انتقال به پایگاه داده Azure SQL روی SQL Server وجود داشتند
    sqlpackage /action:publish /sourcefile:"C:\extracted.dacpac" /targetconnectionstring:"<target connection string>" /p:AllowIncompatiblePlatform=true /p:ExcludeObjectTypes=Logins;Users
  

ابزار SqlPackage با روش‌های احراز هویت یکپارچه (Integrated)، احراز هویت SQL و احراز هویت Microsoft Entra ID کار می‌کند. در نتیجه، رشته اتصال (connection string) شما ممکن است شامل «Authentication=Active Directory Interactive» برای احراز هویت مبتنی بر مرورگر یا «Authentication=Active Directory Default» برای استفاده از احراز هویت ترمینال به همراه یک دستور قبلی «az login» باشد.

خلاصه

رایج‌ترین توصیف فایل‌های bacpac و dacpac این است که یک فایل bacpac حاوی داده است و یک فایل dacpac داده‌ای ندارد، اما این یک گزاره کامل نیست. به‌طور پیش‌فرض، یک فایل bacpac حاوی داده است و اشیاء موجود در پایگاه داده باید با پایگاه داده Azure SQL سازگار باشند، در حالی که فرمت فایل dacpac برای استقرارهای پایگاه داده عالی است و گزینه‌ای برای گنجاندن کپی داده‌ها دارد.

مروری بر عملیات‌های SqlPackage که فایل‌های bacpac و dacpac را ایجاد می‌کنند:

  • Export (استخراج): یک فایل bacpac حاوی ساختار/مدل پایگاه داده و داده‌ها ایجاد می‌کند. عمدتاً برای جابه‌جایی یا آرشیو کردن محتوای منطقی پایگاه داده هنگام تعامل با پایگاه داده Azure SQL استفاده می‌شود.
  • Extract (استخراج ساختار): یک فایل dacpac حاوی ساختار/مدل پایگاه داده (جداول، نماها، رویه‌ها و غیره) ایجاد می‌کند. برای استقرار ساختار، مقایسه و مدیریت نسخه‌ها استفاده می‌شود.
  • Extract با گزینه Table Data: یک فایل dacpac حاوی ساختار/مدل پایگاه داده و داده‌ها ایجاد می‌کند. برای جابه‌جایی یا آرشیو کردن محتوای منطقی پایگاه داده استفاده می‌شود.

فایل‌های Bacpac به‌شدت با پایگاه داده Azure SQL یکپارچه شده‌اند و قابلیت‌های وارد کردن/استخراج آن‌ها از طریق پورتال Azure، خط فرمان az CLI و دستورات (cmdlets) Azure PowerShell ارائه می‌شود. هر دو نوع فایل bacpac و dacpac در ابزارهای SSMS، VS Code و SqlPackage CLI پشتیبانی می‌شوند.

نظر مهندس بهمن آبادی: فایل‌های DACPAC بر خلاف تصور رایج، با قابلیت گنجاندن داده‌ها و پشتیبانی از پلتفرم‌های متنوع، ابزاری بسیار منعطف‌تر از BACPAC برای مهاجرت‌های پیچیده پایگاه داده هستند. به عنوان یک طراح، شناخت تفاوت ساختاری این دو فرمت در ابزار SqlPackage به شما کمک می‌کند تا محدودیت‌های انتقال به Azure SQL را دور بزنید و استپ‌های استقرار را بهینه‌تر مدیریت کنید.

منبع: https://devblogs.microsoft.com/azure-sql/bacpac-and-dacpac-the-similarities-and-differences