Création du Bacpac par une invite de commande
Description
Cause
Resolution

Création du Bacpac par une invite de commande

Une anomalie de Microsoft SQL Server Management Studio peut engendrer un message d'erreur lors de l'export du Bacpac : "Erreur de type : System.OutOfMemory"
Ce cas peut se produire dès que la taille en mémoire dépasse 2Go. Plus le nombre de sociétés intégrées dans la base SQL est important, plus le risque de rencontrer l'erreur est élevé.(limitation lié au 32bits) 

Afin de contourner ce cas, il est possible d'utiliser une commande qui va permettre de générer le Bacpac en utilisant un fichier physique pour gérer la mémoire pendant le traitement.

Il convient d'utiliser la commande suivante :
"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe" /a:Export /ssn:NomServer\Instance /sdn:NomBaseSQL /p:Storage=File /tf:C:\SQL\*.bacpac
pause

 MISE EN GARDE: Extension .bacpac à renseigner en minuscule

Les paramètres à modifier sont les suivants :
/ssn : renseigner le nom de l'instance SQL
/sdn : renseigner le nom de la base de données SQL
/tf : renseigner le chemin et le nom du fichier Bacpac à générer

De même SQL Serveur via SQL Managment Studio et SQLPackage via Windows imposent plusieurs paramètres afin de gérer les temps d’exécution des requêtes afin d’éviter les requêtes trop longues.

Ainsi si le schéma de la base de données est trop complexe, le délai accordé pour les échanges entre SQLPackage et SQL Server peut dépasser le délai autorisé ce qui induit une rupture des échanges

Le paramètres : /p :CommandTimeout répond à ce type de problématique en permettant d’augmenter voir de désactiver (avec la valeur 0) le délai de réponse à des requêtes ainsi le script précédent se vois ajouter le paramètre comme suivant :

"C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\sqlpackage.exe" /a:Export /ssn:NomServer\Instance /sdn:NomBaseSQL /p:Storage=File /p:CommandTimeout=0 /tf:C:\SQL\*.bacpac
pause

--- Mise à jour décembre 2017 ---

Lors de l'exécution de la tâche, il est possible de rencontrer l'erreur suivante :

*** Erreur lors de l'exportation de la base de données : un ou plusieurs éléments non pris en charge ont été trouvés dans le schéma utilisé dans le cadre d'un package de données.
Error SQL71564 : La table Table:[cbase].[keys] ne possède pas d'index cluster. Les index cluster sont nécessaires à l'insertion de données dans cette version de SQL Server.

Ce message est lié à la version de SQL Server 2012 utilisée. La commande exécute sqlpackage installé dans le répertoire 110\DAC. Il faut utiliser une version installée dans le répertoire 130\DAC (objets DAC pour SQL 2016).

En effet, SQL Azure est en version 2016. Le programme sqlpackage.exe nécessite l’installation de Microsoft SQL Server Data-Tier Application Framework (16.4 minimum) qui correspond aux objets pour SQL 2014-2016.

2 solutions :

  1. Installer et utiliser SQL Server 2014 minimum / fonction Tâches / Exporter une application de la couche Données …
  2. Télécharger Microsoft SQL Server Data-Tier Application Framework (16.4 minimum) ci-après pour exécuter sqlpackage en ligne de commande : https://www.microsoft.com/en-us/download/details.aspx?id=53876

La commande sera alors :

"C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin\sqlpackage.exe" /a:Export /ssn:NomServer\Instance /sdn:NomBaseSQL /p:Storage=File /tf:C:\SQL\*.bacpac
pause

 REMARQUE: En cas d'installation d'une instance SQL 64 bits, sqlpackage.exe se trouve dans le répertoire : C:\Program Files\Microsoft SQL Server\130\DAC\bin\ 

Steps to duplicate
Related Solutions