web-dev-qa-db-fra.com

Comment importer un fichier BACPAC dans Azure SQL et remplacer la base de données existante?

Supposons que j'ai une base de données locale nommée MyDatabase. Je souhaite le déplacer vers Azure SQL et remplacer une base de données existante qui y réside actuellement nommée MyDatabase. Je sais comment créer un fichier BACPAC localement. Je sais comment importer le BACPAC dans mon compte de stockage Azure. Cependant, une fois que le BACPAC est dans le stockage Azure, je ne connais pas le moyen préféré d'écraser la base de données MyDatabase existante avec la copie dans le stockage. Je pourrais importer le fichier BACPAC et créer une deuxième base de données, puis supprimer la première et renommer la base de données qui vient d'être importée. Cependant, est-ce la meilleure ou la meilleure façon de procéder?

4
Randy Minder

Vous avez raison. Dans Azure, vous ne pouvez pas restaurer sur une base de données existante.

  • Vous devez restaurer avec un nom différent.
  • Supprimer l'ancienne base de données
  • Renommez le nouveau en ancien nom de base de données.

Vous avez plusieurs façons de restaurer à partir du fichier .BACPAC.

  1. Vous pouvez le faire directement depuis votre emplacement .BACPAC sur site en utilisant .\sqlpackage.exe outil de ligne de commande.

    .\sqlpackage.exe/a: Importer /sf:C:\filename.bacpac /tsn:ServerName.database.windows.net/tdn: destinationDBName `/ tu: adminaccountName @ serverName/tp: $ credentialPW

  2. Vous pouvez également utiliser la copie que vous avez téléchargée dans votre compte de stockage.

    $ ResourceGroupName = "RGName" $ ​​ServerName = 'ServerName' $ DatabaseName = "DestinationDBName"

    $ StorageName = "StorageAccountName" $ ​​StorageKeyType = "StorageAccessKey" $ StorageUri = "http: //$StorageName.blob.core.windows.net/swwstoragecontainer/BackpacFileName.bacpac" $ StorageKey = "********* ************************** "

    $ credential = Get-Credential

    $ importRequest = New-AzureRmSqlDatabaseImport -ResourceGroupName $ ResourceGroupName -ServerName $ ServerName -DatabaseName $DatabaseName -StorageKeytype $StorageKeyType -StorageKey $StorageKey -StorageUri $ StorageUri -AdministratorLogin $ credential.UserName -AdministratorLoginPassword $ credential.Password `-Edition Standard -ServiceObjectiveName S0 -DatabaseMaxSizeBytes 50000

    Get-AzureRmSqlDatabaseImportExportStatus -OperationStatusLink $ importRequest.OperationStatusLink

  3. Dans le portail, vous pouvez importer directement le .BACPAC fichier dans votre serveur en tant que base de données.

8
SqlWorldWide

Dans Azure, vous ne pouvez pas restaurer sur une base de données existante. (c)

Apparemment, pas vraiment. Vous POUVEZ restaurer un fichier .bacpac dans une base de données Azure SQL existante, par exemple, dans le cas où vous avez vraiment besoin de conserver la même instance de la base de données Azure SQL, car il est incorporé dans l'environnement Azure. Une condition nécessaire pour cela est: la base de données cible doit être vide, c'est-à-dire comme juste créée comme nouvelle. Mais si vous avez déjà une base de données cible, qui n'est pas vide (bien sûr!), Vous pouvez "nettoyer" la base de données, en exécutant le script suivant dans son contexte, en étant connecté en tant que superutilisateur:

DECLARE @sql NVARCHAR(2000)

WHILE EXISTS(SELECT TOP(1) * FROM SYS.TRIGGERS WHERE is_ms_shipped = 0)
BEGIN
    SELECT TOP(1) @sql = 'DROP TRIGGER IF EXISTS [' + [name] + '] ON ' + parent_class_desc COLLATE database_default --SQL_Latin1_General_CP1_CI_AS
    FROM SYS.TRIGGERS
    WHERE is_ms_shipped = 0
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE')
BEGIN
    SELECT TOP(1) @sql = 'DROP PROCEDURE IF EXISTS [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']'
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'PROCEDURE'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION')
BEGIN
    SELECT TOP(1) @sql = 'DROP FUNCTION IF EXISTS [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']'
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'FUNCTION'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY')
BEGIN
    SELECT TOP(1) @sql = 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA != 'sys')
BEGIN
    SELECT TOP(1) @sql = 'DROP VIEW [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA != 'sys'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory')
BEGIN
    SELECT TOP(1) @sql = 'DROP TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory'
    PRINT @sql
    EXEC (@sql)
END

--SELECT * FROM SYS.TYPES WHERE is_user_defined = 1
--SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory'
--SELECT * FROM SYS.TRIGGERS WHERE is_ms_shipped = 0
--DROP TRIGGER IF EXISTS [backup_objects] ON DATABASE

Les 4 dernières déclarations sont facultatives. Les 3 premiers sont pour la vérification/visualisation de certains paramètres, et le dernier est utilisé pour supprimer un déclencheur spécifique au niveau de la base de données s'il existe.

Après cela, vous pouvez restaurer le fichier .bacpac que vous avez dans la base de données cible à l'aide de l'utilitaire sqlpackage.exe standard, en l'exécutant dans la fenêtre de ligne de commande avec élévation des privilèges administratifs, comme ceci:

“C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin\sqlpackage.exe” /a:Import /sf:"C:\Users\[username1]\Documents\SQL Server Management Studio\DAC Packages\[SourceDBName.bacpac]" /tsn:[azureSQLServerName].database.windows.net /tdn:[TargetAzureSQLDBName] /tu:[DBAdminLogin] /tp:[DBAdminPassword]

Remplacez simplement [braced_values] par de vrais, et cela devrait fonctionner. Lors de l'exécution, l'utilitaire peut afficher un message d'avertissement, affiché avec une couleur jaune, comme ceci:

Initialisation du déploiement L'objet [data_0] existe dans la cible, mais il ne sera pas supprimé même si vous avez coché la case "Générer des instructions de suppression pour les objets qui se trouvent dans la base de données cible mais qui ne sont pas dans la source". L'objet [log] existe dans la cible, mais il ne sera pas supprimé même si vous avez sélectionné la case à cocher "Générer des instructions de suppression pour les objets qui se trouvent dans la base de données cible mais qui ne se trouvent pas dans la source".

Vous pouvez simplement l'ignorer. Selon la taille et la complexité de la base de données, le processus de restauration peut prendre beaucoup de temps, alors assurez-vous d'attendre qu'il se termine, en affichant le message: Base de données importée avec succès.

J'espère que cela pourra aider.

0
Tumnin