用于导出Azure SQL数据库的SQLPackage工具

444 阅读6分钟

Azure SQL数据库不支持本地数据库备份。因此,你不能用它来从Azure云中转移到企业内部的SQL Server。你可以使用数据层应用BACPAC文件格式,从Azure数据库导出数据库模式和数据。这个BACPAC文件有助于在Azure SQL数据库、托管实例和企业内部的SQL Server上进行部署。

要使用BACPAC格式文件导出和导入数据库,可以使用SQL Server Management Studio(SSMS)图形化向导。

假设你有一个生产的Azure SQL数据库,你想定期导出为BACPAC格式,并导入到SQL实例(on-prem)。有什么方法可以做到这一点吗?

同样,假设我们使用Linux或macOS,你不能安装SQL Server Management Studio?在这种情况下,我们如何导出或导入数据库?

本文探讨了用于导出Azure数据库的SQLPackage工具,回答了上面提出的两个问题。

SQLPackage工具介绍

Sqlpackage工具是一个灵活的选择,可以将Azure SQL数据库导出到BACPAC文件中。这个工具可与SQL Server Management Studio(SSMS)、Visual Studio的SQL Server Data Tools(SSDT)一起使用,我们也可以使用微软的下载中心单独下载它。最新的SqlPackage版本是18.8,于2021年10月4日发布。

<SQLPackage Utility

我在我的系统上使用MSI安装程序在Windows上安装了最新的SQLPackage工具。你可以导航到已安装的SqlPackage.exe,并使用命令/version确认版本。

SQLPackage version

注意:你也应该把最新的SqlPackage工具作为一个单独的安装程序来安装。SSMS使用的是32位版本,因此,你可以安装64位以满足更高的内存需求。

在Linux上安装SqlPackage工具

如前所述,我们也可以在Linux上下载Sqlpackage工具。要安装它,请使用以下步骤。

  • 下载SqlPackage工具的Linux存档
  • 启动终端并运行以下脚本。
$ cd ~
$ mkdir sqlpackage
$ unzip ~/Downloads/sqlpackage-linux-<version string>.zip -d ~/sqlpackage 
$ echo "export PATH=\"\$PATH:$HOME/sqlpackage\"" >> ~/.bashrc
$ chmod a+x ~/sqlpackage/sqlpackage
$ source ~/.bashrc
$ sqlpackage

使用SqlPackage工具导出Azure SQL数据库

要使用SqlPackage工具导出Azure数据库,我们需要以下参数的值。

  • /Action或/a:它指的是你想使用SqlPackage工具执行的操作。为数据库导出指定值Export。
  • /SourceServerName或/ssn:它是指Azure SQL服务器名称(FQDN)。你可以使用Azure门户网站的SQL数据库仪表板获得Azure服务器FQDN。它的后缀是.database.windows.net。
  • /SourceDatabaseName或/sdn:指定你希望导出为BACPAC格式的Azure数据库。
  • /SourceUser或/su:我们将使用SQL认证来连接Azure数据库。因此,用这个参数指定用户名。
  • /SourcePassword或/sp:我们需要用/su参数来指定用户定义的密码。
  • /TargetFile:在这个参数中,我们指定目标文件和它的本地目录路径。例如,C:\Temp\database.dacpac
  • /p:在这个参数中,指定模式模型的备份存储类型。对于出口,指定值Storage=File

注意: 默认情况下,SqlPackage工具会以BACPAC格式导出Azure数据库的所有表。

转到 "开始 "并启动命令提示符,运行以下脚本进行数据库导出。

>sqlpackage.exe /a:Export /ssn:tcp:azuredemosqldemo.database.windows.net /sdn:azuredemosql /su:sqladmin /sp:India@123 /tf:C:\Temp\azuredemosql.bacpac /p:Storage=File

SqlPackage验证并将数据导出为BACPAC格式。它为各个表打印日志信息,以便你能跟踪导出过程。我的Azure SQL数据库中只有一个表[dbo].[BillingInfo]。因此,它打印的消息是 - 处理表[dbo].[BillingInfo]。

导出数据库的时间取决于表的数量、其记录数、网络带宽。

Export Azure SQL Database

你可以浏览本地目录,查看文件.BACPAC扩展名,如下图所示。

BACPAC file

在企业内部的SQL服务器实例中导入Azure SQL数据库BACPAC

一旦我们有了Azure数据库的BACPAC导出,我们也可以使用SqlPackage工具导入它。该脚本需要做一些改动,如下所示。

  • /Action:指定关键字 IMPORT 用于从BACPAC文件导入数据库
  • /TargetServerName或/tsn:它定义了我们要导入BACPAC文件的SQL实例名称。
  • /TargetDatabaseName或/tdn:使用这个参数指定目标数据库的名称。你不需要在导入操作之前创建这个数据库。SqlPackage工具会在目标SQL实例上创建它,并将数据导入其中。 在这个例子中,我指定了值--导入
  • /TargetUser或/tu:它定义了目标SQL实例的SQL认证用户。
  • /TargetPassword:它定义了SQL认证用户的密码。
  • /SourceFile或/sf:它指定了数据库导入的源BACPAC文件位置。

在命令提示符下执行以下脚本,并查看数据库导入的进度。

>sqlpackage.exe /Action:Import /tsn:WIN-CDKN1T5F5EG /tdn:Import /tu:sa /tp:India@123 /sf:C:\Temp\azuredemosql.bacpac

在导入操作中,它执行了以下步骤。

  • 创建一个部署计划
  • 将软件包模式导入数据库
  • 禁用索引
  • 导入数据
  • 启用索引

Import database

连接到目标SQL实例,我们有一个在连接字符串中指定的数据库导入。展开表,它有一个表[dbo].[BillingInfo],如下图所示。

Verify object

使用SqlPackage工具自动备份导入和导出过程

假设你需要频繁地将Azure SQL数据库导出并导入到本地(on-prem)SQL Server实例中。如果我们使用SSMS控制台或SqlPackage工具手动进行,这将不是对重复性工作的最佳利用。SQL Server代理可以帮助你自动完成整个数据库导入操作,并在本地SQL实例上配置工作。

在SSMS中连接到目标SQL实例,展开SQL Server Agent,右键点击Jobs,并创建一个新的作业。

  • 在常规页面上,为SQL Server作业指定一个名称,并添加一个可选的描述。

Create a SQL Server Agent Job

  • 点击步骤,添加一个新的工作步骤。在新的工作步骤中,指定一个名称,并指定类型 - 操作系统(CmdExec)。

Job step and type

在命令部分,输入SqlPackage脚本以创建Azure数据库的导出。你指定SqlPackage工具的完整路径,你也可以将路径添加到环境变量中,避免Sqlpackage的完整路径。

>C:\Program Files\Microsoft SQL Server\150\DAC\bin\sqlpackage.exe /a:Export /ssn:tcp:azuredemosqldemo.database.windows.net /sdn:azuredemosql /su:sqladmin /sp:India@123 /tf:C:\Temp\azuredemosql.bacpac /p:Storage=File

Operating system CMDEXEC

为了捕捉工作步骤的执行细节,点击高级,并添加一个输出文件。

Advanced job configuration

点击并添加一个新的步骤,放弃现有的数据库。之前,我们将BACPAC文件导入到导入数据库中。因此,在第2步中,我们用以下脚本放弃Import数据库 -

丢弃导入数据库

第2步使用Transact-SQL脚本(T-SQL)类型来执行SQL脚本。

Drop database

在下一步,我们将把BACPAC文件导入到一个内部的SQL数据库中。对于这一步,我们也需要类型-操作系统(CmdExec)。

C:\Program Files\Microsoft SQL Server\150\DAC\bin\sqlpackage.exe /Action:Import /tsn:WIN-CDKN1T5F5EG /tdn:Import /tu:sa /tp:India@123 /sf:C:\Temp\azuredemosql.bacpac

New job step

在高级部分添加一个输出文件,也是为了捕获导入执行日志。

Output file

SQL代理工作的配置有以下工作步骤。

  1. 导出Azure SQL DB
  2. 放下导入的数据库
  3. 导入BACPAC

Configured SQL Job

你可以添加一个时间表,在固定的时间表上运行SQL代理工作。现在,让我们手动运行它,并验证Azure SQL数据库导出和导入到on-prem SQL实例。

Job status

现在,查看导出和导入操作步骤输出,以验证预期结果。如下图所示,我们在两个日志文件中都没有任何错误信息。

Job progress for export

Job progress for import

连接到SQL数据库,验证表和记录数。

Check table counts

总结

本文探讨了SqlPackage工具,用于自动将Azure SQL数据库导出和导入到企业内部的SQL实例。SqlPackage工具可以在Windows、Linux和macOS上使用,并提供额外的配置,如超时、并行、AD认证。