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

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

更新时间:2020-06-19 14:41:01

问题描述

在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命令结束会话,然后才能删除数据。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

请根据现场实际版本,执行以下操作:

  • 对于RDS SQL Server2012及以上版本,请您先登录数据库,然后在数据库中执行以下SQL语句,删除数据库。
    EXEC sp_rds_drop_database '[$Database]';
    说明
    • [$Database]指的是需要删除的数据库名称。
    • 上述命令会先移除高可用架构,并结束在该数据库上的会话连接,然后删除数据库。
  • 对于RDS SQL Server2008版,请您先登录数据库,然后在数据库中执行以下操作:
    • 如果存在以下报错,则需要执行kill命令,结束会话,然后再执行删除操作。
      Cannot drop database "XX" because it is currently in use
      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 SQL Server版