在Amazon RDS上创建SQL Server数据库的.bak备份时出现权限错误

时间:2019-05-24 11:46:41

标签: sql-server amazon-web-services amazon-rds

我继承了在AWS上运行的网站。我想做的是备份SQL Server数据库(位于Amazon RDS上),以便我可以在本地设置开发环境。我具有AWS控制台的登录凭据,但是在这种环境下我是一个新手,因此我尝试将流程和术语拼凑在一起。

我已阅读docs here,了解如何启用SQL数据库的导入/导出。本指南中包含3个设置步骤:

首先,我们需要一个S3存储桶。我从控制台中看到,我们已经有了一个名为“ sqlbackups”的存储桶,因此以前的开发人员似乎已经完成了此过程。

第二,我们需要“ AWS身份和访问管理(IAM)角色来访问存储桶”。我已经通过从“服务”列表中转到“ IAM”并从左侧导航中选择“角色”来检查控制台。我们似乎有一个名为“ SQL_BackRestore_IAM”的IAM角色。我假设这是我们需要的,已经由先前的开发人员设置了?

第三,我们需要“将SQLSERVER_BACKUP_RESTORE选项添加到数据库实例上的选项组。”。我已经转到AWS控制台> RDS>选项组,并且那里有一个名为“ custom-option-group-for-sql-express-v11”的组,其中有“ SQLSERVER_BACKUP_RESTORE”作为选项。因此,看起来好像已经设置好了。

因此,现在我相信我需要登录到实际的SQL Server并运行命令以调用存储过程来创建.bak备份。因此,我使用网站web.config文件中的凭据登录数据库,然后执行以下操作:

exec msdb.dbo.rds_backup_database 
@source_db_name='ExampleDBName',
@s3_arn_to_backup_to='arn:aws:s3:::sqlbackups/ExampleDBName.bak',
@type='FULL';

但是,我现在收到一个错误:

The EXECUTE permission was denied on the object 'rds_backup_database', database 'msdb', schema 'dbo'

大概与数据库登录没有执行备份的权限有关。我没有获得任何sa或master数据库登录名,所以我现在陷入困境!

谁能建议我如何使此备份命令起作用?

非常感谢。

3 个答案:

答案 0 :(得分:2)

我有同样的问题。

我通过使用RDS主用户名登录并运行备份过程解决了该问题。

您可以在RDS数据库实例的“配置”选项卡上找到主用户名。

因此在AWS控制台中:

RDS,数据库,选择数据库,配置

如果您不知道主用户名密码,也可以通过在数据库实例视图上单击修改来找到该密码。在设置下设置密码。

答案 1 :(得分:0)

从文档中

https://www.mssqltips.com/sqlservertip/5042/limitations-of-sql-server-native-backup-and-restore-in-amazon-rds/


用户需要对msdb数据库中的rds_backup_database具有执行权限。

C:\Users\erapp\Code>C:/Users/erapp/Anaconda3/Sc/Anaconda3/Scripts/activate

(base) C:\Users\erapp\Code>conda activate base

(base) C:\Users\erapp\Code>C:/Users/erapp/Anaconda3/python.exe c:/Users/erapp/Code/mbl_mc10/code/sensor_prep_utils.py
Traceback (most recent call last):
  File "c:/Users/erapp/Code/mbl_mc10/code/sensor_prep_utils.py", line 6, in <module>
    import quaternion
ModuleNotFoundError: No module named 'quaternion'

希望这会有所帮助!

答案 2 :(得分:0)

我发布了一个 answer on the AWS Forums,解释了如何通过使用 Active Directory 用户/组和 MSA 帐户来运行备份过程,以尽可能最简洁的方式执行此操作。

在以下示例中,[DOMAIN\msaSqlBackup$] 是在 EC2 实例上运行并执行关联备份命令的托管服务帐户。 [DOMAIN\SQL Admins\ 是一个 AD 组,它是 AWS SQL Server RDS 提供的 [admin] 内置用户帐户的代理。请注意 WITH GRANT OPTION [DOMAIN\SQL Admins],这是将授权链从 [admin] 用户传递到 [DOMAIN\SQL Admins] AD 组到 [DOMAIN\msaSqlBackup$] AD 组 MSA 帐户所必需的。如果没有这一步,还需要执行 GRANT CREATE ANY DATABASE TO [NewLoginName] WITH GRANT OPTION;GRANT VIEW ANY DATABASE TO [NewLoginName] WITH GRANT OPTION; 同时以管理员帐户身份执行此操作。这不是首选,因为它 (1) 不必要地提升了 NewLoginName 的权限 (2) 意味着您在整个 DBA 团队中使用基于密码的共享帐户来管理您的 AWS SQL Server RDS 实例。

USE master
GO
CREATE LOGIN [DOMAIN\msaSqlBackup$] FROM WINDOWS
GO 
 
USE msdb
GO
CREATE USER [DOMAIN\msaSqlBackup$] FROM LOGIN [DOMAIN\msaSqlbackup$]
GO
GRANT EXECUTE ON msdb.dbo.rds_backup_database TO [DOMAIN\msaSqlBackup$] WITH GRANT OPTION [DOMAIN\SQL Admins]
GO 
GRANT EXECUTE ON msdb.dbo.rds_restore_database TO [DOMAIN\msaSqlBackup$] WITH GRANT OPTION [DOMAIN\SQL Admins]
GO 
GRANT EXECUTE ON msdb.dbo.rds_task_status TO [DOMAIN\msaSqlBackup$] WITH GRANT OPTION [DOMAIN\SQL Admins]
GO 
GRANT EXECUTE ON msdb.dbo.rds_cancel_task TO [DOMAIN\msaSqlBackup$] WITH GRANT OPTION [DOMAIN\SQL Admins]
GO
 
USE name_of_database_to_backup
GO
CREATE USER [DOMAIN\msaSqlBackup$] FROM LOGIN [DOMAIN\msaSqlBackup$]
GO
ALTER ROLE db_backupoperator ADD MEMBER [DOMAIN\msaSqlBackup$]
GO