Reputation: 2509
While working in MVC/ C# with Azure I need to restore database from a .bacpac file which is stored in blob storage. I m using DAC Framework API to access .bacpac from Blob storage.
Issue:
DacServices.ImportBacpac
requires .bacpac file, I am able to refer blob file (which is a .bacpac) but it comes as a blob and not as a .bacpac file. I m not sure how to convert a blob to a .bacpac. Can you please guide me some way or API to do that conversion ?
Later I will use this file to import backpac to SQL Server Azure.
Thanks for your time and help.
Upvotes: 1
Views: 1913
Reputation: 1091
About 10 years later:
In 2024, I would recommend using the Azure CLI and the script found on this page: https://learn.microsoft.com/en-us/azure/azure-sql/database/scripts/import-from-bacpac-cli?view=azuresql
The main idea is to use the "az sql db import" command. The script does a lot of other things that can be instructive, like taking a .bacpac file from a git repo, uploading it to a blob, creating an Azure SQL Server, etc. You can comment out those lines as needed.
I saved this script as a bash script (with a .sh extension) and run it on Windows 11.
# Import a BACPAC file into a database in SQL Database
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
location="East US"
resourceGroup="msdocs-azuresql-rg-$randomIdentifier"
tag="import-from-bacpac"
server="msdocs-azuresql-server-$randomIdentifier"
database="msdocsazuresqldb$randomIdentifier"
login="azureuser"
password="Pa$$w0rD-$randomIdentifier"
storage="msdocsazuresql$randomIdentifier"
container="msdocs-azuresql-container-$randomIdentifier"
bacpac="sample.bacpac"
echo "Using resource group $resourceGroup with login: $login, password: $password..."
echo "Creating $resourceGroup in $location..."
az group create --name $resourceGroup --location "$location" --tags $tag
echo "Creating $storage..."
az storage account create --name $storage --resource-group $resourceGroup --location "$location" --sku Standard_LRS
echo "Creating $container on $storage..."
key=$(az storage account keys list --account-name $storage --resource-group $resourceGroup -o json --query [0].value | tr -d '"')
az storage container create --name $container --account-key $key --account-name $storage #--public-access container
echo "Downloading sample database..."
az rest --uri https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Standard.bacpac --output-file $bacpac -m get --skip-authorization-header
echo "Uploading sample database to $container..."
az storage blob upload --container-name $container --file $bacpac --name $bacpac --account-key $key --account-name $storage
echo "Creating $server in $location..."
az sql server create --name $server --resource-group $resourceGroup --location "$location" --admin-user $login --admin-password $password
az sql server firewall-rule create --resource-group $resourceGroup --server $server --name AllowAzureServices --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0
echo "Creating $database..."
az sql db create --name $database --resource-group $resourceGroup --server $server --edition "GeneralPurpose"
echo "Importing sample database from $container to $database..."
az sql db import --admin-password $password --admin-user $login --storage-key $key --storage-key-type StorageAccessKey --storage-uri https://$storage.blob.core.windows.net/$container/$bacpac --name $database --resource-group $resourceGroup --server $server
Upvotes: 0
Reputation: 1127
The best way is probably to read the blob as a stream (CloudBlob.DownloadToStream()) and create the bacpac from said stream (BacPackage.Load()).
Upvotes: 4