2009-08-18 9 views
2

Je suis actuellement en train de détacher une base de données de développement sur le serveur de production. Comme il s'agit d'un serveur de production, je ne souhaite pas redémarrer le service SQL. C'est le pire des cas.Détacher la base de données/mettre hors ligne échoue

Évidemment, j'ai essayé de le détacher via SSMS. M'a dit qu'il y avait une connexion active et je l'ai déconnecté. En détachant la deuxième fois, il m'a dit que c'était impossible car il était utilisé.

J'ai essayé EXEC sp_detach_db 'DB' sans chance.

J'ai essayé de mettre la base de données hors ligne. Cela a duré environ 15 minutes quand je me suis ennuyé et l'ai éteint.

De toute façon, j'ai tout essayé ... Je me suis assuré que toutes les connexions ont été tuées en utilisant l'indicateur de connexions dans la base de données de détachement en utilisant SSMS.

Les éléments suivants sont retournés 0:

USE master SELECT * FROM sys.sysprocesses OÙ dbid = DB_ID ('DB')

Et ce qui suit est en cours d'exécution pendant 18 minutes maintenant:

ALTER DATABASE DB mis hors ligne avec ROLLBACK IMMEDIATE

J'ai redémarré SMSS régulièrement pendant tout cela pour s'assurer que SSMS n'était pas le coupable en verrouillant quelque chose de manière invisible.

N'y at-il pas un moyen de le forcer? Le schéma de la base de données est quelque chose que j'aime beaucoup, mais les données sont inutilisables.

Espérons qu'il y a une sorte de solution rapide? :)

Le DBA va essayer de réinitialiser le processus ce soir, mais je voudrais savoir le correctif pour cela au cas où.

Thx! Ps: J'utilise DTC ... alors peut-être que cela pourrait expliquer pourquoi ma base de données a été bloquée tout à coup?

modifier:

que je fais maintenant ce qui suit qui se traduit par une exécution infinie de la dernière partie. La première requête renvoie même 0, donc je suppose que l'assassinat des utilisateurs n'aura même pas d'importance.

UTILISATION [maître] GO

SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID ('Base')

aller

DECLARE @return_value int

EXEC = @return_value [dbo].[Usp_KillUsers] @p_DBName = 'Database'

SELECT 'Valeur de retour' = @return_value

GO

ALTER DATABASE SET OFFLINE AVEC ROLLBACK IMMEDIATE

GO

Répondre

1

SELECT req_transactionUOW DISTINCT syslockinfo

KILL 'number_returned' (celle (s) avec id_processus -2)

La cause a été DTC d'être un peu ennuyeux et enfermer la base de données complètement avec une transaction a échoué. Maintenant, je voudrais savoir la raison pour laquelle cela est arrivé. Mais au moins, il me donne la possibilité de réinitialiser les transactions cassées lorsque le problème se reproduit.

Je l'affiche ici car je suis sûr que cela va aider certaines personnes qui rencontrent les mêmes problèmes.

1

Comment sont vous vous connectez à SQL Server? Est-il possible que vous essayiez de détacher la base de données alors que vous-même êtes connecté? Cela peut bloquer un détachement, en fonction de la version de SQL Server concerné.

Vous pouvez essayer d'utiliser le DAC pour ce genre de choses.

+1

Aussi pour ces tâches, j'aime placer un «maître d'utilisation» explicite au début pour m'assurer que je n'utilise pas le DB que j'essaie de détacher. –

+0

Je suis sûr à 100% que je n'utilise pas la base de données. J'ai vérifié chaque endroit que vous pouvez vérifier pour vous assurer qu'aucune connexion n'est active sur cette base de données. – SpoBo

1

Essayez de tuer toutes les connexions avant de détacher la base de données, IE:

USE [master] 
GO 
/****** Object: StoredProcedure [dbo].[usp_KillUsers] Script Date: 08/18/2009 10:42:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[usp_KillUsers] 
    @p_DBName SYSNAME = NULL 
AS 

/* Check Paramaters     */ 
/* Check for a DB name     */ 
IF (@p_DBName IS NULL) 
BEGIN 
    PRINT 'You must supply a DB Name' 
    RETURN 
END -- DB is NULL 
IF (@p_DBName = 'master') 
BEGIN 
    PRINT 'You cannot run this process against the master database!' 
    RETURN 
END -- Master supplied 
IF (@p_DBName = DB_NAME()) 
BEGIN 
    PRINT 'You cannot run this process against your connections database!' 
    RETURN 
END -- your database supplied 

SET NOCOUNT ON 

/* Declare Variables     */ 
DECLARE @v_spid INT, 
     @v_SQL NVARCHAR(255) 

/* Declare the Table Cursor (Identity) */ 
DECLARE c_Users CURSOR 
    FAST_FORWARD FOR 
SELECT spid 
    FROM master..sysprocesses (NOLOCK) 
    WHERE db_name(dbid) LIKE @p_DBName 

OPEN c_Users 

FETCH NEXT FROM c_Users INTO @v_spid 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
    IF (@@FETCH_STATUS <> -2) 
    BEGIN 
    SELECT @v_SQL = 'KILL ' + CONVERT(NVARCHAR, @v_spid) 
-- PRINT @v_SQL 
    EXEC (@v_SQL) 
    END -- -2 
    FETCH NEXT FROM c_Users INTO @v_spid 
END -- While 

CLOSE c_Users 
DEALLOCATE c_Users 

Ceci est un script pour tuer toutes les connexions utilisateur à une base de données, juste passer le nom de la base, et il les fermer. Ensuite, vous pouvez essayer de détacher la base de données. Ce script est celui que j'ai trouvé il y a un moment et je ne peux pas le revendiquer comme le mien. Je ne veux pas dire cela comme une sorte de plagarisme, je n'ai tout simplement pas la source.

+0

Testé, retourné 0, donc je suppose que toutes les connexions ont été fermées. Après cela, l'amener hors ligne a échoué. Il m'a dit qu'il ne pouvait pas avoir un verrou sur la base de données. – SpoBo

Questions connexes