SQL Server

Uso de RAM en SQL Server: Un Análisis Profundo

En el mundo de las bases de datos, la gestión eficiente de la memoria es crucial para garantizar un rendimiento óptimo. En SQL Server, la memoria juega un papel vital en el almacenamiento de datos y en la ejecución de consultas. Hoy, vamos a iniciar una serie de artículos en los que podremos profundizar en cómo SQL Server utiliza la memoria RAM y cómo podemos ajustarla para mejorar el rendimiento.

¿Cómo Utiliza SQL Server la Memoria RAM?

SQL Server es conocido por su eficiente uso de la memoria. Desde que se inicia, SQL Server se va reservando una gran cantidad de memoria, que luego utiliza para almacenar datos y procedimientos almacenados en caché. Con el paso del tiempo, SQL habrá reservado hasta el máximo de memoria configurada o el máximo disponible. De esta manera reduce la necesidad de realizar costosas operaciones de lectura en disco. Sin embargo, puede suponer un problema cuando esa memoria reservada la necesita el sistema operativo u otros procesos. Entonces, ¿qué sucede cuando otras aplicaciones ejecutándose en el mismo servidor que también necesitan memoria? Aquí es donde entran en juego las opciones de memoria mínima y máxima.

Opciones de Memoria RAM Mínima y Máxima

La cantidad de RAM que va a usar nuestro SQL server estará definida por dos configuraciones principales de la instancia. Una de ellas es la memoria máxima de SQL Server y otra es la memoria mínima. Estas opciones de memoria mínima y máxima nos permiten controlar cuánta memoria puede utilizar SQL Server. Estas opciones son especialmente útiles cuando tenemos varias aplicaciones ejecutándose en el mismo servidor aunque, es recomendable configurarlas siempre, aunque el servidor sea dedicado.

Memoria Mínima

Esta opción nos permite especificar la cantidad mínima de memoria que SQL Server se reservará. Esto no significa que cuando SQL se inicie tendrá ya reservada esta cantidad de RAM sino que, una vez que la alcance no la va a liberar bajo ningún concepto. Porque sí, aunque antes hemos dicho que SQL se reserva la memoria para usarla después puede ser que la libere en caso de que el sistema operativo lo solicite. Para esto sirve realmente este parámetro, para que este mínimo siempre esté reservado y no se libere. 

Esta configuración cobra una especial relevancia en entornos virtualizados, donde el sistema hipervisor podría desasignar los recursos de nuestro servidor si no se están usando.

Memoria Máxima

Esta opción nos permite limitar la cantidad de memoria que SQL Server puede utilizar. Esto es útil para asegurarnos de que otras aplicaciones en el servidor tengan suficiente memoria para funcionar correctamente. Aunque tengamos un servidor dedicado para SQL Server, tenemos que configurar también este parámetro para asegurarnos que el sistema operativo, antivirus, etc… funcionen correctamente. Como norma general configuraremos una memoria máxima para la instancia de SQL Server del 75% de la RAM no utilizada por otras instancias o aplicaciones. Tenemos que tener en cuenta ese 25% libre ya que este máximo de memoria es para las funciones principales de SQL Server, sin embargo no incluye otros buffers de memoria como los de los procedimientos CLR, las consultas por linked servers y otras. Los clerks de memoria no incluidos en el límite máximo de la misma varían en función de la versión de SQL Server.

Es importante recordar que estas opciones deben ajustarse con cuidado. Si establecemos una memoria mínima demasiado alta, podríamos privar a otras aplicaciones de la memoria que necesitan. Y si establecemos una memoria máxima demasiado baja, podríamos limitar el rendimiento de SQL Server.

Configurar la RAM en SQL Server

Para configurar las opciones que hemos visto podemos hacerlo mediante la interfaz gráfica del SSMS o mediante T-SQL. Para hacerlo por el entorno gráfico, en las propiedades de nuestra instancia, nos dirigiremos al apartado Memoria.

Podemos usar también el comando sp_configure a través de código:

Consideraciones para la RAM con varias instancias

Como ya hemos comentado antes, estas dos configuraciones son aún más importantes cuando tenemos más de una instancia en el servidor. Para estos escenarios hay varias maneras de trabajar. La primera sería no hacer nada y dejar todo por defecto pero esto, como os podéis imaginar, no es una buena idea. Ya que aquí somos buenos DBAs (vosotros más que yo, seguro) vamos a ver el resto de opciones:

Configuraremos solo la memoria máxima de cada instancia en función de las necesidades de cada una de ellas teniendo en cuenta siempre no superar el umbral del 75% que comentábamos antes. Con esto nos aseguraremos de que cada instancia consume su parte de recursos, sin embargo cuando una de las instancias esté parada, esa cantidad de memoria quedará libre.

Otra opción sería no configurar la memoria máxima y configurar un valor relativamente alto para la memoria mínima de las instancias. De esta manera las instancias podrán usar más RAM de la que configuramos como valor mínimo pero, cuando una de ellas necesite más recursos, podrá reclamar parte de lo que está usando el resto, siempre respetando el valor mínimo de las instancias. Este método tiene la ventaja de que cuando una instancia no se está ejecutando, el resto puede utilizar su parte de recursos. Por contra, cuando una instancia parada se levanta, puede tardar más en obtener los recursos necesarios para funcionar de manera óptima.

Como última opción nos quedaría una combinación de las dos anteriores. Esta será mi recomendación si me preguntáis. Configuraremos una memoria mínima suficiente para cubrir las necesidades mínimas de cada instancia y un valor de memoria máximo para cubrir las necesidades recomendadas más un margen (por lo que pueda pasar). De esta manera, estaremos aprovechando al máximo las posibilidades que nos brinda SQL Server.

Conclusión

El manejo de la memoria en SQL Server es un tema complejo, pero con un poco de conocimiento y las herramientas adecuadas, podemos optimizar el rendimiento de nuestras bases de datos. Recuerda, cada sistema es único, por lo que es importante monitorizar el rendimiento y ajustar las configuraciones según sea necesario.

Nos queda pendiente ver en próximos artículos configuraciones avanzadas de memoria y cómo identificar y afrontar los problemas más comunes de consumo de memoria. Manteneos atentos.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 1 comentario

¿Qué nivel de RAID elegir para SQL Server?

En este artículo vamos a hablar de un tema muy importante para el rendimiento de nuestras bases de datos: el nivel de RAID más adecuado para los discos de los servidores de SQL Server. Aunque en el mundo de las máquinas virtuales y de la nube cada vez tenemos menos control sobre este tema, sigue siendo importante. Y seguro que, si lleváis tiempo en esto de las bases de datos, sobre todo en temas de arquitectura, habéis tocado el tema en alguna ocasión.

¿Qué es un RAID y por qué nos interesa?

RAID son las siglas de Redundant Array of Independent Disks, es decir, un conjunto redundante de discos independientes. Se trata de una forma de combinar varios discos físicos en una unidad lógica que mejora el rendimiento y la tolerancia a fallos. Con un RAID podemos aumentar la velocidad de lectura y escritura de los datos, así como protegerlos en caso de que uno o más discos fallen. Además nos ofrece una gran capacidad de redimensionamiento con unas posibilidades de crecer o decrecer impresionantes.

Niveles de RAID

Existen diferentes tipos de RAID, cada uno con sus ventajas e inconvenientes. Los más comunes son:

RAID 0

Consiste en dividir los datos en bloques y distribuirlos entre dos o más discos. No hay redundancia, por lo que si uno de los discos falla se pierden todos los datos. Sin embargo, ofrece el mayor rendimiento, ya que se aprovecha al máximo la capacidad y la velocidad de todos los discos.

RAID 1

Consiste en duplicar los datos en dos o más discos. Hay redundancia total, por lo que si uno de los discos falla se puede recuperar toda la información del otro. Sin embargo, se desperdicia la mitad de la capacidad y se reduce el rendimiento, ya que se tiene que escribir lo mismo en todos los discos.

RAID 5

Consiste en dividir los datos en bloques y distribuirlos entre tres o más discos, junto con un bloque de paridad que permite reconstruir los datos en caso de fallo de uno de los discos. Hay redundancia parcial, por lo que se puede tolerar la pérdida de un disco sin perder datos. Ofrece un buen equilibrio entre rendimiento y capacidad, ya que solo se pierde el espacio equivalente a un disco.

RAID 6

Es similar al 5, pero con dos bloques de paridad en lugar de uno. Esto permite tolerar la pérdida de dos discos sin perder datos. Ofrece mayor seguridad que el RAID 5, pero menor rendimiento y capacidad, ya que se pierde el espacio equivalente a dos discos.

RAID 10

Es una combinación de RAID 0 y 1. Consiste en crear varios grupos de discos en RAID 0 y luego duplicarlos en RAID 1. Ofrece el máximo rendimiento y seguridad, pero también el mayor coste y desperdicio de espacio, ya que se necesita el doble de discos que en un RAID 0.

¿Qué nivel de RAID elegir para SQL Server? 

El problema de SQL Server en este sentido, es que no todos los archivos tienen un uso de disco semejante. Al revés, cada archivo de SQL hace un uso distinto del disco por lo que no hay una solución ideal para todos los casos. Es por esto que vamos a diferenciar 4 grandes grupos distintos en función de sus necesidades. Por un lado tenemos las bases de datos de sistema master y msdb, por otro los archivos de log de transacciones (LDF), en tercer lugar los archivos de datos (MDF y NDF) y por último la base de datos de sistema TempDB. Cada uno tiene unas características y necesidades diferentes:

Base de datos master 

Esta base de datos contiene la información sobre las bases de datos y las configuraciones del servidor. Es un archivo pequeño pero crítico, ya que sin él no se puede iniciar SQL Server. Por eso, lo ideal es almacenarlo en un nivel que ofrezca la máxima seguridad, como el RAID 1 o el 10.

Archivos de Logs

Los archivos de logs contienen el historial de todas las transacciones realizadas en la base de datos. Es un archivo que crece continuamente y que requiere una alta velocidad de escritura. Por eso, lo ideal es almacenarlo en un nivel que ofrezca el máximo rendimiento, como el RAID 0 o el 10.

Archivos de datos

Los archivos de datos contienen los datos propiamente dichos de la base de datos. Es un archivo que puede ser muy grande y que requiere una buena velocidad tanto de lectura como de escritura. Por eso, lo ideal es almacenarlo en un nivel que ofrezca un buen equilibrio entre rendimiento, capacidad y seguridad, como el RAID 5 o el 6. 

TempDB

Este archivo almacena los datos temporales generados por las consultas y operaciones internas del servidor. Es un archivo muy utilizado y muy sensible al rendimiento, por lo que requiere una atención especial. Lo ideal es almacenarlo en un nivel que ofrezca la mayor velocidad posible, como el RAID 0 o el 10. Sin embargo, hay que tener en cuenta que el archivo temporal se borra cada vez que se reinicia SQL Server, por lo que no hay que preocuparse por la seguridad o la capacidad de los discos así que podremos alojarlos también en un disco SSD que no tengamos configurado en RAID.

Conclusión

Como vemos, no hay una respuesta única al nivel de RAID óptimo para SQL Server, sino que depende del tipo y la importancia de cada archivo. Como norma general, la opción RAID 10 parece la menos mala dando un buen compromiso entre rendimiento y profundidad. Sin embargo, es la opción más costosa así que no es la adecuada para todo el mundo. Lo más recomendable es analizar las características y necesidades específicas de cada caso y elegir el nivel que mejor se adapte a ellas. Tendremos que conocer bien el uso de nuestro servidor para poder priorizar una solución RAID sobre otra en caso de que no tengamos la posibilidad de implementar varias.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

CREDITOS: Hoy quiero dar las gracias a mi amigo Aurelio Montalvillo García, arquitecto de soluciones IT que revisó este post antes de su publicación y me aconsejó alguna mejora.

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 1 comentario

Cómo planificar una migración de SQL Server paso a paso

En este artículo quiero compartir con vosotros algunos consejos y buenas prácticas para planificar una migración exitosa de SQL Server. Se que este tipo de proyectos pueden ser complejos y desafiantes, pero también muy gratificantes si se hacen bien. Por eso, quiero ayudaros a evitar los errores más comunes y a aprovechar las herramientas y recursos disponibles.

Definir el alcance y los objetivos de la migración

Lo primero que hay que hacer es definir el alcance y los objetivos de la migración. ¿Qué versión de SQL Server queremos migrar? ¿A qué plataforma o servicio? ¿Qué nivel de compatibilidad necesitamos? ¿Qué impacto tendrá en el rendimiento, la seguridad y la disponibilidad de nuestros datos? Estas son algunas de las preguntas que debemos responder antes de empezar.

Identificar los objetos que hay que migrar

Debemos controlar todos los objetos de nuestra instancia y que no son de base de datos ya que no migran con un backup. Estos objetos pueden ser trabajos del Agente SQL, alertas, operadores, credenciales, claves, certificados, proxies, servidores vinculados, etc. Cada uno de estos objetos puede tener sus propias particularidades y requerimientos para la migración. Debemos analizarlos con detalle y planificar cómo migrarlos sin perder funcionalidad ni integridad.

Evaluar el estado actual de la instancia y base de datos

Cuando tengamos el escenario y los objetos a migrar, empezaremos a evaluar el estado actual de nuestra instancia y base de datos. Es importante identificar los posibles riesgos y problemas que podrían surgir durante el proceso. Para ello, podemos utilizar el Data Migration Assistant (DMA), una herramienta gratuita de Microsoft que nos permite analizar la compatibilidad, la calidad y la preparación de nuestra base de datos para la migración.

El DMA nos ofrece dos tipos de análisis: el de evaluación y el de migración. El análisis de evaluación nos permite detectar los posibles problemas de compatibilidad con la versión o plataforma destino. También nos va a sugerir mejoras en cuanto a rendimiento, seguridad y características modernas. El análisis de migración nos permite estimar el tiempo y el esfuerzo necesarios para realizar la migración, así como los pasos a seguir para llevarla a cabo.

En anteriores artículos hemos hablado en detalle sobre el DMA para realizar estos análisis. Os recomiendo que lo reviséis si queréis profundizar más en esta herramienta. Aquí os dejo el enlace.

Planificar las acciones necesarias para ejecutar la migración con éxito

Después de realizar los análisis con el DMA, tendremos una visión más clara de lo que implica la migración y podremos planificar las acciones necesarias para ejecutarla con éxito. Algunas de estas acciones pueden ser resolver los problemas de compatibilidad identificados por el DMA, ya sea modificando el código o aplicando las opciones de compatibilidad adecuadas. Además podremos optimizar el rendimiento y la seguridad de nuestra instancia y base de datos, aprovechando las recomendaciones del DMA y las características modernas de SQL Server.

Lo siguiente que debemos hacer es elegir el método más adecuado para realizar la migración, según el tamaño, la complejidad y los requisitos de nuestra instancia y base de datos. Podemos optar por usar el propio DMA, que nos permite migrar tanto el esquema como los datos, o usar otras herramientas como el SQL Server Migration Assistant (SSMA), el SQL Server Integration Services (SSIS) o el Azure Database Migration Service (DMS). También podemos buscar métodos de migración Online como replicaciones, log shipping, database mirroring o incluso Always On, dependiendo de si vamos a cambiar o no de versión. Os recomiendo la serie de post sobre alta disponibilidad para que conozcáis las ventajas y las limitaciones de cada uno de estos métodos.

Cuando tengamos claro cómo vamos a hacerlo, os recomiendo preparar un documento de Excel con todos los pasos de todos los equipos implicados indicando horarios estimados y el impacto que puede tener. Esto nos ayudará a preparar la migración y sobre todo a no tener problemas el día de la migración ya que al estar todo detallado no se nos olvidará nada. Es importante definir bien una serie de pruebas exhaustivas antes, durante y después de la migración, para asegurarnos de que todo funciona correctamente y no hay pérdida ni corrupción de datos. Además deberemos preparar un plan de contingencia por si algo sale mal durante la migración, que nos permita restaurar el estado anterior sin afectar al negocio.

Conclusión

Como veis, planificar una migración de SQL Server requiere un análisis previo y una ejecución cuidadosa. Pero no os preocupéis, porque desde www.soydba.es estamos aquí para acompañaros en todo el proceso y resolver todas vuestras dudas. Si queréis podéis pedírmelo y os haré llegar una plantilla de documento de migración que suelo usar yo para no dejarme nada.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio en SQL Server, 4 comentarios

DRP ¿Cómo sobrevivir a una caída total de las bases de datos?

Hoy nos sumergimos en las profundidades del Plan de Recuperación ante Desastres (DRP) en el mundo de las bases de datos. Los DRP son algo imprescindible para todos los que trabajamos con entornos de producción con cierta criticidad. Puede parecer algo lejano y muy avanzado si estás empezando en este mundo, pero no te preocupes, vamos a intentar aclarar el mar de acrónimos y jerga técnica que rodea este tema. 

¿Qué es un DRP?

Lo primero de todo sería aclarar que el DRP forma parte del BCP (plan de continuidad de negocio). En ocasiones se pueden llegar a confundir pero no son lo mismo. Mientras que un DRP es un plan técnico que se centra en recuperar la infraestructura, el BCP incluye mucha más información como los pasos necesarios para mitigar pérdidas y recuperar toda la organización. 

¿Para qué sirve el DRP?

Vale, ya hemos dicho que el DRP es un plan puramente técnico que recoge de la manera más detallada posible las acciones a realizar ante un incidente. Pero, ¿para qué sirve? Puede parecernos que algunas cosas son demasiado obvias para ponerlas en un documento y que nosotros como buenos DBAs sabemos que hay que hacer en caso de incidente. Sin embargo, tenéis que pensar que en caso de crisis, con la presión que vamos a tener encima, lo mejor es tener todo documentado y seguir un guion. El futuro de nuestra empresa estará en esa intervención y tendremos que estar a la altura.
Los beneficios de tener un DRP previamente pensado y documentado son varios, entre ellos podemos destacar:

  1. Reduce el tiempo de inactividad al máximo lo que se traduce en un mejor servicio para nuestros clientes y proveedores.
  2. Minimiza las pérdidas por inactividad al conseguir un mejor tiempo de respuesta.
  3. Reduce el estrés de la toma de decisiones. En un momento crítico, es de vital importancia que todo el mundo sepa cómo actuar y no pierda los nervios.
  4. Asegura que todo el mundo podrá volver a acceder a su información. 
  5. Nos ayuda a cumplir con la legislación vigente en entornos regulados.

Los 4+1 pasos para el éxito de nuestro DRP

Genial, necesitamos un DRP pero, ¿por dónde empezamos?. No te asustes que no es tan difícil. En tan solo 5 pasos vas a poder tenerlo todo atado ya verás.

1 Definiciones

Todo DRP debe empezar definiendo las necesidades de alcance y los objetivos del propio plan. Podríamos definir tres apartados dentro de este paso, el primero es el alcance es decir, qué servicios queremos tener cubiertos por el plan de recuperación.
Una vez que hemos definido el alcance o perímetro de nuestro DRP el siguiente apartado sería saber de que nos queremos proteger, pregúntate: ¿Qué podría pasar? ¿un apagón? ¿Un incendio? ¿Un ataque de ransomware? ¿O tal vez una ardilla se coma los cables del servidor? (Sí, eso también pasa. ¿Verdad compañeros?). 

Por último, sabiendo que queremos proteger y de que lo siguiente sería definir lo que se conoce como BIA (Business Impact Analysis) o análisis de impacto de negocio. Aquí, tendremos que colaborar con otras áreas de la empresa para conocer el impacto de una crisis en su actividad y la de nuestros clientes.

2 Diseñar las estrategias de recuperación

Ahora que sabemos qué y de qué nos tenemos que proteger llega el momento del cómo. Diseñaremos una estrategia de recuperación para cada uno de los incidentes previamente descritos. Por ejemplo, esta es una lista de los escenarios más comunes y alternativas para su recuperación.

INCIDENTEEstrategia de RECUPERACIÓN
Borrado accidental de datosRestaurar copia de seguridad
Indisponibilidad de una base de datos
  1. Restaurar copia de seguridad
  2. Balanceo a otro nodo del cluster
Indisponibilidad de un servidor
  1. Balanceo a otro nodo del cluster.
  2. Reinstalación + restaurar copias.
Indisponibilidad de un centro de datos (CPD)
  1. Balanceo a otra ubicación geográfica.
  2. Reinstalación en otra ubicación y restaurar copias

3 Procedimentar las estrategias de recuperación

Como hemos dicho, no tenemos que dar nada por sentado y tenemos que detallar todos los pasos por lo que es el momento de explicar paso a paso como realizar todas y cada una de las acciones descritas en el paso anterior. Cuanto más detalle mejor, no olvidéis detallar la ubicación de las copias de seguridad o las direcciones IP y nombre de los servidores de respaldo, por ejemplo.

Podemos partir de la tabla anterior y añadir otra columna con los pasos, como en este ejemplo:

INCIDENTEEstrategia de RECUPERACIÓNProcedimiento de ACTUACIÓN
Borrado accidental de datosRestaurar copia de seguridad
  1. Identificar el problema.
  2. Avisar a todos los usuarios afectados.
  3. Intentar reparar el problema.
  4. Restaurar copia de seguridad de las bases de datos desde \\NuestroNAS\Copias\NuestroServer\NuestraBD
    4.1 Verificar que hay espacio disponible y solucionarlo en caso que sea necesario.
    4.2 Restaurar la base de datos.
  5. Probar que todo funciona.
  6. Avisar a los usuarios de que se ha resuelto la incidencia
  7. Monitorizar el correcto funcionamiento

4 Estimación de tiempos e impacto

Ya hemos visto todo lo que hay que hacer y como, es el momento de documentar cuánto tiempo vamos a tardar en cada uno de los escenarios y cual va a ser el impacto en los sistemas. Esto es lo que técnicamente se conoce como RPO y RTO que son las siglas en inglés de punto de recuperación objetivo y tiempo de recuperación objetivo.

El RPO hace referencia al máximo tiempo de pérdida de datos admisible, por ejemplo si tenemos una copia de seguridad diaria, en caso de fallo del servidor principal podremos tener hasta 24 horas de pérdida de datos.

El RTO es un poco más difícil de calcular, y seguramente tendremos que hacer pruebas para saberlo con exactitud, y hace referencia al tiempo que tardaremos en tener el servicio operativo nuevamente. Si en este punto hemos hecho todo bien, los RPO y RTO de las estrategias de recuperación estarán dentro de los márgenes admisibles que definimos en el paso número 2. 

5 Paso EXTRA: Revisión y pruebas

Aunque con los 4 pasos anteriores teóricamente habríamos completado nuestro DRP es importante que lo pongamos en práctica y que comprobemos que realmente funciona como habíamos pensado. Esto no hay que hacerlo solo una vez y olvidarnos, nuestras bases de datos son sistemas vivos que van cambiando día a día por lo que al menos una vez al año deberíamos hacer el ejercicio de probar el DRP y en caso de que sea necesario modificarlo para que se adapte a la situación actual de los sistemas. Este paso es el más importante y, en ocasiones, habrá entidades reguladoras que nos exijan evidencias de éxito de estos DRP Test.

Conclusión

Los DRP son imprescindibles para cualquier empresa que tenga sistemas en producción. Ya sea porque un regulador lo establece, porque estás tratando de adecuarte a la ISO 27001 o porque has pensado que este tipo de planes son importantes para ti, espero que este post te haya ayudado a resolver las dudas que tenías antes de empezar a leer. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio en Alta Disponibilidad, SQL Server, 1 comentario

Explorando Change Data Capture (CDC) en SQL Server

¡Saludos, apasionados del mundo de las bases de datos! Hoy, como parte de nuestro viaje por los recovecos más fascinantes del universo SQL, nos sumergiremos en las profundidades de Change Data Capture (CDC). ¿Estáis listos? 

¿Qué es CDC y por qué debería importarnos?

CDC es la abreviatura de Change Data Capture. Pero no os dejéis engañar por su nombre modesto. Detrás de esas tres letras se esconde una funcionalidad asombrosa que nos permite rastrear los movimientos de nuestras tablas como verdaderos detectives de datos.

Imaginad esto: cada vez que alguien inserta, actualiza o elimina filas en una tabla, CDC está ahí, tomando notas meticulosas. ¿Cómo lo hace? Pues bien, Change Data Capture utiliza el SQL Server Agent para registrar esos cambios en el registro de transacciones. Sí, ese mismo registro que almacena los secretos de todas las operaciones que ocurren en nuestra base de datos.

Habilitar y Deshabilitar CDC

Habilitar CDC para una base de datos

Antes de poder crear una captura para tablas individuales, debemos habilitar la captura de datos modificados para la base de datos. Aquí está el hechizo mágico: ejecuten el procedimiento almacenado sys.sp_cdc_enable_db en el contexto de la base de datos. Si deseamos verificar si una base de datos ya tiene Change Data Capture habilitada, podemos mirar la columna is_cdc_enabled en la vista sys.databases. Cuando una base de datos tiene la captura de datos modificados habilitada, se crean objetos como el esquema cdc, el usuario cdc, las tablas de metadatos y otros objetos de sistema. El esquema cdc contiene las tablas de metadatos de la captura de datos modificados y, una vez que las tablas de origen han sido habilitadas para esta captura, también contiene las tablas de cambios individuales que sirven como repositorio de los datos de cambios. Este esquema cdc también contiene las funciones de sistema asociadas que se usan para consultar los datos modificados. La captura de datos modificados requiere el uso exclusivo del esquema cdc y del usuario cdc. Si ya existe un esquema o usuario de base de datos llamado cdc, deberemos borrarlo o cambiarle el nombre antes de habilitar CDC.

Usaremos este script para habilitar Change Data Capture en una base de datos

Deshabilitar CDC para una base de datos

Para deshabilitar la captura de datos modificados para una base de datos, utilizaremos el procedimiento almacenado de sistema sys.sp_cdc_disable_db en el contexto de la base de datos. No es necesario deshabilitar Change Data Capture para tablas individuales antes de deshabilitarlo para la base de datos. Cuando se deshabilita Change Data Capture para la base de datos, se eliminan todos los metadatos asociados, incluidos el usuario cdc, el esquema y los trabajos de captura de datos modificados.

Los jobs de SQL de CDC

Cuando Change Data Capture se habilita, se crea un job del Agente SQL Server para la captura de datos y otro de limpieza. Estos jobs rellenan y mantienen las tablas de cambios de CDC por lo que son imprescindibles para su funcionamiento. Así que, no olvidéis controlar esos jobs del Agente SQL para aseguraros de que Change Data Capture funcione.

Anécdota personal: Una vez me pidió ayuda un compañero porque no era capaz de reducir el log de una base de datos. Había seguido todos los pasos, backup Log + Shrink y nada. No había transacciones en ejecución pero ese log no se reducía. Estaba a punto de llenar completamente el disco duro y detener la producción generando una incidencia crítica. Pues bien, resulta que con CDC habilitado pero sin los jobs de Change Data Capture en ejecución las transacciones se quedan en el log y pueden llegar a llenarlo como pudimos comprobar. Dicho así tiene sentido ¿verdad? Pues es algo que no sale en los libros de SQL ni en la documentación y que tenéis que tener muy en cuenta.

Consultando los Datos Capturados

Una vez que hemos habilitado Change Data Capture para nuestra base de datos, es hora de sumergirnos en los datos capturados. ¿Cómo podemos acceder a esa valiosa información? Aquí están los pasos:

Consultar las Tablas de Cambio:

Podemos consultar el esquema cdc. En él encontraremos las tablas de cambios que almacenan los datos modificados. Estas tablas tienen nombres como cdc.dbo_MiTabla_CT (donde dbo es el nombre del esquema origen y MiTabla es el nombre de la tabla original). Utilizaremos  consultas SQL para acceder a estas tablas y descubrir qué filas han sido insertadas, actualizadas o eliminadas. ¡Es como leer las páginas de un emocionante diario!

Funciones de Sistema CDC:

Change Data Capture nos proporciona funciones de sistema específicas para consultar los datos modificados. Algunas de las más útiles son:

  • cdc.fn_cdc_get_all_changes_<capture_instance>: Devuelve todos los cambios desde el inicio de la captura.
  • cdc.fn_cdc_get_net_changes_<capture_instance>: Devuelve solo los cambios netos (última versión de cada fila modificada).
  • cdc.fn_cdc_get_ddl_history_<capture_instance>: Muestra los cambios en la estructura de la tabla.

Filtros y Consultas Personalizadas:

Combinando estos métodos tendremos a nuestra disposición toda la información de Change Data Capture y el historial de nuestros datos. Ahora solo nos hace falta aplicar filtros a las tablas de cambio para consultar solo los datos relevantes para nosotros. 

Requisitos y Consideraciones

Antes de sumergirse en el mundo de Change Data Capture hay algunas cosas que debemos tener en cuenta:

  • Modo de Recuperación de la Base de Datos: Change Data Capture puede funcionar con cualquier nivel de recuperación de la base de datos. Esto no es ningún problema.
  • Espacio en Disco: Las tablas de cambio pueden ocupar espacio significativo en disco, así que asegúrense de tener suficiente almacenamiento.
  • Permisos: Para poder habilitar o deshabilitar Change Data Capture tendremos que tener permisos de sysadmin ya que, como hemos visto, el cambio afecta a varios apartados de SQL Server.
  • SQL Server Agent: Como mencionamos anteriormente, el Agente SQL Server desempeña un papel crucial en el funcionamiento de CDC. Debemos asegurarnos de que el agente está funcionando y habilitado y de que los jobs estén funcionando correctamente.

En Resumen

En resumen, Change Data Capture es el mejor amigo de las aplicaciones ETL. Nos proporciona un flujo constante de datos modificados, listo para ser consumido por nuestras ETL. ¡Es como si CDC nos diera un pase VIP al backstage de la base de datos! Pero como DBAs tenemos que vigilarlo y tener mucho cuidado con el espacio que consume y con sus jobs.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio en SQL Server, 0 comentarios

SQL Injection ¿Qué es y cómo prevenirlo?

En el mundo de las bases de datos, y en la informática en general, la seguridad es un aspecto fundamental que no podemos descuidar. Nuestros datos son un activo valioso que debemos proteger de posibles ataques o intrusiones que puedan poner en riesgo su confidencialidad, su integridad o su disponibilidad. Entre los tipos de ataques más frecuentes y peligrosos que podemos sufrir se encuentran los ataques de SQL Injection. ¿Sabes en qué consisten y cómo puedes prevenirlos y detectarlos en tus SQL Server? En este artículo, te lo contamos.

¿Qué son los ataques de SQL Injection?

Los ataques de SQL Injection son una de las amenazas más comunes y peligrosas que pueden sufrir nuestros SQL Server. Se trata de una técnica que consiste en introducir código malicioso en las consultas SQL que se envían desde una aplicación web, con el fin de obtener información sensible, modificar o eliminar datos, ejecutar comandos arbitrarios o incluso tomar el control del servidor. Como DBAs, tenemos la responsabilidad de proteger nuestros SQL Server de estos ataques y evitar que se comprometa la seguridad y la integridad de nuestros datos.

Otros tipos de ataques que podemos sufrir en nuestros SQL Server

Los ataques de SQL Injection no son los únicos que pueden poner en peligro nuestros SQL Server. Existen otros tipos de ataques que también debemos tener en cuenta y prevenir. Por ejemplo, los ataques de fuerza bruta, que consisten en intentar adivinar las contraseñas de los usuarios de la base de datos mediante la prueba de múltiples combinaciones posibles. O los ataques de denegación de servicio (DoS), que consisten en enviar una gran cantidad de peticiones al servidor para saturarlo y hacer que no pueda responder a las solicitudes legítimas. O los ataques de phishing, que consisten en engañar a los usuarios para que revelen sus credenciales o información personal mediante el uso de correos electrónicos o páginas web falsas. Todos estos ataques pueden tener consecuencias graves para nuestros datos y nuestros servidores, por lo que debemos estar alerta y tomar las medidas adecuadas para evitarlos.

¿Cómo prevenir los ataques de SQL Injection?

Lo principal para prevenir este tipo de ataques es seguir las buenas prácticas de desarrollo y diseño de nuestras aplicaciones web. Esto implica usar siempre parámetros en las consultas SQL, evitar la concatenación de cadenas, validar y filtrar las entradas del usuario, usar roles y permisos adecuados para los usuarios de la base de datos, etc. Estas medidas nos ayudarán a evitar que los atacantes puedan inyectar código malicioso en nuestras consultas SQL y acceder a nuestros datos. Como ves, esto no está en nuestra mano como DBAs. Sin embargo si que debemos desde nuestro lado, llevar a cabo otra serie de acciones.

¿Cómo detectar los ataques de SQL Injection?

Lo que si está en nuestra mano deberíamos hacer es monitorizar y auditar la actividad de nuestros SQL Server, sobre todo los de producción. Esto implica usar herramientas como Extended Events, SQL Server Audit o incluso el análisis de trazas y logs de transacciones para capturar y analizar las consultas SQL que se ejecutan en nuestros servidores. De esta forma, podremos detectar posibles intentos de ataque o anomalías en el comportamiento de las aplicaciones. También podremos identificar las vulnerabilidades o los puntos débiles de nuestro sistema y corregirlos a tiempo.

Otra herramienta que debemos tener en cuenta es el libro de contabilidad (ledger) como una herramienta adicional para registrar todas las transacciones que se realizan en nuestros SQL Server. A esta herramienta ya le dedicamos un artículo entero pero, resumiendo, es un registro inmutable y verificable que nos permite rastrear el origen y el destino de cada operación, así como detectar posibles fraudes o manipulaciones.

Mitigar los ataques de SQL Injection

Otro aspecto importante que debemos hacer es aplicar las actualizaciones y los parches de seguridad que Microsoft publique para nuestros SQL Server. Esto implica estar atentos a las novedades y los boletines de seguridad que se emitan periódicamente y descargar e instalar las versiones más recientes de nuestros productos. De esta forma, podremos aprovechar las mejoras y las correcciones que se hayan implementado para prevenir o mitigar los ataques, ya sean SQL Injection o cualquier otro tipo.

Medidas de seguridad pasiva

Además de las medidas preventivas, de detección y correctivas que hemos visto, también debemos contar con medidas de seguridad pasiva que nos permitan recuperarnos en caso de sufrir un ataque exitoso. Una de estas medidas es realizar copias de seguridad periódicas y completas de nuestros datos y nuestros servidores. De esta forma, podremos restaurar el estado anterior de nuestro sistema y minimizar la pérdida de información o la corrupción de datos. También debemos tener un plan de contingencia y de recuperación ante desastres que nos permita reaccionar rápidamente y restablecer el servicio lo antes posible.

Conclusión

Como hemos visto, los ataques de SQL Injection son una amenaza real y grave para nuestros SQL Server. Como DBAs, tenemos el deber de proteger nuestros datos y nuestros servidores de estos ataques. Para ello, debemos seguir las buenas prácticas de desarrollo y diseño, monitorizar y auditar la actividad de nuestros SQL Server, aplicar las actualizaciones y los parches de seguridad que se publiquen y contar con medidas de seguridad pasiva como copias de seguridad. Así, podremos garantizar la seguridad y la integridad de nuestros datos y ofrecer un servicio óptimo a nuestros usuarios.

Espero que este artículo te haya resultado útil e interesante. Si tienes alguna duda o comentario, no dudes en contactarnos en Twitter o por mail o dejarnos un mensaje en los comentarios de aquí abajo. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir.

Publicado por Roberto Carrancio en SQL Server, 2 comentarios

TempDB SQL Server ¿Qué es y para qué sirve?

Hoy vamos a hablar de un tema muy interesante y relevante para los DBA: la TempDB de SQL Server. En este artículo vamos a intentar explicar qué es la TempDB, para qué sirve, cómo optimizarla y qué recomendaciones hay seguir para gestionarla correctamente.

¿Qué es la TempDB de SQL Server?

La TempDB es una base de datos especial que SQL Server utiliza para almacenar datos temporales, como tablas temporales, variables de tabla, cursores, versiones de filas, resultados intermedios de consultas, etc. Esta base de datos se crea cada vez que se inicia el servicio de SQL Server y se borra al apagarlo. Por lo tanto, no es necesario hacer copias de seguridad ni restauraciones de ella

¿Por qué es importante la TempDB para el rendimiento de SQL Server?

La TempDB es muy importante para el rendimiento y la estabilidad de SQL Server, ya que se usa en casi todas las operaciones que realiza el motor de base de datos. Si está mal configurada o tiene problemas de contención, puede afectar negativamente a todo el sistema. Por eso, es fundamental seguir las mejores prácticas que proporciona Microsoft en su documentación. Muchas veces hemos hablado de estas buenas prácticas en otros artículos pero hoy vamos a profundizar un poco más sobre ellas.

¿Por qué se llena la TempDB?

Como hemos dicho, es una base de datos que interviene en la mayoría de operaciones de SQL Server. Es lógico pensar que es de las bases de datos con más uso entonces, pero hay varias razones que pueden hacer que crezca en exceso. Veámoslo:

  • El uso excesivo de datos temporales por parte de las aplicaciones o los usuarios. Esto puede generar un gran número de objetos temporales que ocupan espacio en la TempDB hasta que se eliminan o se desconecta la sesión que los creó.
  • El uso de características que requieren versiones de fila, como el aislamiento de instantáneas o el aislamiento mediante versiones de fila. Esto puede generar un gran volumen de versiones de fila que se almacenan en el almacén de versiones de la TempDB hasta que se liberan o se desencadenan.
  • El uso de la TempDB como espacio de intercambio cuando se llena la memoria RAM del servidor. Esto puede ocurrir cuando se realizan operaciones que generan grandes volúmenes de datos intermedios o finales que no caben en memoria y tienen que ser escritos en disco.

Cuando la TempDB se llena, puede provocar errores en las operaciones que dependen de ella y afectar al rendimiento general del sistema. Por eso, es importante monitorizar el uso y el crecimiento de la TempDB y tomar medidas preventivas o correctivas para evitar que se llene.

Uso de la TempDB como espacio de intercambio

Otro aspecto a considerar es el uso de la TempDB como espacio de intercambio cuando se llena la memoria RAM del servidor. SQL Server puede usar la TempDB para almacenar los resultados intermedios o finales que no caben en memoria y que tienen que ser escritos en disco. Esto puede ocurrir cuando se realizan operaciones como ordenaciones, combinaciones hash o agregados hash. Este uso puede aumentar considerablemente el tamaño y la actividad de la TempDB y afectar al rendimiento general del sistema. Cuando esto pase veremos un aviso de alerta en los planes de ejecución de las consultas. Para evitarlo o minimizarlo, se recomienda lo siguiente:

  • Aumentar la memoria RAM del servidor para que pueda albergar más datos en memoria y reducir la necesidad de usar la TempDB como espacio de intercambio si es necesario.
  • Optimizar las consultas que generan grandes volúmenes de datos temporales, usando índices adecuados, estadísticas actualizadas, planes de ejecución óptimos y técnicas de programación eficientes.
  • Monitorizar el uso de la TempDB como espacio de intercambio, usando el monitor de rendimiento o los DMV sys.dm_db_task_space_usage (devuelve la actividad de asignación y desasignación de páginas por tarea de la base de datos) y sys.dm_db_session_space_usage (devuelve el número de páginas asignadas y desasignadas por cada sesión en la base de datos).

¿Cómo optimizar la TempDB de SQL Server?

Para optimizar la TempDB de SQL Server, hay que tener en cuenta varios aspectos, como el tamaño, el número de archivos, la ubicación, la caché y el uso de datos temporales. A continuación, os damos algunas recomendaciones que podéis aplicar para mejorar el funcionamiento de la TempDB.

Tamaño de la TempDB

Asignar un tamaño adecuado a la TempDB para evitar el crecimiento automático, que puede causar fragmentación y pérdida de rendimiento. Se puede usar el monitor de rendimiento o el DMV sys.dm_db_file_space_usage (devuelve información de uso del espacio para cada archivo de datos de la base de datos) para estimar el espacio necesario. La TempDB se llena cuando los datos temporales ocupan todo el espacio asignado y no hay más espacio disponible en el disco. Para evitar esto, se debe monitorizar el uso de la TempDB y ampliar su tamaño si es necesario.

Número de archivos de la TempDB

Crear varios archivos de datos para la TempDB, uno por cada núcleo del procesador, hasta un máximo de 8. Los archivos deben tener el mismo tamaño y el mismo factor de crecimiento, hasta SQL 2016 debiamos activar la traza  -T1117 en el arranque para que todos los ficheros crezcan simultáneamente pero en las nuevas versiones ya no es necesario. Esto ayuda a reducir la contención en las estructuras internas de la base de datos, como los PFS, GAM y SGAM por lo que mejora el rendimiento. Los PFS son las páginas que almacenan los bits que indican si una página está libre o usada. Los GAM son las páginas que almacenan los bits que indican si un intervalo de páginas está libre o usado. Los SGAM son las páginas que almacenan los bits que indican si un intervalo de páginas tiene al menos una página libre.

Ubicación de la TempDB

Colocar la TempDB en una unidad de disco diferente a las demás bases de datos, preferiblemente en un disco SSD o en una SAN con alto rendimiento y baja latencia. Esto mejora la velocidad de lectura y escritura de los datos temporales.

Caché de planes de ejecución

Habilitar la opción «optimize for ad hoc workloads» en las propiedades del servidor, para evitar que se almacenen en la caché los planes de ejecución de consultas que solo se usan una vez.

Uso de datos temporales

Evitar el uso excesivo de tablas temporales, variables de tabla y cursores, y usar alternativas como tablas derivadas, CTE o funciones escalares. Esto reduce la carga de trabajo sobre la TempDB y mejora la eficiencia de las consultas.

¿Cómo vaciar la TempDB?

En algunos casos, puede ser necesario vaciar la TempDB para liberar espacio en disco o resolver problemas de contención o corrupción. Para ello, se pueden usar los siguientes métodos:

– Usar el comando DBCC SHRINKDATABASE o DBCC SHRINKFILE. Estos comandos permiten reducir el tamaño de la TempDB o de sus archivos individuales, liberando el espacio no usado. Estos comandos se pueden ejecutar mientras el servidor está en funcionamiento, pero pueden causar bloqueos, interbloqueos o pérdida de rendimiento. Además, no garantizan que se pueda reducir el tamaño deseado, ya que dependen del uso y la distribución de los datos temporales. Podemos usar este script:

– Reiniciar el servicio de SQL Server. Esto hará que se vuelva a crear la TempDB con el tamaño configurado y se eliminen todos los datos temporales que había en ella. Este método es el más sencillo, pero requiere detener el servidor y afecta a todas las bases de datos y conexiones. Será nuestro último recurso y lo evitaremos siempre que sea posible.

Conclusión

Esperamos que este artículo os haya sido útil y os animamos a seguir aprendiendo sobre SQL Server con nosotros. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 2 comentarios