BACPAC ve DACPAC: Benzerlikler ve Temel Farklar
SQL veritabanınızı bir ortamdan diğerine taşımak ya da yalnızca şema nesnelerini aktarmak istediğinizde sık karşılaşılan iki dosya biçimi vardır: BACPAC ve DACPAC. İkisi de başta SqlPackage olmak üzere birçok araç tarafından destekleniyor, ama amaçları, kapsamları ve esneklikleri birbirinden farklı. Bu yazıda, iki formatın gerçekte neyi çözdüğünü ve hangi senaryoda hangisinin işe yaradığını kaynak makale çerçevesinde ele alıyoruz.
Kısaca: BACPAC, öncelikle Azure SQL Database yüzey alanıyla sınırlı bir modele sahiptir, şema ve veriyi birlikte taşıyabilen taşınabilir bir kopyadır. DACPAC ise temelde bir dağıtım (deployment) artefaktıdır; daha geniş hedef platform modellerini destekler ve isteğe bağlı olarak veri de içerebilir.
BACPAC: Azure SQL Database için taşınabilirlik
BACPAC dosyaları çoğu kullanıcı için export ve import işlemleriyle özdeşleşmiştir. Bu işlemler, veritabanı nesnelerini ve verilerini farklı SQL sürümleri arasında (Azure’dan SQL Server’a ya da eski SQL Server sürümlerine geri dönüş dahil) taşımayı mümkün kılar. Bu davranış, yalnızca eşit veya daha üst sürümlere geri yüklenebilen native yedek (BAK) dosyalarından belirgin biçimde ayrılır. Import ve export işlevine SQL Server Management Studio (SSMS), VS Code, Azure Portal ve komut satırında SqlPackage üzerinden ulaşılabilir.
BACPAC esnek bir veri taşıma biçimidir, ama bu esnekliğin bedeli hız kaybıdır. Bir BACPAC export veya import işlemi, native SQL Server yedekleme/geri yükleme operasyonlarına göre genellikle daha yavaş çalışır. Sebep, yaklaşımın farklı olması: BACPAC işlemleri şemayı ve tablo verilerini mantıksal olarak çıkarıp yeniden oluştururken, native backup/restore işlemleri veritabanı sayfalarını ve log kayıtlarını SQL Server’ın optimize edilmiş yedek formatında kopyalar. Azure SQL Database’de dosya seviyesindeki yedekler servisin bir parçası olarak yönetilir; SQL Server tarafında ise bu sorumluluk sizde veya DBA’inizde.
BACPAC’in içinde ne var?
Bir BACPAC dosyası hem nesne tanımlarını hem de tablolardaki verinin bir kopyasını içerir. Uzantısını .zip olarak değiştirip klasöre çıkardığınızda içeriği görebilirsiniz. Paket içinde nesne yapısını tanımlayan bir model.xml dosyası ve BCP dosyalarının bulunduğu bir data klasörü yer alır. Bu BCP dosyaları export sırasında yazılır, import sırasında ise bulk insert işlemiyle hedef veritabanına aktarılır.
Uyumluluk kısıtı
BACPAC üzerinden veri taşınabilirliği, dosyanın Azure SQL Database’e import edilebileceğini garanti etmeye odaklıdır. Bunun doğal sonucu olarak BACPAC yalnızca Azure SQL Database’de kullanılabilecek nesneleri barındırabilir. Windows login’leri, filestream sütunları veya SQL CLR öğeleri gibi Azure SQL Database’in desteklemediği unsurlara sahip bir SQL Server veritabanından BACPAC oluşturulamaz.
Bu tür engellerle karşılaşırsanız bir seçenek, veritabanının bir kopyasını alıp desteklenmeyen nesneleri kaldırmak. Ama hedefiniz Azure SQL Database değilse bu kısıtlamalar sizin için anlamlı olmayabilir. DACPAC formatının yetenekleri burada devreye giriyor.
DACPAC: dağıtım artefaktı ve ötesi
DACPAC dosyaları çoğunlukla veritabanı dağıtımlarıyla anılır. Bir SQL projesi build ettiğinizde çıktı bir DACPAC dosyasıdır, ama DACPAC mevcut bir veritabanından doğrudan extract edilerek de üretilebilir. DACPAC, veritabanının şema tanımını ya da modelini içerir. DACPAC araçları bu modeli kullanarak bir dağıtım planı üretir; bu plan T-SQL script olarak çıkarılabilir ya da doğrudan uygulanabilir (publish).
Yeni bir veritabanı için dağıtım planı tüm nesneleri sıfırdan oluşturur. Var olan bir veritabanı içinse plan, mevcut nesnelerin DACPAC’teki tanıma uyacak biçimde nasıl güncelleneceğini belirler.
Publish ve script seçenekleri
Publish ve script operasyonları, üretilen dağıtım planını özelleştirmek ve analiz etmek için pek çok seçenek sunar:
- GenerateSmartDefaults: Var olan satırların bulunduğu bir tabloya nullable olmayan bir sütun eklenirken varsayılan değer eklenmesini sağlar. Plan davranışını özelleştiren bir örnektir.
- AllowTableRecreation: Dağıtım planının bir tablodaki veriyi yeni bir konuma kopyalayıp kopyalamayacağını denetler ve buna göre işlemi durdurabilir ya da devam ettirebilir. Bu da planı analiz eden bir örnektir.
Bu dinamik yapı sayesinde DACPAC dosyaları basit uygulamalardan binlerce veritabanı barındıran çok kiracılı SaaS senaryolarına kadar geniş bir yelpazede kullanılabilir.
Extract sırasında veri seçenekleri
Bir extract işlemiyle üretilen DACPAC, varsayılan olarak veritabanındaki tüm nesne tanımlarını içerir ve bu nesneler SQL Server, Azure SQL Database, Fabric’te SQL database gibi farklı hedef platformlara ait olabilir. Extract işlemi şu yönlerde de değiştirilebilir:
- DACPAC’ten sunucu kapsamlı (server-scoped) öğeleri hariç tutmak
- Tablo verilerini doğrudan DACPAC içine dahil etmek (BACPAC’e benzer biçimde)
- Tablo verilerini Azure Blob Storage üzerinde parquet dosyaları olarak çıkarmak
Verinin DACPAC dosyasına ya da yanına dahil edilebilmesi, Azure SQL Database uyumluluğu şartının engel oluşturduğu senaryolarda da taşınabilirlik sağlar. DACPAC publish ve extract işlemleri çoğu araçta mevcut olsa da bu ileri yetenekleri kullanmak için genellikle SqlPackage CLI gerekir.
DACPAC ile taşınabilirlik: pratik akış
Aşağıda SqlPackage CLI’daki extract ve publish komutlarını kullanarak bir veritabanı kopyasını bir sunucudan diğerine DACPAC üzerinden taşımanın kısa bir akışı var. BACPAC’in export/import ikilisiyle benzer bir işlem olsa da DACPAC oluşturulduğunda içeriğin Azure SQL Database’e import edilmeye hazır olduğunun garantisi yoktur.
Extract adımı: Orijinal veritabanının veri kopyasını da içeren bir DACPAC oluşturmak için /p:ExtractAllTableData=true ve isteğe bağlı olarak /p:ExtractReferencedServerScopedElements=false eklenir.
sqlpackage /action:extract /sourceconnectionstring:"<sourceconnectionstring>" /targetfile:"C:\extracted.dacpac" /p:ExtractAllTableData=true /p:ExtractReferencedServerScopedElements=false
Publish adımı: DACPAC içindeki veri, publish sırasında varsayılan olarak hedef veritabanına yazılır. Standart publish akışını değiştirmek için şu özellikler eklenebilir:
- Farklı veritabanı türleri arasında geçiş için:
/p:AllowIncompatiblePlatform=true - SQL Server’daki Windows login’lerini Azure SQL Database’e taşırken atlamak için:
/p:ExcludeObjectTypes=Logins;Users
sqlpackage /action:publish /sourcefile:"C:\extracted.dacpac" /targetconnectionstring:"<targetconnectionstring>" /p:AllowIncompatiblePlatform=true /p:ExcludeObjectTypes=Logins;Users
SqlPackage; Integrated authentication, SQL authentication ve Microsoft Entra ID kimlik doğrulama yöntemlerini destekler. Bağlantı dizesine tarayıcı üzerinden kimlik doğrulama için Authentication=Active Directory Interactive, öncesinde az login komutu çalıştırılarak terminal kimlik doğrulaması için Authentication=Active Directory Default ekleyebilirsiniz.
Özet: BACPAC ve DACPAC ne zaman?
Yaygın bir tanım olarak “BACPAC veri içerir, DACPAC içermez” cümlesi eksik kalıyor. Doğrusu şu: BACPAC varsayılan olarak veri içerir ve içindeki nesneler Azure SQL Database ile uyumlu olmak zorundadır. DACPAC ise veritabanı dağıtımlarında öne çıkan bir formattır ve isteğe bağlı olarak veri kopyası da barındırabilir.
SqlPackage operasyonları açısından:
- Export: Veritabanı şeması/modeli ve veriyi içeren bir BACPAC üretir. Ağırlıklı olarak Azure SQL Database ile etkileşimde bir veritabanının mantıksal içeriğini taşımak veya arşivlemek için kullanılır.
- Extract: Tablolar, view’lar, prosedürler gibi şemayı/modeli içeren bir DACPAC üretir. Şema dağıtımı, karşılaştırma ve sürüm yönetimi için kullanılır.
- Extract (Table Data seçeneğiyle): Şemayı/modeli ve veriyi içeren bir DACPAC üretir. Bir veritabanının mantıksal içeriğini taşımak veya arşivlemek için kullanılır.
BACPAC dosyaları Azure SQL Database ile sıkı biçimde entegredir; import/export yetenekleri Azure Portal, az CLI ve Azure PowerShell cmdlet’leri üzerinden sunulur. Hem BACPAC hem DACPAC dosyaları SSMS, VS Code ve SqlPackage CLI tarafından desteklenir.
Kaynaklar ve İleri Okuma
- Bacpac and Dacpac, the similarities and differences – Azure SQL Dev Corner (Drew Skwiers-Koballa)
- SqlPackage CLI Referansı
- Azure SQL Dev Blog







4 comments