Jag har säkerhetskopierat mina SQL Server 2014 Express-databaser för import till andra servrar och märkt en skillnad i filstorlek mellan .bacpac
och .bak
.
Varför är en .bacpac
-fil så liten jämfört med en .bak
fil i samma databas?
Tack för alla insikter!
Svar
A
-
.bacpac
file = Schema + Data. Observera att data är BCP” redigeras med Native-format (inte läsbar av Human).-
Du kan byta namn på
.bacpac
till.zip
för att se faktiskt innehåll. -
Du kan använda
...DAC\bin\sqlpackage.exe
för att extrahera.bacpac
innehåll programmatiskt. -
Det är en ögonblicksbild som inkluderar användardata + schema från SQL Server eller Azure SQL Database.
-
–
- Backup (har vanligtvis
.bak
förlängning) = En FULL databasbackup innehåller en fullständig kopia av databasen och ger en enda tidpunkt som databasen kan återställas till. En fullständig säkerhetskopia innehåller några transaktionsloggsposter så att den återställda komponenten (databas, fil eller filgrupp) kan göras transaktionskonsistent.
En BACPAC
är inte en ersättning för en FULL backup. Det är bara en ögonblicksbild som kan användas för att flytta en databas från en server till en annan (eller till molnet) och arkivering av en befintlig databas i ett öppet format .
Från mitt test nedan är resultaten
Kommentarer
- Loggfilen är förmodligen den största orsaken till storleksskillnaden.
- Jag ' antar att det ' saknas heller någon indexdata i .bacpac, vilket sannolikt kommer att vara en STOR bidragsgivare till filstorlek.
Svar
En säkerhetskopia skapad via BACKUP DATABASE
-kommando (.bak
) är en sida-för-sida-kopia av en databas. Observera att SQL Server-databasen inte bara innehåller datasidor. Det finns också sidor med index som kan vara stora. Mer information här
En säkerhetskopia skapad med Export Data-Tier-applikationen (.bacpac
) operation är helt enkelt en exporterad rad från en databas i XML-format placerad i ett arkiv. Du kan visa innehållet i BACPAC manuellt, ändra bara filtillägget till .zip.
Storleken på .bacpac
-filen är direkt proportionell mot antalet poster i en databas (med hänsyn till kompressionsförhållandet).
Storleken på .bak
-filen beror inte bara på data utan även på indexens storlek.
Ibland kan detta vara ett problem, kolla till exempel den här gamla diskussion
Därför är .bacpac
filen är vanligtvis mindre i storlek.
Jag körde de enklaste testerna med AdventureWorks och fick dessa resultat.
AdventureWorks.bacpac - 17 mb AdventureWorks.bacpac.zip - 16 mb AdventureWorks_with_compression.bak - 49 mb AdventureWorks_with_compression.bak.zip - 47 mb
Ska jag använda .bacpac för att minska min backupstorlek?
Nej.
Export \ Import Data Tier Application har flera betydande nackdelar som är kritiska för stora databaser:
- Detta är inte en transaktionskonsistent åtgärd. Tabellerna exporteras sekventiellt. Det kan finnas ett problem med den främmande nyckeln. Detta är dubbelt så dåligt eftersom du först upptäcker det när du försöker återhämta dig. Därför måste du ta en ögonblicksbild av databasen och exportera ögonblicksbilden när du utför den här åtgärden.
- Det tar mycket längre tid för både export och import. I det ögonblick när du omedelbart behöver köra en återställning kommer du inte att kunna göra detta eftersom återställningen från .bacpac tar flera timmar att slutföra.
- Export kan ladda servern avsevärt, särskilt för stora tabeller, som tillsammans med föregående punkt gör regelbundna säkerhetskopior till ett tvivelaktigt beslut.
Klassisk säkerhetskopia som skapats med kommandot BACKUP DATABASE
saknar dessa nackdelar, för att spara utrymme använder Återställning av punkt i tid
Export \ Importera datatillämpningsprogram kan ses som ett sätt att skapa en säkerhetskopia endast för små databaser, i de fall du inte har tillgång till filsystemet. I det här fallet ska du inte exportera den levande databasen under några omständigheter, se till att skapa en ögonblicksbild för konsekvent export.
Svar
Tja, den största skillnaden är att data komprimeras (med hjälp av zip) för .bacpac
-filen vilket inte är fallet med en normal .bak
fil. Komprimera bara .bak
-filen och se att den är mycket mindre;)