このトピックでは、ApsaraDB RDS for SQL Serverインスタンスからデータベースを直接削除できない問題を解決する方法について説明します。
以下の点にご注意ください。
Alibaba Cloudインスタンスの設定やデータの変更など、リスクの高い操作を実行する前に、インスタンスのディザスタリカバリ機能とフォールトトレランス機能を確認して、データのセキュリティを確保することを推奨します。
ECS (Elastic Compute Service) インスタンスやRDSインスタンスなどのインスタンスの設定またはデータを変更する前に、インスタンスのスナップショットを作成するか、バックアップを有効にすることを推奨します。 たとえば、RDSインスタンスのログバックアップを有効にできます。
Alibaba Cloud管理コンソールで機密情報に対する権限を付与した場合、または機密情報を送信した場合は、できるだけ早い機会に機密情報を変更することを推奨します。 機密情報には、ユーザー名とパスワードが含まれます。
問題の説明
RDSインスタンスからデータベースを削除すると、次のいずれかのエラーが発生します。
データベースにセッションが存在しない場合:
DROP databaseステートメントを実行して、SQL Server 2008、SQL Server 2012、またはSQL Server 2016を実行し、ミラーリングテクノロジを使用してプライマリ /セカンダリ同期を実装するRDSインスタンスからデータベースを削除すると、次のエラーが発生します。The database 'XX' is enabled for database mirroring. Database mirroring must be removed before you drop the database.データベースにセッションが存在しません:
DROP databaseステートメントを実行して、SQL Server 2017を実行し、AlwaysOnを使用してプライマリ /セカンダリ同期を実装するRDSインスタンスからデータベースを削除すると、次のエラーが発生します。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.セッションがデータベースに存在する場合:
DROP databaseステートメントを実行して、SQL Server 2008、SQL Server 2012、SQL Server 2016、またはSQL Server 2017を実行するRDSインスタンスからデータベースを削除すると、次のエラーが発生します。Cannot drop database "XX" because it is currently in use
原因
RDSインスタンスはRDS High-availability Editionを実行し、ミラーリングまたはAlwaysOnベースの高可用性 (HA) アーキテクチャを使用します。 RDSインスタンスからデータベースを削除する場合は、データベースミラーリングまたはAlwaysOn可用性グループを削除する必要があります。 必要なデータベースにセッションが存在し、データベースを削除する場合は、データベースを削除する前にkillコマンドを実行してセッションを終了する必要があります。
解決策
このソリューションは、RDS High-availability EditionでSQL Serverを実行するRDSインスタンスにのみ適用できます。 詳細については、「RDS High-availability Edition」をご参照ください。
SQL Server 2012以降
必要なデータベースにログインし、次の文を実行してデータベースを削除します。
EXEC sp_rds_drop_database '[$Database]';[$Database]は、削除するデータベースの名前を指定します。上記のステートメントは、HAアーキテクチャを削除し、データベース内のセッションを終了してからデータベースを削除するために使用されます。
SQL Server 2008
必要なデータベースにログインし、次の操作を実行します。
[Cannot drop database "XX" Cannot drop database because in use]というエラーメッセージが表示された場合は,killコマンドを実行してデータベースのセッションを終了し, データベースを削除してください。次のステートメントを実行して、削除するデータベース内のセッションのプロセスID (PID) を取得します。
使用マスター; EXEC sp_who;次のコマンドを実行してセッションを終了します。
kill [$Spid];説明[$Spid]は、削除するデータベース内のセッションに必要なPIDを指定します。次のステートメントを実行して、データベースミラーリングを直接削除します。
ALTER DATABASE [$データベース] パートナーをオフに設定します。次の文を実行してデータベースを削除します。
DROPデータベース [$データベース];
[Cannot drop database "XX" Cannot drop database "currently in use] エラーメッセージが表示されない場合は、次のステートメントを実行してデータベースミラーリングを直接削除します。ALTER DATABASE [$データベース] パートナーをオフに設定します。次の文を実行してデータベースを削除します。
DROPデータベース [$データベース];
関連ドキュメント
ApsaraDB RDSコンソールまたはAPIを呼び出してデータベースを削除する方法の詳細については、「ApsaraDB RDSコンソールでデータベースを削除する」または「DeleteDatabase」をご参照ください。