RDS SQL Server中无法直接删除数据库的处理方法

本文介绍RDS SQL Server中无法直接删除数据库的处理方法。

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

问题描述

在RDS SQL Server实例中删除数据库时,会出现以下场景的报错:

  • 如果数据库没有会话,对于RDS SQL Server 2008、2012和2016版本,是用镜像做的主备同步,直接使用drop databaseSQL语句删除数据库会存在以下报错。

    The database 'XX' is enabled for database mirroring. Database mirroring must be removed before you drop the database.
  • 如果数据库没有会话,对于RDS SQL Server 2017版本,是用AlwaysOn做的主备同步,直接使用drop databaseSQL语句删除数据库会存在以下报错。

    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 databaseSQL语句删除数据库会存在以下报错。

    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命令,结束会话,然后再执行删除操作。

    1. 执行以下SQL语句,找到要删除数据库的会话的spid。

      USE master;
      EXEC sp_who;
    2. 执行以下命令,结束会话。

      kill [$Spid];
      说明

      [$Spid]为上一步获取要删除数据库的会话的spid。

    3. 执行以下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 - 删除数据库