有没有办法用新的 GUID 替换 sql server file_guid?

Sha*_*dat 6 sql-server backup restore amazon-rds

我有两个具有相同 file_guid 的数据库。尝试在 Amazon RDS 中恢复第二个数据库时出现以下错误。

由于任务失败或并发 RESTORE_DB 请求而中止任务。任务 ID 8 (RESTORE_DB) 异常:无法还原数据库 DATABASENAME,因为实例上已有一个具有相同 file_guids 的现有数据库。

这是因为我已经恢复了另一个具有相同 file_guid 但不同 physical_name 的数据库,这是 Amazon RDS 的限制。如果有兴趣,请在此处此处找到详细信息。

在 sys.database_files 上查询结果

如何更新 sys.database_files 记录?

NJI*_*man 7

我们必须做同样的事情——因为我们想将一个数据库复制到一个新数据库,同时更改名称和文件 ID。

我们发现此处发布的原始过程不可重复,我想这取决于原始文件 ID 的创建方式。无论如何,我已经更新了以下程序,这是可重复的。

  1. 使用标准 RDS 数据库备份将数据库从 RDS 备份到 S3。

    exec msdb.dbo.rds_backup_database
    @source_db_name = '<database-name>',
    @s3_arn_to_backup_to = 'arn:aws:s3:::<bucket-name>/<backup-filename>'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 .bak 文件还原到本地计算机上的 SQL Server。我们有 MSDN 帐户,所以我们刚刚下载并安装了 SQL 2016,让我们可以完全访问本地机器上的 SQL。但是,我相信您可以下载 SQL Express 并执行相同的操作,根据 SQL 引擎的源版本,某些功能可能会丢失。

  3. 为数据库执行导出数据层应用程序。这将创建一个 .bacpac 文件,其中包括架构、数据和代码(存储过程等)。

  4. 删除在步骤 3 中导入 SQL Server 的原始数据。

  5. 执行导入数据层应用程序并指向在步骤 3 中创建的 .bacpac 文件。此步骤将设置文件 guids = _Data 和 _Logs,使它们唯一。

  6. 执行完整备份以获取新的 .bak 文件。

  7. 将新的 .bak 文件上传到 S3 并执行标准的 RDS 数据库导入。

    exec msdb.dbo.rds_restore_database
    @restore_db_name = '<database-name>',
    @s3_arn_to_restore_from = 'arn:aws:s3:::<bucket-name>/<backup-filename>'
    
    Run Code Online (Sandbox Code Playgroud)


Sha*_*dat 1

最后,我最终创建了新的 RDS 实例并在那里恢复。对于小型数据库,还有其他解决方法: 1. 创建 .bacpac 并导入到新数据库中,然后进行备份 (.bak)。看这里。2. 生成包含架构和数据的脚本并在新数据库上运行。

.bacpac 或生成脚本的方式对我来说不起作用,因为数据库大小较大(超过 10 GB),RDS 具有成本效益,但对 DBA 来说却很痛苦。