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

Luk*_*ett 21 azure azure-sql-database

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

  • 生产
  • 报告
  • 测试

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

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

目前,我们使用该CREATE DATABASE X AS COPY OF [ServerName].Y命令将数据库从生产复制到测试,然后再对实时数据进行模糊处理.只要数据库位于同一数据中心的地理位置,并且我们首先在创建数据库的实例之间进行共享登录(如本文所示),就可以执行此操作.

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

Cra*_*aig 15

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

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

更新:如果您可以使用SSMS,这个答案是对的.我只想补充一些细节.

  1. 您可以将源数据库导出到Azure门户中的存储中. 在此输入图像描述
  2. 导出后,您可以找到bacpac文件. 在此输入图像描述
  3. 打开SSMS,然后连接到目标服务器.
  4. 右键单击节点Database,然后选择Import Data-tier Application 在此输入图像描述
  5. 然后,您可以选择从本地磁盘或Azure存储导入数据库. 在此输入图像描述
  6. 之后,您已将数据库从源复制到目标.


Ric*_*uer 15

对于任何人登陆这里,它确实看起来是可能使用CREATE DATABASE newDB AS COPY OF [server].[olddb] ( OPTION [, OPTION ...] )时服务器在不同的订阅均匀.

有关详细信息,请参阅创建数据库(Azure SQL数据库) - MSDN

MS Docs中的示例:

CREATE DATABASE db_copy AS COPY OF ozabzw7545.db_original ( SERVICE_OBJECTIVE = 'P2' ) ;
Run Code Online (Sandbox Code Playgroud)

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

我通过测试发现,尽管包含"版本"选项,但我无法将版本从标准更改为高级版 - 我不知道为什么会这样.


Aka*_*ash 9

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

示例代码可在technet上获得

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

代码的关键部分是

创建一个新服务器:

$newserver = New-AzureSqlDatabaseServer -Location $targetServerLocation -AdministratorLogin $targetServerLoginID -AdministratorLoginPassword $targetServerLoginPassword 
Run Code Online (Sandbox Code Playgroud)

创建数据库副本:

Start-AzureSqlDatabaseCopy -ServerName $sourceServerName -DatabaseName $sourceDatabaseName -PartnerServer $newserver.ServerName  -PartnerDatabase $targetdatabaseName  
Run Code Online (Sandbox Code Playgroud)

转移服务器

$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 
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

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

创建数据库NEWDBNAME
作为[源Azure服务器名称]的副本.[source DB]

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

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

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


Jle*_*HeP 5

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

如果您希望自动执行此任务,则不想手动执行此操作(导出-导入),而是希望将数据库复制到现有服务器(而不是创建将在订阅之间移动的新临时数据库),并且您出于安全考虑,您不想在源服务器和目标服务器上使用相同的凭据,可以使用 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"
    }
  ]
}  
Run Code Online (Sandbox Code Playgroud)

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

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