2008-10-24 32 views
58

¿cuánto tiempo debe tomar para ejecutar¿Cuánto tiempo debería SET READ_COMMITTED_SNAPSHOT ON tomar?

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON 

Acabo de funcionar y se toma 10 minutos.

¿Cómo puedo verificar si se aplica?

+1

hizo siempre terminan? –

+21

déjame ver ... –

+0

oops. no estuvo habilitado todo este tiempo !! (¡en serio!) eso explica los bloqueos. ver mi respuesta a continuación para obtener los resultados completos y un mejor script para ejecutar –

Respuesta

54

Puede verificar el estado de la configuración READ_COMMITTED_SNAPSHOT utilizando la vista sys.databases. Compruebe el valor de la columna is_read_committed_snapshot_on. Ya asked and answered.

En cuanto a la duración, Books Online indica que no puede haber otras conexiones a la base de datos cuando esto ocurre, pero no requiere el modo de usuario único. Entonces puede ser bloqueado por otras conexiones activas. Ejecute sp_who (o sp_who2) para ver qué más está conectado a esa base de datos.

+0

gracias. está demorando 40 minutos hasta el momento y muestra 0. Es una base de datos de 740 MB. dedos cruzados no lo rompí –

+3

Intenta abrir otra ventana de consulta contra ese databse. Si puede, entonces espero que su declaración no haya comenzado todavía. – Rick

+3

Sí. Solo debería tomar unos segundos en la mayoría de las bases de datos. Si tarda más, está esperando que otra conexión (incluso no activa) finalice antes de poder realizar el cambio. Por lo tanto, es posible que necesite encontrar y MATAR los spids actualmente conectados (después de evaluar lo que están haciendo). ENTONCES debería ir rápido. –

33

Prueba esto:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE 
+2

Entonces, ¿para qué sirve "WITH ROLLBACK IMMEDIATE"?¿eso significa que se retrotraerá automáticamente cuando la consulta falle? –

+4

No, "CON EL ROLLBACK INMEDIATO" significa que inmediatamente revertirá cualquier transacción abierta antes de iniciar la instrucción ALTER DATABASE. Aconsejaría que no lo haga a menos que ya haya comprobado qué transacciones están abiertas y si se pueden revertir de forma segura. – Rick

+0

Gracias! funciona muy rápido ahora –

8

probar este código: base de datos de uso principal

if(charindex('Microsoft SQL Server 2005',@@version) > 0) 
begin 
    declare @sql varchar(8000) 
    select @sql = ' 
    ALTER DATABASE ' + DB_NAME() + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ; 
    ALTER DATABASE ' + DB_NAME() + ' SET READ_COMMITTED_SNAPSHOT ON; 
    ALTER DATABASE ' + DB_NAME() + ' SET MULTI_USER;' 

    Exec(@sql) 
end 
+0

Esto funcionó para mí. (Tuve el mismo problema) –

+0

Debería envolver sus llamadas de nombre_de_datos() con quotename(), para tener en cuenta los caracteres del nombre de la base de datos que podrían necesitar escaparse (como espacios). – Rick

+0

también necesita 'SET allow_snapshot_isolation ON' ¿verdad? (mira mi respuesta) –

2

probar antes de la alteración de la base de datos actual.

USE Master 
GO 

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON 
GO 
2

No tomé un segundo para mí cuando he cambiado de base de datos para un solo usuario

20

OK (soy el que pregunta el original) por lo que resulta que todo este tiempo no tenía ni siquiera la maldita cosa habilitada

Aquí está el ultimate code que se ejecutará para habilitar el modo de instantánea y asegúrese de que esté habilitado.

SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb' 

ALTER DATABASE shipperdb SET allow_snapshot_isolation ON 
ALTER DATABASE shipperdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
ALTER DATABASE shipperdb SET read_committed_snapshot ON 
ALTER DATABASE shipperdb SET MULTI_USER 

SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb' 

Esto funciona incluso con conexiones activas (es de suponer que estás bien con ellos ser expulsado).

Puede ver el estado de antes y después y esto debería ejecutarse casi de inmediato.


IMPORTANTE:

La opción READ_COMMITTED_SNAPSHOT anterior corresponde a IsolationLevel.ReadCommitted en .NET
La opción ALLOW_SNAPSHOT_ISOLATION anterior corresponde a IsolationLevel.Snapshot en .NET

Great article about different versioning


.NET Consejos:

Parece que Isolationlevel.ReadCommitted está permitido en el código aunque no esté habilitado por la base de datos. No se lanza ninguna advertencia. Así que hazte un favor y asegúrate de que esté encendido antes de asumir que es por 3 años como lo hice !!!

Si está utilizando C#, probablemente desee ReadCommitted IsolationLevel y no Snapshot, a menos que realice escrituras en esta transacción.

READ COMMITTED SNAPSHOT realiza lecturas optimistas y escrituras pesimistas. Por el contrario, SNAPSHOT realiza lecturas optimistas y escrituras optimistas. (from here)

bool snapshotEnabled = true; 

using (var t = new TransactionScope(TransactionScopeOption.Required, 
       new TransactionOptions 
{ 
    IsolationLevel = IsolationLevel.ReadCommitted 
})) 
{ 
    using (var shipDB = new ShipperDBDataContext()) 
    { 

    } 
} 

En adicional se puede obtener un error de ser 'incapaz de promover' una transacción. Busque 'promoción' en Introducing System.Transactions in the .NET Framework 2.0.

A menos que esté haciendo algo especial, como conectarse a una base de datos externa (o segunda base de datos), entonces algo tan simple como crear un nuevo DataContext puede causar esto. Tuve un caché que 'giró' su propio contexto de datos en la inicialización y esto intentaba escalar la transacción a una distribuida completa.

La solución fue simple:

 using (var tran = new TransactionScope(TransactionScopeOption.Suppress)) 
     { 
      using (var shipDB = new ShipperDBDataContext()) 
      { 
       // initialize cache 
      } 
     } 

Ver también Deadlocked article by @CodingHorror

+3

Quería mencionar, ya que no estaba seguro: ** puedes ** encender 'READ_COMMITTED_SNAPSHOT' independientemente de' ALLOW_SNAPSHOT_ISOLATION'. Puede tener 'ALLOW_SNAPSHOT_ISOLATION' ** desactivado ** y aún beneficiarse de que 'READ_COMMITTED_SNAPSHOT' sea ** en **. Probado: Microsoft SQL Server 2012 - 11.0.2100.60 –

+1

Esta opción cambia la forma en que se implementa READ COMMITTED. Con la opción desactivada, SQL Server usará bloqueos para controlar el acceso. Esta es la razón por la que su código .NET no generó una advertencia: usted todavía estaba obteniendo el comportamiento, simplemente lo hizo de una manera diferente (y más probable que se bloqueara). – Richard

0

Trate Cierre los demás servicios de SQL para que sólo el servicio de SQL Server se está ejecutando.

La mina funcionó durante 5 minutos y luego la cancelé porque era obvio que no estaba pasando nada. Es un nuevo servidor por lo que no hay otros usuarios conectados. Apagué SQL Reporting Services y luego lo ejecuté de nuevo. Tomó menos de un segundo completarlo.

1

He probado el comando:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON 
GO 

contra un cuadro de dev pero el que tomó 10 minutos más y por eso lo mató.

Entonces me encontré con esto:

https://willwarren.com/2015/10/12/sql-server-read-committed-snapshot/

y utilizó su bloque de código (que tomó alrededor de 01:26 a ejecutar):

USE master 
GO 

/** 
* Cut off live connections 
* This will roll back any open transactions after 30 seconds and 
* restricts access to the DB to logins with sysadmin, dbcreator or 
* db_owner roles 
*/ 
ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK AFTER 30 SECONDS 
GO 

-- Enable RCSI for MyDB 
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON 
GO 

-- Allow connections to be established once again 
ALTER DATABASE MyDB SET MULTI_USER 
GO 

-- Check the status afterwards to make sure it worked 
SELECT is_read_committed_snapshot_on 
FROM sys.databases 
WHERE [name] = 'MyDB ' 
Cuestiones relacionadas