首页 > 解决方案 > 从备份覆盖现有数据库

问题描述

我正在尝试将我们的生产数据库的副本带到我们的暂存数据库。它们位于不同的 RDS 实例上。我尝试使用本机 SQL 备份/恢复方法,但我不断收到错误消息。
我在生产中运行的代码:

exec msdb.dbo.rds_backup_database @source_db_name='DBName',@s3_arn_to_backup_to=N'arn:aws:s3:::path/to/backup/DBName2019-09-17.bak'

它工作得很好。当我尝试使用此命令进行恢复时(我在暂存 RDS 实例上运行此命令):

exec msdb.dbo.rds_restore_database @restore_db_name='DBName',@s3_arn_to_restore_from='arn:aws:s3:::path/to/backup/DBName2019-09-17.bak'

我收到一个错误:消息 50000,级别 16,状态 1,过程 msdb.dbo.rds_restore_database,第 91 行数据库“DBName”已经存在。不允许使用仅区分大小写或重音的两个数据库。选择不同的数据库名称。

我一直在谷歌搜索,似乎无法找到明确的答案。我在暂存 RDS 实例上有几个数据库;我不喜欢每次我想将生产副本带入暂存时都必须创建一个新的 RDS 实例的想法......

如何在无需创建新 RDS 实例的情况下将生产副本恢复到暂存状态?

标签: amazon-rds

解决方案


AFAIK - RDS 中没有用于将数据库恢复为现有名称的覆盖选项。

首先执行 drop database 命令,然后执行还原。

USE [master];
GO

IF EXISTS (SELECT 1 FROM sys.databases WHERE name = 'database_name')
BEGIN
ALTER DATABASE [database_name]   SET SINGLE_USER WITH ROLLBACK IMMEDIATE;  
DROP DATABASE [database_name]; END;

GO

EXEC msdb.dbo.rds_restore_database @restore_db_name='database_name', 
@s3_arn_to_restore_from= 'arn:aws:s3:::bucket_name/file_name_and_extension'; 
GO

EXEC msdb.dbo.rds_task_status;

您可以使用最后一条命令检查备份或还原的状态


推荐阅读