在Windows Azure SQL数据库上交叉订阅复制数据库

时间:2013-07-19 12:27:01

标签: azure azure-sql-database

我们即将将Windows Azure中的测试和生产实例拆分为两个单独的订阅。目前,我们有3个位于同一订阅中的Windows Azure SQL数据库实例:

  • 生产
  • 报告
  • 测试

为了完全隔离生产,我们将这些分为:

  • 生产订阅
    • 生产
    • 报告
  • 测试订阅
    • 测试

目前,在我们对实时数据进行模糊处理之前,我们使用CREATE DATABASE X AS COPY OF [ServerName].Y命令将数据库从生产复制到测试。只要数据库地理位置在相同的数据中心中,我们就可以执行此操作,并且我们在首先创建数据库的实例之间有共享登录As indicated by this article)。

然而;该文章未指明源和目标实例是否需要属于相同订阅。我们是否能够在生产订阅和测试订阅(和vica verca)之间复制数据库,假设我们使用一致的登录?

7 个答案:

答案 0 :(得分:12)

对于任何登陆此处的人来说,即使服务器位于不同的订阅中, 似乎也可以使用CREATE DATABASE newDB AS COPY OF [server].[olddb] ( OPTION [, OPTION ...] )

Create Database (Azure SQL Database) - MSDN

了解详情

来自MS Docs的示例:

CREATE DATABASE db_copy AS COPY OF ozabzw7545.db_original ( SERVICE_OBJECTIVE = 'P2' ) ;

在我的设置中,我在两台服务器上都有相同的管理员帐户和密码(登录名) - 这可能会有所帮助。 如果您对原始服务器没有管理员权限,则操作将失败。

我通过测试发现,尽管包含“版本”选项,但我无法将版本从标准更改为高级版 - 我不确定为什么会这样。

答案 1 :(得分:10)

您可以只对Blob存储执行备份(导出),然后在新订阅中导入它。

http://msdn.microsoft.com/en-us/library/f6899710-634e-425a-969d-8db1267e9471

<强>更新: 如果你可以使用SSMS,这个答案是对的。我只想补充一些细节。

  1. 您可以将源数据库导出到Azure门户中的存储中。 enter image description here
  2. 导出后,您可以找到bacpac文件。 enter image description here
  3. 打开SSMS,然后连接到目标服务器。
  4. 右键单击节点数据库,然后选择导入数据层应用程序 enter image description here
  5. 然后,您可以选择从本地磁盘或Azure存储导入数据库。 enter image description here
  6. 之后,您已将数据库从源复制到目标。

答案 2 :(得分:8)

我想你已经有了一个解决方案,但是对于任何登陆这里的人来说,你可以使用Azure PowerShell API在源订阅中创建一个新服务器,创建一个副本并将新服务器切换到目标订阅

示例代码可在technet

上找到

代码是自我解释的,但是为了SO最佳实践,

代码的关键部分是

创建新服务器:

$newserver = New-AzureSqlDatabaseServer -Location $targetServerLocation -AdministratorLogin $targetServerLoginID -AdministratorLoginPassword $targetServerLoginPassword 

创建数据库副本:

Start-AzureSqlDatabaseCopy -ServerName $sourceServerName -DatabaseName $sourceDatabaseName -PartnerServer $newserver.ServerName  -PartnerDatabase $targetdatabaseName  

转移服务器

$uri = "https://management.core.windows.net:8443/" + $sourceSubscriptionID + "/services" + "/sqlservers/servers/" + $newserver.ServerName + "?op=ChangeSubscription" 

Invoke-RestMethod -Uri $uri -CertificateThumbPrint $certThumbprint -ContentType $contenttype -Method $method -Headers $headers -Body $body 

答案 3 :(得分:6)

我已成功创建Azure订阅中的数据库副本。 以下是步骤 -

  1. 在目标Azure订阅上创建一个数据库服务器(如果您还没有创建一个),并在其上创建一个新的数据库(任何名称,无关紧要)但具有相同的密码作为源Azure订阅的源数据库。对我而言,它并没有使用不同的密码,所以我只是继续使用相同的密码,但我确信有一种方法可以使用不同的密码。

  2. 在目标Azure中新创建的数据库上运行此命令 -

  3. 创建数据库NEWDBNAME
        同时复制[源Azure服务器名称]。[源DB]

    让Azure处理新的数据库定价层(基本,标准等),因为您可以在创建数据库后立即从门户网站更改它。在我的例子中,目标数据库是使用与源数据库相同的定价层创建的。 此外,azure中的服务器名称通常是 - NAME.database.windows.net。所以在上面的源名称中,只需输入NAME。

    1. 现在,在目标Azure订阅上,您将在新数据库服务器上拥有2个数据库。一个是在步骤1中创建的,另一个是在步骤2中创建的,它是实际的副本。您可以继续并安全地删除您不需要的那个。

    2. 如果要将其他源数据库复制到上面1中创建的同一目标服务器,只需再次运行相同的命令即可。

答案 4 :(得分:3)

您可以使用

在目标服务器上的SSMS中执行此操作
CREATE DATABASE db1 AS COPY OF sourcesrv.db1

从sourcesrv.database.windows.net复制,该源位于不同的订阅中。

但是,您必须首先检查您是否可以将SSMS连接到SOURCE服务器,否则您将收到一个完全混淆的错误消息,该消息隐藏了实际问题。

源服务器可能是您定期连接的服务器,但不是您当前所在的IP地址。在这种情况下,您必须将IP添加到服务器的防火墙规则中。使用您尝试从SSMS连接时出现的对话框可以轻松完成此操作:

enter image description here

选中默认的radiobutton(“添加我的客户端IP”)并按“确定”。

如果您省略此检查并且无法对您进行身份验证,而不是如上所述告诉您正确的原因,则会告诉您无法在SOURCE服务器上制作副本!

--In SSMS connected to targetsrv:

CREATE DATABASE db1 AS COPY OF sourcesrv.db1

--Here it should say, "Your client IP address does not have access" to sourcesrv, like when
--you try to connect in SSMS. Instead, it says you can't copy to the SOURCE, even though you 
--told it to copy FROM the source to the TARGET:

--Msg 45137, Level 16, State 1, Line 7
--Insufficient permission to create a database copy on server 'sourcesrv'.

请注意,在编写本文时,需要使用相同的管理凭据配置两个服务器,否则CREATE DATABASE命令将失败并显示相同的混淆错误消息。

答案 5 :(得分:2)

还有一个更简单的解决方案,当回答这个问题时可能无法使用。无需SMSS或PowerShell。所有这些都可以在门户网站中完成。转到源SQL数据库,然后单击“导出”。这将在Azure存储中创建一个.bacpac文件。转到目标SQL Server,然后单击“导入”。做完了

注1:如果目标SQL Sever位于无法访问源帐户的Azure存储的其他帐户/订阅中,只需手动从源Azure存储下载文件并将其上传到目标可以访问的Azure存储实例。

注2:导入的数据库将具有包含导出日期的名称。您可以通过在目标数据库上运行ALTER DATABASE [dbname] MODIFY NAME = [newdbname]来更改名称。您甚至可以使用新的查询编辑器在门户网站中执行此操作。

答案 6 :(得分:2)

我知道这是一个非常老的问题,仍然想添加另一个选项。

如果要自动执行此任务,则不想手动执行(导出-导入),而是要将数据库复制到现有服务器(而不是创建将在订阅之间移动的新临时服务器)。 ),并且出于安全考虑,您不想在源服务器和目标服务器上具有相同的凭据,则可以使用ARM。

有一个选项可以将数据库创建为副本("createMode": "Copy",),它将跨订阅进行创建!简单的例子:

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "apiVersion": "2014-04-01-preview",
      "location": "australiaeast",
      "name": "{DESTINATION-SERVER-NAME}/{DESTINATION-DATABASE-NAME}",
      "properties": {
        "createMode": "Copy",
        "sourceDatabaseId": "/subscriptions/{SOURCE-SUBSCRIPTION-ID}/resourceGroups/{SOURCE-RESOURCE-GROUP-NAME}/providers/Microsoft.Sql/servers/{SOURCE-SERVER-NAME}/databases/{SOURCE-DATABASE-NAME}",
        "requestedServiceObjectiveName": "S2"
      },
      "type": "Microsoft.Sql/servers/databases"
    }
  ]
}  

需要注意的两件事-将要执行此部署的服务主体必须在源上具有贡献者访问权限,并且sourceDatabaseId是完整的资源ID。

如果使用“ Azure资源组部署”任务从Azure DevOps中进行操作,它将创建用于订阅的SP。您将需要授予贡献者访问权限。可以在项目设置->服务连接中找到SP。