本文介紹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命令,結束會話,然後再執行刪除操作。執行以下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 - 刪除資料庫。