Instalar cliente sql server (sqlcmd) en ubuntu 24.04

He intentado instalar el cliente sql server (sqlcmd) en ubuntu 24.04 y segun la documentación oficial de microsoft https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools solo hay hasta la version de Ubuntu 22.04.

Pero investigando he conseguido instalarlo y solo tienes que seguir estos pasos.

Importamos las GPG keys publicas.

curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc

Registramos el repositorio publico para ubuntu 24.04.

curl https://packages.microsoft.com/config/ubuntu/24.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list

Actualizamos los repositorios e instalamos los herramientas de sql server.

sudo apt-get update
sudo apt-get install mssql-tools18 unixodbc-dev

Y ya podemos realizar la conexión de prueba

/opt/mssql-tools18/bin/sqlcmd -S <endpoint_rds>,<puerto> -d <nombre_base_de_datos> -U <usuario> -P <contraseña> -C -l 30

Parece ser que en la versión de ubunbtu 24.04.01 LTS aparece el siguiente error “ERROR: Failed to fetch https://packages.microsoft.com/repos/code/dists/stable/InRelease Bad header.” para solucionarlos solo tendriamos que limpiar y actualizar los repositorios con el siguiente comando.

sudo rm -rf /var/lib/apt/lists/* && sudo apt-get update

Reconstruir y optimizar indices fragmentados en SQL Server

Es muy común en SQL server que si una tabla tiene muchos cambios de estado, inserciones, borrados, etc, los indices queden fragmentados y las consultas a base de datos sean cada vez mas pesadas.

Pues con esta pequeña entrada voy a explicar como consultar el porcentaje de fragmentación de las tablas y como reconstruirlas y optimizarlas.

Lo primero que haremos es lanzar esta query que nos dirá el porcentaje de fragmentacion de las tablas.

SELECT 
dbtables.[name] as 'Table',
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID() 
ORDER BY indexstats.avg_fragmentation_in_percent desc
Porcentaje de fragmentación de cada tabla

Una vez visto que los porcentajes de fragmentación son altisimos, lanzamos esta query que reconstruye todos los indices de las tablas.

DECLARE @TableName VARCHAR(255)
DECLARE @sql NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 80 
DECLARE TableCursor CURSOR FOR
SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))+'.' + QUOTENAME(name) AS TableName
FROM sys.tables
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@sql)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
GO
Porcentajes de fragmentación con indices de las tablas reconstruidas

Lanzamos estas querys periódicamente conseguiremos mantener las bases de datos en un estado optimo.

Rotar y eliminar log de error en SQL Server

En alguna ocasión en nuestro Windows Server el SQL Server se ha generado un registro de error de varios gigas y nos ha comprometido la estabilidad del servidor.

Y resulta que nos es imposible borrarlo debido a que el fichero se encuentra en uso.

Con esta entrada voy a explicar como rotar para poder borrarlo y liberar espacio en disco.

Logueamos como u Administrador (sa) con el Microsoft SQL Server Management Studio u otra herramienta para ejecutar consultas en el servidor (no sólo sobre una base de datos).

Y ejecutamos la siguiente consulta para forzar el registro del log de error.

EXEC sp_cycle_errorlog;

Y ya podríamos borrar el pesado ERRORLOG y liberar espacio en la maquina.

Cómo mover base de datos temporal ‘TempDB’ a una nueva unidad en SQL Server

En ocasiones el espacio en disco es limitado y se nos llenan las unidades y puede ocasionar una parada de servicio.

Con esta entrada voy a explicar como mover base de datos temporal ‘TempDB‘ a una nueva unidad en SQL Server realizando los siguientes pasos.

Identificamos la ubicación de los datos y archivos de registro de la base de datos temporal TempDB.

SELECT 
name AS [LogicalName]
,physical_name AS [Location]
,state_desc AS [Status]
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');

Cambiamos la ubicación de los archivos de registro y datos de TempDB mediante ALTER DATABASE.

ALTER DATABASE tempdb 
MODIFY FILE (NAME = tempdev, FILENAME = 'T:\MSSQL\DATA\tempdb.mdf');

ALTER DATABASE tempdb 
MODIFY FILE (NAME = templog, FILENAME = 'T:\MSSQL\DATA\templog.ldf');

Detenemos y reiniciamos el servicio de SQL Server (desde el cmd)

net stop mssqlserver

net start mssqlserver

Verificamos el cambio de la ubicación de los ficheros.

SELECT 
name AS [LogicalName]
,physical_name AS [Location]
,state_desc AS [Status]
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');

Y por ultimo eliminamos los archivos antiguos tempdb.mdf y templog.ldf.