SQL Server

Arreglar CORRUPCIÓN en Base de datos SQL

¿Alguna vez te has encontrado con una base de datos de SQL Server corrupta? En ocasiones podemos encontrar errores de corrupción en bases de datos que se han estropeado debido a un apagado en mitad de una transacción que no ha podido revertirse o a algún otro error de sistema. Cuando esto pasa lo normal es realizar una reparación de la base de datos que elimina los registros erróneos solucionando así el problema. Esto, sin embargo, no parece la mejor de las soluciones y por eso, hoy os traigo una forma de recuperar solo las páginas dañadas desde un backup.


Es importante destacar que esta solución a la corrupción de bases de datos solo la podremos tomar si tenemos un modo de recuperación distinto al simple pues requiere de hacer y restaurar backups de logs. Si este es tu caso estás de suerte.

Paso a paso para recuperar la corrupción

Lo primero que debes hacer es localizar las páginas dañadas haciendo un DBCC CHECKDB, después haz un backup log para salvar todos los cambios al momento actual. Cuando hayas completado el backup log podrás restaurar solo las páginas afectadas del último backup full y hacer otro backup log. En este paso solo te queda restaurar los backup log hasta justo antes de restaurar el backup FULL. Por último restaura el de exactamente después poniendo ya la base de datos online (WITH RECOVERY). De esta manera habrás conseguido salvar la información y solventar el error sin pérdida de datos.

Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. 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 Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, Videos, 0 comentarios

ROWGUIDCOL

Hoy os vengo a hablar de una característica de SQL Server y las bases de datos de SQL en Azure que normalmente no se usa pero que es muy importante. La opción ROWGUIDCOL cuando estamos definiendo el tipo de datos de nuestras tablas. 

ATENCIÓN este artículo es de nivel avanzado, no sufras si no entiendes nada ahora mismo. Te recomiendo investigar sobre los nuevos conceptos que te encuentres y no sepas de que van. Yo voy a intentar enlazarte con anteriores artículos relacionados o documentación extra siempre que sea posible.

¿Qué es ROWGUIDCOL y por qué es importante?

ROWGUIDCOL es una propiedad que vamos a poner a nuestras columnas GUID (identificadores globales). Aunque se puede poner en columnas con otros tipos de datos lo normal es usarlo en campos de tipo Uniqueidentifier. Es especialmente útil en entornos con distintas bases de datos pues nos va a permitir que la clave sea única entre todas las bases de datos.

NEWSECUENTIALID

Si además acompañamos la propiedad ROWGUIDCOL con un valor por defecto NEWSECUENTIALID() en lugar del tradicional NEWID() vamos a conseguir un mejor resultado. La diferencia entre estas dos funciones es que mientras NEWID genera un GUID aleatorio NEWSECUENTIALID va a generar un GUID mayor que cualquier otro generado desde el último reinicio del servidor. También está preparado para trabajar correctamente en entornos de clúster por lo que si tienes un balanceo en tu AlwaysOn va a tener en cuenta los valores generados anteriormente en el otro nodo. 

NEWSECUENTIALID es mejor en términos de rendimiento ya que no tiene que generar la aleatoriedad de NEWID y, por tanto, consume menos recursos de páginas en la caché. Además usar NEWSECUENTIALID nos va a ayudar a llenar completamente las páginas de datos e índices y a permitir un FILLFACTOR del 100%. Por contra, el hecho de generar identificadores globales mayores puede ser un riesgo de seguridad. Si la privacidad es clave en tus sistemas seguramente prefieras un GUID totalmente aleatorio y que no se pueda estimar cual es el próximo valor. 

Usos Prácticos de ROWGUIDCOL

Como ya hemos visto, la propiedad ROWGUIDCOL puede sernos útil en escenarios donde necesitamos una clave primaria que sea única en todas las bases de datos, no sólo en una base de datos individual. Por ejemplo, estamos desarrollando una aplicación que necesita sincronizar datos entre varias bases de datos, usaremos ROWGUIDCOL para asegurar que cada fila tiene un identificador único en todas las bases de datos.

ROWGUIDCOL en la replicación

Además de lo que ya hemos visto, ROWGUIDCOL  es extremadamente útil en escenarios de replicación. En la replicación, a menudo es necesario tener una forma de identificar de manera única cada fila en una tabla. ROWGUIDCOL proporciona una forma fácil de hacer esto sin tener que generar manualmente valores únicos.

Si tenemos una replicación de mezcla (Merge Replication) SQL Server usará el campo marcado como ROWGUIDCOL para identificar las filas. Esto puede sernos un inconveniente ya que no podremos luego usar nosotros ese campo para filtros en la replicación. También es importante que sepas que si configuras una replicación de mezcla sobre una tabla con una columna ROWGUIDCOL SQL asignará automáticamente el valor de NEWSECUENTIALID() como por defecto para esta columna.

Conclusión

El tema de los identificadores únicos para nuestros datos da mucho juego, hoy hemos profundizado en uno de sus aspectos más complejos en SQL Server pero siempre se puede ir un poco más allá. Si te has quedado con ganas de más te recomiendo este artículo del blog de Microsoft en el que se explica cómo se ordenan estos uniqueidentifier hexadecimales. 

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 Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, SQL Server, 0 comentarios

FizzBuzz (T-SQL Reto). Típico en entrevistas de trabajo

Hoy me he encontrado en LinkedIn con una cosa que me ha llamado la atención, Antonio Jurado había publicado un post en el blog mundo-datos respondiendo a un video de Nacho Cardenal. Este último habría publicado hace unos días la resolución al reto de FizzBuzz en Excel. En los comentarios de su publicación original en LinkedIn, Juan José Luna proponía la solución al reto en Access. A esto se sumó Toni (en la publicación que yo vi) resolviendo el reto en DAX. Así que, no vamos a ser nosotros menos y vamos a resolverlo en SQL, ¿no?

El reto FizzBuzz

El reto FizzBuzz es un sencillo desafío de programación que se emplea en las entrevistas de trabajo técnicas para que el evaluador vea la capacidad de escribir código del candidato. 

Como digo, el reto es sencillo, debes codificar un algoritmo que, con los números del 1 al 100 devuelva la cadena “Fizz” si el número es múltiplo de 3, “Buzz” si es múltiplo de 5 o “FizzBuzz” si es múltiplo de 3 y de 5. 

Esto es lo que buscamos:

FizzBuzz-Resultado

FizzBuzz con T-SQL

Esto es sencillo, tenemos que crear una tabla con los números del 1 al 100 y una columna resultado que será FizzBuzz, Fizz, Buzz o el propio número. Vamos a ello.

Paso 1: Crear la tabla FizzBuzz

El primer paso es crear la tabla FizzBuzz, para ello vamos a comprobar primero si existe y en ese caso la borramos y creamos una nueva. Necesitamos un campo numérico que admita los valores del 1 al 100, con un tinyint nos vale, no vamos a usar más de lo necesario. Para el resultado tendremos que almacenar cadenas de texto pero, no siempre van a tener la misma longitud, podrán ser de 1 a 8 caracteres así que usaremos un varchar(8).

FizzBuzz-1

Paso 2: Cargar la secuencia de números

Con la tabla ya creada vamos a empezar a cargar los datos, lo primero será cargar los números que luego vamos a evaluar. Para ello empezamos con la sintaxis INSERT INTO ya que la tabla existe de antes. A este insert le vamos a pasar el resultado de una función de tabla que se ha introducido nueva en SQL Server 2022, GENERATE_SERIES. Esta función tendrá como primer parámetro el primer número de nuestra cadena, como segundo el último y, opcionalmente, como tercero el número en el que se va a incrementar el contador. Como este tercer parámetro es opcional y si no ponemos nada va de uno en uno lo vamos a omitir.

FizzBuzz-2

Paso 3: Algoritmo FizzBuzz

Llegó el momento de la verdad, hasta ahora solo habíamos preparado el escenario. Tenemos que actualizar nuestra tabla para poner los valores Fizz, Buzz o FizzBuzz cuando sea necesario. Lo primero que tendremos que saber es que en SQL Server podemos usar el operador % para devolver el resto de una división, por lo que si este es igual a 0 será que el número es múltiplo del dividendo que estemos comparando. Una vez tenemos eso resulto nos encontramos con el siguiente reto, para hacerlo de una sola vez tendremos que usar la sintaxis de UPDATE con un CASE dentro de la cláusula SET

Hacer correctamente el case será nuestro tercer desafío, como sabéis, esta operación evalúa las condiciones en orden y si la primera de ellas se cumple ya no va a pasar por las siguientes. Esto hace que si o si tengamos que empezar por el caso de que un número sea múltiplo de 3 y de 5. A continuación ya podremos evaluar que sea múltiplo de 3 o de 5 en orden indistinto. Para terminar tenemos que devolver el mismo valor si no se ha cumplido con ninguna de las tres condiciones anteriores lo que nos puede dar más de un quebradero de cabeza si no estamos atentos. El tipo de datos del valor que estamos evaluando (el número) no se puede insertar en un campo de texto, antes tendremos que convertirlo o nos encontraremos con un error en la ejecución.

FizzBuzz-3

Paso 4: Mostrar los resultados

Ya hemos hecho lo difícil, ahora solo nos queda mostrar los resultados de nuestro trabajo.

FizzBuzz-4

Código de FizzBuzz

Ahora que ya hemos resuelto el desafío te dejo el código completo que he utilizado para que lo puedas copiar, editar e investigar tu mismo otras variaciones.

Conclusión

Así, de una manera sencilla y eficiente hemos resuelto el reto FizzBuzz en T-SQL, espero que te haya servido para aprender aunque sea alguna sintaxis que no conocías. ¿Se te ocurre otra solución posible? ¿Te apetece que hagamos más desafíos de este tipo? Pónmelo en comentarios y lo tendré muy en cuenta.

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 Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 2 comentarios

Reducir el tamaño de bases de datos SQL

En esta ocasión vengo a explicaros como puedes hacer para reducir el espacio que ocupan nuestras bases de datos liberando el espacio libre que hay en los ficheros. Para ello, tendremos que hacer un Shrink de los ficheros de base de datos. Tendrás que hacerlo tanto en el ficheros de datos como en el de log (o en el que sepamos que existe un problema).

Evita siempre que puedas la operación de reducir de ficheros, sobre todo en los ficheros de datos, ya que consume muchos recursos del servidor y además va a empeorar el rendimiento de nuestra base de datos. Si no queda más remedio o si has eliminado tanta información que merezca la pena hacerlo, ten la precaución de programarlo fuera de horas de trabajo y de reconstruir los índices fragmentados una vez termines.

En los ficheros de log, como en los de TempDB no vas a tener los problemas de fragmentación pero si de consumo de recursos por lo que aunque no tengamos que ser tan estrictos si debemos intervenir con la debida precaución.

Puedes encontrar los script que he usado en el video aquí. Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. 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 Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, SQL Server, Videos, 0 comentarios

Detectando BLOQUEOS en SQL Server y Azure SQL

Cuando trabajamos con bases de datos SQL Server, los bloqueos pueden ser una de las características de implementación que más dolores de cabeza nos pueden dar como DBAs. A los usuarios también, por supuesto, pero ellos trasladarán sus quejas a nosotros.

Por esto, en el vídeo de hoy, te enseño a detectar bloqueos en SQL Server o Azure SQL. Gracias a procedimientos integrados de sistema como sp_who o sp_who2 podremos verlo de una forma muy básica. Si queremos más nivel de detalle podremos recurrir a procedimientos de terceros como sp_who3, sp_whoisactive o sp_BlitzWho.

Si queremos detectar un bloqueo de una forma rápida y ligera, los procedimientos de sistema sp_who y sp_who2 son un gran aliado. Sin embargo, la información que nos van a mostrar es más bien justa. Si tenemos ocasión, siempre será recomendable de recurrir a procedimientos más completos como los citados en el vídeo.

También podremos hacer uso del siguiente script que nos muestra los procesos con bloqueos:

Como ves, el script hace uso de las vistas de administración dinámica de sistema sys.dm_exec_request y sys.sysprocesses para localizar los bloqueos. Además de la función sys.dm_exec_sql_text para devolver el texto de la consulta que está ejecutando esa sesión. En determinadas ocasiones, dependiendo del bloqueo, es posible que este script no resuelva debido a la función. En esos casos comenta esa parte del código para por lo menos localizar los bloqueos.

Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. 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 Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, Rendimiento, SQL Server, Videos, 0 comentarios

Remote Dedicated Admin Conection (R DAC). Vas a querer habilitarlo en tus SQL Server.

¿Sabías que SQL Server implementa un sistema de conexiones de emergencia para cuando todo lo demás falla? Se llama DAC (Dedicated Admin Connection) y es una las puertas traseras que todo DBA tiene que habilitar en sus servidores SQL para poder acceder cuando el servidor está tan saturado que no responde. Más bien podríamos considerarlo una entrada de emergencia, si es que el término existe.

¿Qué es DAC y cómo funciona?

Como hemos comentado en la introducción DAC es una conexión dedicada para administradores que nos va a permitir acceder a nuestro servidor SQL Server aun cuando los problemas de rendimiento sean tan graves que nada más responda. Cuando habilitamos DAC y abrimos una conexión de esta manera, lo que realmente estamos haciendo es decirle a SQL Server que se reserve un hilo de proceso para nosotros, sea lo que sea que esté corriendo en otros procesos. Como habrás intuido, tiene un problema, no paraleliza, el hecho de reservar un único hilo de procesos va a hacer que si una consulta necesita paralelizar de error. Aun así, con un hilo de proceso va a ser suficiente para localizar la consulta o consultas que están saturando el servidor y poder detenerlas.

¿Tipos de DAC?

Antes de nada, DAC es un acrónimo común, en este artículo siempre nos referimos a las Dedicated Admin Connection. SQL Server también implementa una cosa llamada Aplicaciones de Capa de Datos que llama DAC Package pero no estamos hablando de eso, no tiene nada que ver con esto.

Ahora que tenemos esto claro, tenemos dos tipos de conexiones dedicadas para administradores y son en local o remotas. Cuando hablamos de conexiones DAC remotas vamos a verlo como RDAC o Remote Dedicated Admin Connection. DAC siempre está habilitado en SQL Server y no lo podemos deshabilitar, sin embargo, RDAC por defecto no lo está y tendremos que habilitarlo nosotros manualmente.

¿Por qué necesitas habilitar RDAC?

Como hemos visto, RDAC es lo mismo que DAC solo que de forma remota. Si podemos entrar al servidor de manera local y conectar por DAC, ¿por qué deberíamos habilitar RDAC? Muy fácil, estamos hablando de una puerta trasera para emergencias, casos en los que el servidor va a estar tan saturado que es posible que ni podamos conectar de manera local por terminal server. En esta situación, tener un endpoint a la escucha de manera remota que siempre está habilitado para acceder por muy mal que esté el servidor puede ser la diferencia entre tener que reiniciar el servidor o no. Y nunca querremos tener que llegar a reiniciar el servidor, ¿verdad?

Habilitar Remote DAC

A nivel de instancia, habilitar RDAC es tan sencillo como ejecutar el siguiente comando de configuración:

Sin embargo, depende de la seguridad de tu red es probable que tengas que hablar con el administrador de redes para que te permita estas conexiones. Como hemos comentado antes por encima, Remote DAC usa un endpoint específico, lo que significa que no está a la escucha por el mismo puerto que las conexiones normales. Normalmente usará el puerto 1434 en vez del 1433. Asegúrate que el administrador de red te permite esas conexiones en el firewall antes de que tengas que echar mano de ellas y no vayas a poder.

Limitaciones de DAC

Tanto DAC como RDAC tienen las mismas limitaciones, y es normal, en el fondo son el mismo tipo de conexión. Esta limitación básica es que solo reserva un hilo de procesamiento por lo que solo vamos a poder tener una conexión abierta y ejecutar consultas sin paralelismo. Puedes pensar que es un gran hándicap pero, te aseguro que no. DAC no está pensado para trabajar normalmente ni para ejecutar planes de mantenimiento ni nada parecido. Solo es un método de acceso de emergencia para casos puntuales y, en esos casos, aun con esta limitación, es más que suficiente.

Por último, otra limitación es que solo van a poder usar este tipo de conexiones los usuarios sysadmin. Es lógico también, otro tipo de usuarios, aunque pudiesen acceder, no iban a poder solucionar la incidencia.

¿Cómo conectar usando DAC?

Ya sabemos casi todo lo necesario sobre DAC y por qué lo necesitamos, ahora bien, nos falta lo más importante, ¿cómo se usa?. Primero de todo dejame decirte que ojalá tengas la suerte de no necesitarlo nunca pero, como esto no es un mundo de fantasía, vamos a ver cómo vamos a tener que conectarnos. En este sentido tanto para conexiones en local (DAC) como para remotas (RDAC) es exactamente igual. En principio esta solución está pensada para conectarse desde una ventana de comandos con SQLCMD y para ello en la cadena de conexión usaremos el modificador -A. Sin embargo, tenemos la posibilidad de conectar también desde el SSMS con el prefijo “Admin:” antes del nombre del servidor.

El uso de SSMS tiene sus pegas, por un lado, aunque no es una limitación real, queda prácticamente limitado a conexiones RDAC ya que con el servidor completamente saturado rara vez vamos a poder ejecutar SSMS en local en un tiempo razonable. La segunda pega del uso de SSMS tiene que ver con el límite de sólo una conexión DAC simultánea y es que, SSMS, en concreto el explorador de objetos, ya consume más de una conexión. Por este motivo, su uso queda limitado a una conexión de una ventana de consultas exclusivamente.

DAC

Para conectar por una ventana de comandos usaremos los siguientes comandos:

Local (DAC):

Remoto (RDAC):

Es importante tanto el modificador -A para usar la conexión DAC como el “-d master” para especificar que conecte a esta base de datos. Esto se debe a que si la base de datos por defecto del usuario está offline la conexión va a fallar. De esta manera nos aseguramos que conectemos a la master y nos evitamos ese problema.

Conclusión

Gracias a las conexiones dedicadas para administradores DAC y RDAC vamos a poder garantizarnos un acceso de emergencia a nuestros servidores en caso de que todo lo demás esté fallando. Dedica unos minutos a habilitar RDAC en tus servidores y a validar su funcionamiento, así como, a familiarizarte con su uso por SQLCMD. No esperes a tener un problema para probar porque, en ese caso, es probable que el estrés del momento te juegue una mala pasada.

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 Telegram y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 0 comentarios

SQL AVANZADO – Agrupaciones con Cube y Rollup

Continuamos con los videos de T-SQL avanzado con los modificadores WITH CUBE y WITH ROLLUP. Estos son modificadores de la cláusula GROUP BY. Gracias a WITH CUBE vamos a poder totalizar nuestras agrupaciones junto a los resultados de nuestras consultas y con WITH ROLLUP podremos ver solo totales agrupados por varios campos.

Al igual que comentamos en nuestro anterior video de T_SQL Avanzado el uso de este tipo de consultas en vistas que luego se consumirán desde Power BI nos va a evitar caer en el error de romper el plegado de consultas. También vamos a conseguir con una sola consulta los resultados que, de otra manera, necesitaríamos por lo menos dos consultas, con el doble de lecturas sobre los datos y, por tanto, con mayor consumo de recursos.

Banner-Telegram

Espero que te haya gustado el video, si es así por favor, deja tu me gusta y suscríbete al canal que nos ayuda mucho. 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 Telegram al que te puede unir. En este grupo estamos creando una comunidad de usuarios y administradores de SQL Server donde cualquiera pueda preguntar sus dudas y compartir sus casos prácticos para que todos seamos mejores profesionales. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Cloud, Rendimiento, SQL Server, Videos, 0 comentarios