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.

Como solucionar error: The root filesystem requires a manual fsck

Es posible que tras un reinicio en nuestro linux nos encontramos el error “The root filesystem requires a manual fsck” y no podemos arrancar nuestro sistema operativo, pues que no cunda el pánico que todo tiene solución.

Error fatídico

Solo necesitamos o desde la propia consola del initramfs o desde un livecd ejecutar el comando fsck (check and repair a Linux file system) sobre la partición fatídica.

fsck /dev/sdaParticionFallida

Contestaremos que si (yes) a todas las preguntas planteadas y ya tendremos recuperado nuestro sistema operativo linux.

fsck /dev/ubuntu–vg-ubuntu–lv

¿Como matar varios procesos a la vez en linux?

Posiblemente os ha sucedido en multitud de ocasiones, que intentáis matar un proceso en linux y os encontráis que aparece varias veces.

Y es bastante molesto ir uno a uno con kill -9 matandolos.

Pues con esta entrada os voy a explicar de matarlos todos con un simple comando.

En el ejemplo que voy a utilizar el escritorio se ha quedado tostado y quiero matar todos los procesos del navegador chromiun y para ello haré una búsqueda del proceso con ps + grep .

root@ubuntu:/# ps -aux | grep chrom |

root      2203 17.4  2.5 2633452 207796 ?      Sl   10:34   0:02 /snap/chromium/1967/usr/lib/chromium-browser/chrome --password-store=basic
root      2383  0.2  0.7 260184 58056 ?        S    10:34   0:00 /snap/chromium/1967/usr/lib/chromium-browser/chrome --type=zygote --no-zygote-sandbox --change-stack-guard-on-fork=enable
root            2384  0.1  0.7 260176 58252 ?        S    10:34   0:00 /snap/chromium/1967/usr/lib/chromium-browser/chrome --type=zygote --change-stack-guard-on-fork=enable
root      2386  0.0  0.1 260200 15344 ?        S    10:34   0:00 /snap/chromium/1967/usr/lib/chromium-browser/chrome --type=zygote --change-stack-guard-on-fork=enable
root      2559  0.0  0.3 483756 25968 ?        S    10:34   0:00 /snap/chromium/1967/usr/lib/chromium-browser/chrome --type=broker

A continuación con awk ‘{print $2}’ obtenemos el id de cada proceso.

root@ubuntu:/# ps -aux | grep chrom | awk '{print $2}'
864
2203
2383
2384
2386
2416
2420
2437
2458
2459
2559
2574
2651

Teniendo el listado de procesos solo nos queda matarlos todos a la vez y lo haremos con xargs kill -9

ps -aux | grep chrom | awk '{print $2}' | xargs kill -9

Y con este sencillo comando, podemos matar varios procesos a la vez en linux.

Desbloquear ficheros masivamente (y recursivamente) en windows

En alguna ocasion nos hemos podido encontrar que se nos han bloqueado los ficheros en un directorio y en sus directorios recursivos.

Volver a desbloquearlos puede ser una tarea bastante tediosa.

Desbloquear archivos descargados de Internet en Windows 8.1. - Microsoft  Community
Fichero desbloqueado manualmente.

Pero con este sencillo comando powershell, puedes desbloquear ficheros masiva y recursivamente desde un directorio origen.

Get-ChildItem -Path 'rota_origen' -Recurse | Unblock-File

No arranca xampp error: Port 80 in use by “Unable to open process” with PID 4!

El otro dia me sucedio una cosa extraña y era que no me arrancaba el apache en el XAMPP, al parecer habia el PID4 estaba utilizando el puerto 80.

En el al adminsitrador de tareas y observe que el PID4 pertenecia al sistema, con lo que no se trataba de una aplicación en concreto.

Investigando me encuentro con que hay un servicio llamado BranchCache que es el que esta utilizando el puerto 80, con lo que para solucionarlo, solo he tenido que parar y deshabilitar el servicio con los siguientes pasos.

Buscador de  Windows > Servicios > Click botón derecho > Ejecutar como administrador

 Click botón derecho BranchCache > Propiedades > Tipo de inicio > Deshabilitado

Con estos pasos ya solucione el error y pude arrancar el apache del XAMPP.

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.

Solucionar erorr mysql8: Your password does not satisfy the current policy requirements.

Es posible que intentando poner una contraseña en mysql8 os haya saltado el error “Your password does not satisfy the current policy requirements.” o directamente en castellano “Su contraseña no cumple con los requisitos de la política actual.”, que claramente indica que la contraseña no cumple las politicas de seguridad.

No siendo lo recomendable se puede dar el caso que queramos poner una contraseña insegura y os lo voy a explicar a hacer a continuación.

Nos conectamos en la consola de mysql8 y deshabilitamos la politica de seguridad.

SET GLOBAL validate_password.policy = 0;

Y despues de lanzar esta instrucción ya podemos poner nuestra contraseña insegura.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'T3mporal';

Si queremos volver a dejar la configuración como estaba bastara con habilitar la politica de seguridad.

SET GLOBAL validate_password.policy = 0;

¿Como recuperar espacio en ficheros ya eliminados?

En varias ocaciones nos hemos visto en la situación de que hemos borrado ciertos ficheros en linux y no se ha liberado el espacio y lo que es peor es que vemos valores diferentes al calcuar el espacio con df y ls

Voy a explicar como hacerlo de una manera muy sencilla.

Comprobamos que no se este usando el fichero y se puede liberar el espacio.

lsof | grep deleted
postdrop   9155                 root    4u      REG                8,2         0     114958 /var/spool/postfix/maildrop/AC9221C10E (deleted)
postdrop   9927                 root    4u      REG                8,2         0     118127 /var/spool/postfix/maildrop/E9A721CD6F (deleted)
postdrop  11171                 root    4u      REG                8,2         0     118540 /var/spool/postfix/maildrop/8F4D31CF0C (deleted)

[root@base]# ls -lh /proc/9155/fd/*
lrwx------ 1 root root 64 Jun 20  2021 /proc/9155/fd/4 -> /var/spool/postfix/maildrop/AC9221C10E (deleted)

Con los resultados obtenidos, ejecutamos el comando con el id que deseemos borrar

: > /proc/9155/fd/4

Y con estos pasos ya habremos liberado el espacio.

Guardar una cadena de varias lineas en un archivo en bash con EOF

Seguramente nos ha pasado en alguna ocasión que tenemos que copiar y pegar texto en linux y no sabemos como guardarlo en un fichero nuevo del tiron.

Para este cometido podemos utilizar EOF, que nos permite guardar todo el contenido que vayamos pegando por pantalla encosertado entre las cadenas EOF.
A continuación pongo un ejemplo de como pegando por pantalla las siguientes lineas creamos un scrips que una vez ejecutado nos indica la fecha (date) y el espacio libre en disco (df -h).
cat <<EOF > fecha-espacio.sh
#!/bin/bash
date
df -h
EOF
/bin/bash/ print.sh
Wed Nov 10 10:23:55 CET 2021
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             2.0G 1002M  887M  54% /