2011-04-26 36 views
15

Tenemos un SQL Server con unos pocos cientos de bases de datos. Muchas de las bases de datos en ese servidor se usan solo unas pocas veces por semana. Tenemos un problema donde SQL Server a veces se vuelve muy lento. Cuando eso sucede, el uso de la memoria indica 99% y ocurre la búsqueda. Para evitar el problema programamos un reinicio del servicio SQL todas las noches para descargar todas esas bases de datos y liberar memoria.¿Cómo liberar la memoria utilizada por las bases de datos inactivas de SQL Server?

Cuál es la forma correcta de liberar la memoria utilizada por las bases de datos de inactividad sin tomar el servicio de SQL abajo? Nos gustaría automatizar la descarga de cualquier base de datos a la que no se haya accedido en los últimos 30 minutos.

Nota: Estoy buscando una solución que se aplique a SQL 2005. Sin embargo, si hay una función en SQL 2008 para hacer eso me gustaría saber al respecto.

Respuesta

4

Para iniciar Yo sugeriría mirar en:

DBCC FREEPROCCACHE 

y

DBCC DROPCLEANBUFFERS 

No son base de datos específica, sino que puede reemplazar su reinicio noche.

Para un comando específico de base de datos que podría emitir un puesto de control lo que obligaría a las páginas sucias en el disco, pero sólo se aplica a las escrituras.

En SQL Server 2008 (y R2) Enterprise Edition se puede utilizar el regulador de recursos para el tramo hasta su memoria en piscinas y dedicar una mayor parte de las bases de datos críticas que permiten un control más granular de la CPU y la memoria. Sin embargo, hacer esto correctamente requiere una planificación y pruebas exhaustivas.

+0

Si publica ejemplos de código, XML o de datos, por favor ** ** destacar aquellas líneas en el editor de texto y haga clic en el botón "muestras de código" ('' {}) en el barra de herramientas editor para muy bien fo ¡rmat y sintaxis lo destacan! –

10

SQL Server liberará automáticamente toda la memoria que puede ser liberado y evitará paginación. Si te encuentras con paginación, entonces la memoria del 99% está en uso, no está disponible para ser liberada. Debe investigar cómo se usa la memoria, es probable que componentes externos como el objeto creado sp_oa_xxx o las consultas distribuidas. Comience por la investigación de los consumidores de memoria, mira sys.dm_os_memory_clerks y leer en How to use the DBCC MEMORYSTATUS command to monitor memory usage on SQL Server 2005.

Como nota al margen, ya dispone de los medios para utilizar cerrar automáticamente las bases de datos que no son es: alter database <dbname> set auto_close on:

AUTO_CLOSE: Cuando está activada, la base de datos se cerró correctamente y sus recursos se liberan después de que sale el último usuario de . La base de datos de forma automática vuelve a abrir cuando un usuario intenta utilizar la base de datos nuevo.

Si aloja cientos de bases de datos que rara vez se utilizan a continuación AUTO_CLOSE es exactamente lo que estás buscando.

+1

Y, obviamente, debe validar que SQL Server consume la memoria para comenzar ... –

+1

AUTO_CLOSE: Cerrar la base de datos inmediatamente después de que finaliza la última conexión es demasiado agresivo. Nuestra aplicación se conecta y desconecta varias veces por minuto. No quiero descargar/cargar la base de datos varias veces por minuto. No quiero confiar en la lógica de agrupación de conexiones de la aplicación. Un tiempo de espera de 30 minutos sería más apropiado. – Sylvain

+0

Voy a ver sus enlaces para investigar el uso de la memoria. – Sylvain

2

Prueba esto:

ALTER DATABASE blah SET AUTO_CLOSE ON; 

Este ajuste (que normalmente no se recomienda para la producción) podría ser adecuado para su caso. Esta configuración funcionará en SQL Server 2005 y 2008.

Para más información: http://msdn.microsoft.com/en-us/library/bb522682.aspx

+0

Si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor para formatear y sintaxis ¡destaquelo! –

0

tuve ese problema antes y he encontrado una solución para este problema puede crear un procedimiento almacenado como se describe a continuación: antes de empezar su aplicación, debe llamar a este procedimiento almacenado en el Modo 1 porque se necesita suficiente memoria

para las operaciones SQL y antes de cerrar su aplicación tiene que llamar a este procedimiento almacenado de nuevo en Modo 0

Create Proc [dbo].[MP_Rpt_ConfigureMemory] 
    (@Mode bit) 
as 
    declare @RAM as integer 
    declare @MAX as integer 
    declare @MIN as integer 

    set @RAM = (SELECT 
        [physical_memory_in_bytes]/1048576 AS [RAM (MB)] 
       FROM [sys].[dm_os_sys_info]) 

    Set @MAX = ((@RAM/4) * 3) 
    Set @MIN = ((@RAM/4) * 1) 

    if @Mode = 0 
    begin 
     exec SP_Configure 'min server memory', 1 
     RECONFIGURE 

     exec SP_Configure 'max server memory', 100 
     RECONFIGURE 
    end 
    else 
     if @Mode = 1 
     begin 
      exec SP_Configure 'max server memory', @MAX 
      RECONFIGURE 
      exec SP_Configure 'min server memory', @MIN 
      RECONFIGURE 
     end 
+0

la próxima vez que publiques la misma respuesta a una pregunta, por favor c & p la versión _formatted_ ;-) – kleopatra

+0

@kleopatra lo siento, no entendí tu media :( –

+0

nada mal, solo un recordatorio de _not_ código de mezcla y normal texto: como lo hizo accidentalmente por los cuatro espacios iniciales de su texto introductorio. Lo he editado aquí y en su respuesta anterior; lazy me espera que no tenga que volver a hacerlo en el próximo :-) – kleopatra

1

para MSSQL 2012; ejecutar por primera vez después

EXEC sys.sp_configure N'max server memory (MB)', N'256' 
GO 
RECONFIGURE WITH OVERRIDE 
GO 

continuación, comprobar si el Administrador de tareas para ver la memoria se ha reducido a 256 MB (o superior como se establece más arriba)

A continuación, ejecute este (reemplace 2048 con MB que desea asignar regularmente):

EXEC sys.sp_configure N'max server memory (MB)', N'2048' 
GO 
RECONFIGURE WITH OVERRIDE 
GO 
+0

Usted les aconseja esto en un servidor de producción? – SchmitzIT

+0

Claro que puedes. Sin embargo, el tiempo será muy crítico para la misión. Prefiere hacerlo fuera del horario de trabajo o siempre que el saldo de trabajo sea el punto más bajo. – HGMamaci

Cuestiones relacionadas