本文介绍RDS SQL Server中无法直接删除数据库的处理方法。
阿里云提醒您:
如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
问题描述
在RDS SQL Server实例中删除数据库时,会出现以下场景的报错:
如果数据库没有会话,对于RDS SQL Server 2008、2012和2016版本,是用镜像做的主备同步,直接使用
drop database
SQL语句删除数据库会存在以下报错。The database 'XX' is enabled for database mirroring. Database mirroring must be removed before you drop the database.
如果数据库没有会话,对于RDS SQL Server 2017版本,是用AlwaysOn做的主备同步,直接使用
drop database
SQL语句删除数据库会存在以下报错。The database 'XX' is currently joined to an availability group. Before you can drop the database, you need to remove it from the availability group.
对于RDS SQL Server 2008、2012、2016和2017版本,如果数据库存在会话,直接使用
drop database
SQL语句删除数据库会存在以下报错。Cannot drop database "XX" because it is currently in use
问题原因
高可用系列的数据库采用镜像或AlwaysOn搭建的高可用架构,删除数据库前需要先移除镜像或AlwaysOn,然后才能删除数据库。此外,如果数据库存在会话,则需要先使用kill
命令结束会话,然后才能删除数据库。
解决方案
本解决方案仅适用于高可用系列的RDS SQL Server实例。
RDS SQL Server 2012及以上版本
请您先登录数据库,然后在数据库中执行以下SQL语句,删除数据库。
EXEC sp_rds_drop_database '[$Database]';
[$Database]
指需要删除的数据库名称。上述命令会先移除高可用架构,并结束在该数据库上的会话连接,然后删除数据库。
RDS SQL Server 2008版本
请您先登录数据库,然后在数据库中执行以下操作:
如果存在
Cannot drop database "XX" because it is currently in use
报错,则需要执行kill
命令,结束会话,然后再执行删除操作。执行以下SQL语句,找到要删除数据库的会话的spid。
USE master; EXEC sp_who;
执行以下命令,结束会话。
kill [$Spid];
说明[$Spid]
为上一步获取要删除数据库的会话的spid。执行以下SQL语句,直接移除镜像。
ALTER DATABASE [$Database] SET PARTNER OFF;
然后执行以下SQL语句,删掉数据库。
DROP database [$Database];
如果不存在
Cannot drop database "XX" because it is currently in use
报错,则执行以下SQL语句,直接移除镜像。ALTER DATABASE [$Database] SET PARTNER OFF;
然后执行以下SQL语句,删掉数据库。
DROP database [$Database];
相关操作
如需通过RDS控制台或API删除数据库,请参见通过RDS控制台删除数据库或DeleteDatabase - 删除数据库。