SQL Server

Aquí encontraras todos nuestros post relacionados con SQL Server desde cero hasta un nivel avanzado. Desde infraestructura hasta modelado de datos.

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

Github Copilot: La IA generativa de SQL

Hoy os traigo una novedad que me ha dejado impresionado y que creo que va a revolucionar el mundo de las consultas SQL: se trata del complemento «Github Copilot» para Azure Data Studio. ¿Te imaginas poder escribir consultas SQL con solo escribir unas pocas palabras? ¿O que una inteligencia artificial te sugiera el código más óptimo para tu base de datos? Pues esto ya es posible gracias al complemento «Github Copilot» para Azure Data Studio, una herramienta que te permite crear código SQL asistido por IA.

¿Qué es Github Copilot para Azure Data Studio?

Github Copilot es un complemento que se integra con Azure Data Studio, el entorno de desarrollo integrado (IDE) para trabajar con bases de datos SQL Server, Azure SQL Database y Azure Synapse Analytics. Con Github Copilot, puedes escribir consultas SQL de forma rápida y sencilla, aprovechando el conocimiento de millones de líneas de código público y privado. Con este complemento, podéis escribir comentarios en vuestros scripts SQL y ver cómo el asistente os sugiere posibles consultas que se ajusten a lo que queréis hacer. Podéis aceptar la sugerencia, modificarla o ignorarla, según vuestras preferencias. Además, el complemento os muestra la documentación relevante y los ejemplos de uso de cada consulta, para que podáis entender mejor lo que estáis haciendo.

¿Cómo funciona Github Copilot? 

Muy simple. La IA Generativa de Copilot funciona mediante modelos matemáticos que aprenden de grandes cantidades de datos y que son capaces de producir nuevos datos siguiendo las mismas características y patrones. Estos modelos se entrenan con algoritmos de aprendizaje automático, que les permiten mejorar su rendimiento con cada iteración.

Para generar código SQL con Github Copilot, solo tienes que escribir un comentario en tu editor de código Azure Data Studio, describiendo lo que quieres hacer en lenguaje natural. Este comentario se llama prompt, y es la entrada que le das al modelo de IA Generativa para que te devuelva el código SQL correspondiente. El modelo de IA Generativa buscará en su base de datos el código SQL más apropiado para tu prompt, y te lo mostrará en tu editor. En cuanto más detalles incluya nuestro prompt mejor será el resultado

Ejemplos de uso de Github Copilot

Como hemos dicho, para que la IA de Copilot empiece a escribir consultas por nosotros basta con escribir lo que queremos en un comentario y darle al intro. Por ejemplo esto que veis en la imagen. En verde podéis leer mi prompt en un comentario “Usa sintaxis TSQL para devolver los 25 usuarios con más votos. Usa las columnas user.id y votes.userid para enlazar las tablas y cuenta el número de votos de cada usuario. Ordena de mayor a menor número de votos. Si dos usuarios tienen el mismo número de votos, ordena por id de usuario de forma ascendente.” y a continuación la consulta resultante:

Pero eso no es todo. Github Copilot también te ofrece sugerencias alternativas de código, por si quieres explorar otras opciones o mejorar tu consulta. Además, Github Copilot aprende de tu estilo de código y se adapta a tus preferencias y convenciones. Así, podrás escribir código SQL más personalizado y eficiente.

En mis pruebas, no solo he podido crear consultas SQL complejas con solo escribir unas pocas palabras, ahorrando tiempo y esfuerzo. Además, esta IA ha aplicado algunas técnicas y trucos de optimización, mejorando así el rendimiento de mis consultas.

Un ejemplo:

Y este ha sido el resultado:

Pruébalo tu mismo

Si quieres probar Github Copilot, necesitarás tener una cuenta de Github y una suscripción a Github Copilot, que actualmente tiene un coste de aproximadamente 10€ al mes aunque el primer mes es gratis. También necesitarás tener instalado Azure Data Studio (se instala junto al SSMS) y el complemento «Github Copilot for Azure Data Studio». Una vez instalado, podrás iniciar sesión y empezar a disfrutar de la magia de la IA Generativa aplicada al código SQL.

Conclusión:

Github Copilot es una herramienta muy útil para los desarrolladores y administradores de bases de datos, ya que nos permite ahorrar tiempo y esfuerzo en la creación de consultas SQL. Además, puede ayudarnos a aprender nuevas técnicas y buenas prácticas de código SQL, ya que nos muestra el código más adecuado para cada situación. Sin embargo, hay que ser precavido. A día de hoy estas herramientas no están del todo pulidas y aún cometen errores. Aunque son muy útiles para no tener que empezar desde 0 y tener una base sobre la que empezar a trabajar no sustituyen nuestro criterio profesional.  

Github Copilot es una herramienta revolucionaria que cambiará la forma de trabajar con bases de datos. Con Github Copilot, podrás crear consultas SQL más rápidas y eficientes. ¿A qué esperas para probarlo? Déjame en comentarios tu experiencia. 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

Snapshots de bases de datos SQL Server

En este artículo vamos a explicar qué son los snapshots de base de datos en SQL Server y cómo pueden ayudarnos a mejorar el rendimiento y la disponibilidad de nuestros sistemas. Los snapshots son una forma de crear una imagen instantánea de una base de datos en un momento determinado, sin necesidad de realizar una copia física de los datos. Esto es muy útil ya que nos permite crear una imagen de solo lectura de una base de datos en un momento determinado. Nos permite acceder a los datos tal y como estaban en el momento del snapshot, sin afectar a las operaciones normales de la base de datos.

¿Qué son los snapshots de base de datos y para qué sirven?

Un snapshot de base de datos es una vista estática de una base de datos que captura el estado de los datos y el esquema en el momento de su creación. Un snapshot se almacena en un archivo especial llamado archivo disperso (sparse files), que solo contiene las páginas modificadas desde la creación del snapshot. Esto significa que un snapshot ocupa muy poco espacio y se crea casi instantáneamente. De esta forma, cuando accedemos a un snapshot, SQL Server lee los datos directamente de la base de datos original, salvo que haya habido algún cambio, en cuyo caso lee los datos del archivo disperso.

Ventajas los snapshots de base de datos

Los snapshots de base de datos tienen varias ventajas:

  • Nos permiten acceder a los datos históricos sin afectar al rendimiento ni a la disponibilidad de la base de datos original.
  • Nos facilitan la recuperación ante errores humanos, como borrados o actualizaciones accidentales, ya que podemos restaurar la base de datos original a partir del snapshot.
  • Nos ayudan a realizar tareas de mantenimiento o pruebas sin riesgo, ya que podemos trabajar sobre el snapshot sin modificar la base de datos original.
  • Nos ofrecen una forma sencilla de realizar copias de seguridad consistentes con la aplicación, ya que podemos hacer una copia de seguridad del snapshot en lugar de la base de datos original.

Limitaciones de los snapshots de base de datos

Los snapshots de base de datos también tienen algunas limitaciones que debemos tener en cuenta:

  • Solo se pueden crear sobre bases de datos que usen el modelo de recuperación completo o el modelo bulk-logged.
  • No se pueden crear sobre bases de datos del sistema ni sobre bases de datos que contengan tablas con columnas FILESTREAM o columnstore.
  • No se pueden modificar ni actualizar, solo se pueden consultar en modo lectura.
  • No se pueden hacer copias ni traslados, solo se pueden eliminar o restaurar.
  • No se pueden usar para replicar ni distribuir los datos a otras bases de datos o servidores.
  • No garantizan la consistencia transaccional ni la integridad referencial entre las bases de datos relacionadas.

¿Cómo crear un snapshot de base de datos?

Para crear un snapshot de base de datos en SQL Server necesitamos tener permisos de administrador o pertenecer al rol db_owner. Además, la base de datos original debe estar en línea y no debe tener ninguna operación pendiente, como una restauración o una copia.

El comando para crear un snapshot es el siguiente:

CREATE DATABASE <nombre_snapshot> ON (NAME = <nombre_archivo_logico>, FILENAME = ‘<ruta_archivo_disperso>’) AS SNAPSHOT OF <nombre_base_de_datos>;

Podemos crear varios snapshots de la misma base de datos, siempre que les demos nombres distintos y archivos dispersos diferentes. También podemos especificar más de un archivo disperso si la base de datos original tiene más de un archivo lógico.

¿Cómo acceder a un snapshot de base de datos?

Para acceder a un snapshot de base de datos podemos usar cualquier herramienta o aplicación que se conecte a SQL Server, como el Management Studio o el SQLCMD. Solo tenemos que usar el nombre del snapshot como si fuera una base de datos normal. Por ejemplo, para consultar el snapshot que acabamos de crear podemos usar el siguiente comando:

USE  <nombre_snapshot>; 

SELECT * FROM <tabla>;

Al acceder a un snapshot, SQL Server lee las páginas directamente del archivo disperso si han sido modificadas desde la creación del snapshot, o del archivo original si no han sido modificadas. Esto implica que el rendimiento puede verse afectado si hay muchas modificaciones en la base de datos original.

¿Cómo restaurar una base de datos a partir de un snapshot?

Una de las principales utilidades de los snapshots es poder restaurar una base de datos a un estado anterior en caso de error o necesidad. Para ello, tenemos que usar el comando RESTORE DATABASE WITH SNAPSHOT. Este comando elimina la base de datos original y la reemplaza por el snapshot, conservando el nombre y los archivos originales. El comando es el siguiente:

RESTORE DATABASE <nombre_base_de_datos> FROM DATABASE_SNAPSHOT = <nombre_snapshot>;

Al restaurar una base de datos desde un snapshot, SQL Server aplica las páginas modificadas desde el archivo disperso al archivo original, y elimina el archivo disperso y el snapshot. Este proceso puede tardar más o menos tiempo dependiendo del tamaño y el número de páginas modificadas.

¿Cómo eliminar un snapshot de base de datos?

Si ya no necesitamos un snapshot de base de datos, podemos eliminarlo usando el comando DROP DATABASE. Este comando elimina el snapshot y el archivo disperso asociado, liberando el espacio ocupado. El comando es el siguiente:

DROP DATABASE <nombre_snapshot>;

Al eliminar un snapshot, SQL Server no afecta a la base de datos original ni a los otros snapshots que pueda tener.

 Conclusión

Los snapshots de base de datos en SQL Server son una herramienta muy poderosa que nos permite crear imágenes de solo lectura de una base de datos en un momento determinado, con un mínimo consumo de espacio y tiempo. Los snapshots nos facilitan el acceso a los datos históricos, la recuperación ante errores, el mantenimiento y las pruebas, y la realización de copias de seguridad consistentes. Para crear, acceder, restaurar y eliminar snapshots solo necesitamos unos pocos comandos que podemos ejecutar desde cualquier herramienta o aplicación que se conecte a SQL Server.

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

¿Qué es Target Recovery Time y cómo configurarlo en SQL?

En este artículo vamos a hablar de una configuración muy importante para el rendimiento y la recuperación de nuestras bases de datos en SQL Server: el Target Recovery Time. Esta configuración nos permite especificar el tiempo máximo que queremos que tarde SQL Server en recuperar una base de datos después de un fallo o un reinicio. ¿Por qué es importante esto? Porque afecta directamente a la frecuencia y el tamaño de los checkpoints que se realizan en la base de datos, y por tanto, al uso de los recursos de disco y memoria.

¿Qué son los checkpoints y cómo funcionan?

Los checkpoints son operaciones que escriben las páginas modificadas en memoria (dirty pages) al disco, para mantener la consistencia entre el buffer pool y los archivos de datos. Como ya vimos en nuestro artículo sobre Checkpoints en SQL Server, los checkpoints se pueden realizar por diferentes motivos: porque el sistema lo decide automáticamente, porque lo forzamos manualmente, porque hacemos un backup, porque cambiamos el estado de la base de datos, etc. Cada checkpoint tiene un impacto en el rendimiento, ya que consume recursos de E/S y puede generar contención con otras operaciones. Además, cada checkpoint determina el punto de inicio de la recuperación de la base de datos, ya que SQL Server solo tiene que rehacer o deshacer las transacciones que ocurrieron después del último checkpoint.

¿Qué es el Recovery Interval y cómo se usa?

Por defecto, SQL Server usa un algoritmo llamado Automatic Checkpoint para decidir cuándo hacer un checkpoint. Este algoritmo se basa en el Recovery Interval, que es un valor global para todas las bases de datos que indica el tiempo aproximado que queremos que tarde la recuperación. El valor por defecto del Recovery Interval es 0, lo que significa que SQL Server intentará que la recuperación tarde menos de un minuto. Para conseguir esto, SQL Server estima cuántas transacciones puede recuperar en un minuto, y hace un checkpoint cuando se alcanza ese número. Sin embargo, este algoritmo tiene algunos inconvenientes: no tiene en cuenta el tamaño o la duración de las transacciones, ni el impacto que tienen los checkpoints en el rendimiento. Además, el Recovery Interval es un valor aproximado, no una garantía, y solo se aplica a las bases de datos que usan el modelo de recuperación Simple o Bulk-Logged.

¿Qué es el Target Recovery Time y cómo se usa?

Para solucionar estos problemas, SQL Server introdujo una nueva opción a partir de la versión 2012: el Target Recovery Time. Esta opción nos permite especificar el tiempo máximo de recuperación para cada base de datos individualmente, independientemente del modelo de recuperación que use. El valor por defecto del Target Recovery Time es 0 para las versiones anteriores a 2016, y 60 para las versiones 2016 o posteriores. Esto significa que si usamos una versión anterior a 2016, se usa el algoritmo del Recovery Interval por defecto, pero si usamos una versión 2016 o posterior, se usa el algoritmo Indirect Checkpoint por defecto con un tiempo máximo de recuperación de 60 segundos. Pero si le damos un valor distinto de 0 (en versiones anteriores a 2016) o distinto de 60 (en versiones 2016 o posteriores), SQL Server usará el algoritmo Indirect Checkpoint con el valor especificado. Este algoritmo hace checkpoints más frecuentes y más pequeños, para asegurar que el tiempo de recuperación no supere el valor especificado. Además, este algoritmo tiene en cuenta el tamaño de las transacciones y el impacto de los checkpoints en el rendimiento, y ajusta la frecuencia y el tamaño de los checkpoints dinámicamente.

¿Qué ventajas e inconvenientes tiene usar el Target Recovery Time?

¿Qué ventajas tiene usar el Target Recovery Time y el Indirect Checkpoint? Pues varias:

  • Podemos tener un control más fino sobre el tiempo de recuperación de cada base de datos, y ajustarlo según nuestras necesidades.
  • Podemos reducir el tiempo de recuperación y mejorar la disponibilidad de nuestras bases de datos.
  • Podemos reducir el impacto de los checkpoints en el rendimiento, ya que se hacen más pequeños y más frecuentes.
  • Podemos reducir la presión sobre el buffer pool, ya que se liberan más rápidamente las páginas modificadas.
  • Podemos mejorar la compatibilidad con las nuevas características de SQL Server, como Accelerated Database Recovery (ADR), que requiere usar Indirect Checkpoint para funcionar correctamente.

¿Y qué inconvenientes tiene? Pues también algunos:

  • Podemos aumentar el consumo de recursos de disco, ya que se hacen más escrituras al hacer más checkpoints.
  • Podemos aumentar la fragmentación interna y externa de los archivos de datos, ya que se escriben más páginas en diferentes posiciones.
  • Podemos aumentar el riesgo de corrupción de datos, si hay algún problema con el hardware o con el sistema operativo durante los checkpoints.
  • Podemos tener problemas con algunas operaciones que requieren un checkpoint completo, como cambiar el estado o el modelo de recuperación de la base de datos.

¿Cómo cambiar el Target Recovery Time y el Recovery Interval?

Como vemos, no hay una respuesta única sobre si debemos usar o no el Target Recovery Time y el Indirect Checkpoint. Depende de cada caso, de las características de nuestras bases de datos, de nuestros requisitos de rendimiento y disponibilidad, y de los recursos que tengamos disponibles. Lo que sí podemos hacer es probar y medir el efecto que tiene esta configuración en nuestros entornos, y tomar una decisión informada.

Para cambiar el valor del Target Recovery Time de una base de datos, podemos usar el siguiente comando:

También podemos cambiarlo desde el Management Studio, en las propiedades de la base de datos, en la sección Options. Además del Target Recovery Time, también podemos cambiar el Recovery Interval de las instancias SQL Server, que es el valor global que se usa cuando el Target Recovery Time es 0.

Conclusión

Como hemos visto, podemos usar Recovery Interval y Target Recovery Time para tener mayor control sobre los checkpoints de nuestras bases de datos SQL Server. Con esto no solo conseguimos optimizar el uso de disco duro al reducir los requerimientos de E/S sino que además, controlamos el tiempo de recuperación tras un fallo del sistema. Recuerda siempre hacer las pruebas en un entorno dedicado antes de aplicar en producción. Y como siempre digo, si no es para resolver un problema, piensa si realmente merece la pena el riesgo.

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, 0 comentarios

Checkpoints en SQL Server

Si recordáis, en el pasado artículo sobre la recuperación acelerada de base de datos hablamos de los Checkpoints. Como no lo habíamos explicado en profundidad y ya que son importantes para entender el comportamiento de nuestro SQL Server, les vamos a dedicar el post de hoy. Entender estos conceptos es clave para poder ajustar correctamente varias de las configuraciones de rendimiento que implementa SQL Server.

¿Qué son los Checkpoints?

Un checkpoint o punto de control de base de datos es, como su nombre indica, un punto conocido correcto sobre el que SQL Server aplicará los cambios del log durante la recuperación ante un error. 

Cuando ejecutamos una transacción de escritura (INSERT, UPDATE o DELETE), esta empezará a modificar datos pero, mientras no se confirme los cambios no serán definitivos. Esta es la teoría pero, la realidad difiere un poco. Por motivos de rendimiento, SQL Server carga las páginas de disco en memoria, escribe las modificaciones en las páginas en memoria y cada cierto tiempo, vuelca esas páginas modificadas en memoria (llamadas páginas desfasadas) al disco y al el log de transacciones. Esto es lo que llamamos checkpoint.

Tipos de Checkpoints

SQL Server tiene varios tipos de checkpoints en función de cómo y cuándo se ejecutan. Para entenderlo tenemos que conocer las opciones de configuración target recovery time de base de datos y la opción de instancia recovery interval de las que hablaremos más adelante.

Checkpoints Automáticos

Cuando la opción target recovery time de una base de datos está establecida en 0 se producirán checkpoints automáticos en segundo plano. Habrá un checkpoint cada vez que se alcance el número de páginas que SQL calcula que puede procesar en el tiempo establecido en la opción recovery interval (si está en 0 el tiempo será de 1 minuto).

El tiempo entre checkpoints puede variar en función del uso de las bases de datos, siendo mayor cuantas más transacciones de escritura se procesen. 

Si nuestras bases de datos están en modo simple, cuando el log de transacciones se llene al 70% de su tamaño máximo se detendrá el proceso de checkpoints. Sin embargo, a no ser que el log no se vacíe por algún otro motivo (replicaciones pendientes por ejemplo) el checkpoint automático truncará el log. 

Cuando ocurre un problema y SQL se detiene bruscamente, el tiempo de recuperación de nuestras bases de datos dependerá de la capacidad de E/S de nuestros discos para rehacer las páginas desfasadas al momento del bloqueo. La opción recovery interval tampoco afecta al tiempo para deshacer una transacción de larga duración. Esto hace que no se pueda calcular previamente el tiempo de inactividad en estos casos.

Checkpoints Indirectos

Con la llegada de SQL 2012 se presentaron los checkpoints indirectos gracias a la configuración de base de datos target recovery time. En un principio establecida a 0 por defecto hasta SQL 2016, donde se establece en 60 segundos por defecto para todas las nuevas bases de datos (las creadas previamente o restauradas de una versión anterior permanecerán en 0 por defecto). Esta configuración cambia el paradigma y, con ella, pasamos de contar el número de transacciones como pasaba con los checkpoints automáticos a contar el número de páginas desfasadas para calcular el tiempo de recuperación.

Con los checkpoint indirectos habilitados cualquier operación DML en la base de datos puede provocar un checkpoint en segundo plano para que el tiempo de recuperación se mantenga dentro de los límites establecidos. Esto que parece una buena opción puede no serlo tanto en entornos con muchas transacciones donde el incremento de E/S puede generarnos un cuello de botella en los discos duros. Por otro lado, reducir el tiempo de recuperación y por tanto aumentar la frecuencia de los checkpoints puede reducir los picos de consumo de E/S.

Gracias a estos puntos de control indirectos logramos un mayor control sobre los tiempos de recuperación de las bases de datos, siempre y cuando una transacción prolongada no provoque un tiempo de rollback elevado.

Checkpoint Manual

Estos son los checkpoints que podemos invocar nosotros mismos mediante la ejecución del comando CHECKPOINT situados en una base de datos en concreto. 

Checkpoints Internos

Los checkpoints internos se provocan porque una operación de SQL Server lo necesita. Entre estas operaciones que provocan un checkpoint interno podemos encontrar:

  • Modificar los archivos de base de datos mediante ALTER DATABASE.
  • Copias de seguridad.
  • Instantáneas de base de datos.
  • Parada de la base de datos automática porque Auto_Close está habilitado o porque un cambio de configuración requiere reiniciarla.
  • Paradas del servicio de SQL Server

Conclusión

Como hemos visto, los checkpoints son clave para el rendimiento de nuestro servidor. Tenemos que tener claro qué tipos de checkpoint están haciendo nuestras bases de datos y probar distintas configuraciones para lograr el menor consumo de E/S y optimizar al máximo el rendimiento de nuestro servidor. Sin embargo, se trata de una configuración crítica, si tienes un servidor de pruebas te aconsejo empezar a cambiar en él y siempre modificando los valores de pocos en pocos segundos. 

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, 2 comentarios