AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 174715
Accepted
Randy Minder
Randy Minder
Asked: 2017-05-27 13:39:37 +0800 CST2017-05-27 13:39:37 +0800 CST 2017-05-27 13:39:37 +0800 CST

如何将 BACPAC 文件导入 Azure SQL 并覆盖现有数据库?

  • 772

假设我有一个名为 MyDatabase 的本地数据库。我想将它移动到 Azure SQL 并替换当前驻留在那里的名为 MyDatabase 的现有数据库。我知道如何在本地创建 BACPAC 文件。我知道如何将 BACPAC 导入我的 Azure 存储帐户。但是,一旦 BACPAC 在 Azure 存储中,我不知道用存储中的副本覆盖现有 MyDatabase 数据库的首选方法。我可以导入 BACPAC 文件并创建第二个数据库,然后删除第一个,并重命名刚刚导入的数据库。但是,这样做是最好的还是首选的方式?

sql-server azure-sql-database
  • 2 2 个回答
  • 20294 Views

2 个回答

  • Voted
  1. Best Answer
    SqlWorldWide
    2017-05-27T20:41:30+08:002017-05-27T20:41:30+08:00

    你是对的。在 Azure 中,您无法在现有数据库上恢复,只能在“新的或空的”上恢复。

    • 您必须使用不同的名称进行恢复。
    • 删除旧数据库
    • 将新的重命名为旧的数据库名称。

    您有几种方法可以从 .BACPAC 文件中恢复。

    1. .\sqlpackage.exe您可以使用命令行工具直接从您的本地 .BACPAC 位置 执行此操作。

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

    2. 您还可以使用您在存储帐户中上传的副本。

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

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

      $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

      获取 AzureRmSqlDatabaseImportExportStatus -OperationStatusLink $importRequest.OperationStatusLink

    3. 在门户中,您可以直接将.BACPAC文件作为数据库导入您的服务器。

    • 13
  2. Tumnin
    2019-12-12T16:38:13+08:002019-12-12T16:38:13+08:00

    在 Azure 中,您无法在现有数据库上进行还原。(C)

    显然,并非如此。您可以将 .bacpac 文件恢复到现有的 Azure SQL 数据库中,例如,当您确实需要保留Azure SQL 数据库的相同实例时,因为它已包含在 Azure 环境中。一个必要条件是:目标数据库必须是空的,即像刚刚创建的一样。但是,如果您已经有一个不为空的目标数据库(当然!),您可以“清理”数据库,在其上下文中运行以下脚本,以超级用户身份登录:

    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
    

    最后 4 个语句是可选的。其中前 3 个用于检查/查看某些参数,最后一个用于删除特定的数据库级触发器(如果存在)。

    之后,您可以使用标准 sqlpackage.exe 实用程序将您拥有的 .bacpac 文件恢复到目标数据库,在管理提升的命令行窗口中运行它,如下所示:

    “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]
    

    只需将 [braced_values] 替换为真实的,它应该可以工作。运行时,该实用程序可能会显示一条警告消息,以黄色显示,如下所示:

    初始化部署 对象 [data_0] 存在于目标中,但即使您选择了“为目标数据库中但不在源数据库中的对象生成删除语句”复选框,它也不会被删除。对象 [log] 存在于目标中,但即使您选中了“为目标数据库中但不在源数据库中的对象生成删除语句”复选框,它也不会被删除。

    你可以忽略它。根据数据库的大小和复杂性,恢复过程可能需要很长时间,因此请确保等待完成,并显示消息:成功导入数据库。

    希望有帮助。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve